Compare commits

..

1 Commits

Author SHA1 Message Date
Evgeny Poberezkin
0366afbcce rfc: user per-service per-device identities 2023-07-02 14:03:55 +01:00
844 changed files with 15800 additions and 52223 deletions

View File

@@ -52,19 +52,15 @@ jobs:
- os: ubuntu-20.04
cache_path: ~/.cabal/store
asset_name: simplex-chat-ubuntu-20_04-x86-64
desktop_asset_name: simplex-desktop-ubuntu-20_04-x86_64.deb
- os: ubuntu-22.04
cache_path: ~/.cabal/store
asset_name: simplex-chat-ubuntu-22_04-x86-64
desktop_asset_name: simplex-desktop-ubuntu-22_04-x86_64.deb
- os: macos-latest
cache_path: ~/.cabal/store
asset_name: simplex-chat-macos-x86-64
desktop_asset_name: simplex-desktop-macos-x86_64.dmg
- os: windows-latest
cache_path: C:/cabal
asset_name: simplex-chat-windows-x86-64
desktop_asset_name: simplex-desktop-windows-x86_64.msi
steps:
- name: Configure pagefile (Windows)
if: matrix.os == 'windows-latest'
@@ -103,10 +99,6 @@ jobs:
echo " extra-lib-dirs: /usr/local/opt/openssl@1.1/lib" >> cabal.project.local
echo " flags: +openssl" >> cabal.project.local
- name: Install AppImage dependencies
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04'
run: sudo apt install -y desktop-file-utils
- name: Install pkg-config for Mac
if: matrix.os == 'macos-latest'
run: brew install pkg-config
@@ -119,86 +111,23 @@ jobs:
echo "package direct-sqlcipher" >> cabal.project.local
echo " flags: +openssl" >> cabal.project.local
- name: Unix build CLI
id: unix_cli_build
- name: Unix build
id: unix_build
if: matrix.os != 'windows-latest'
shell: bash
run: |
cabal build --enable-tests
echo "::set-output name=bin_path::$(cabal list-bin simplex-chat)"
- name: Unix upload CLI binary to release
- name: Unix upload binary to release
if: startsWith(github.ref, 'refs/tags/v') && matrix.os != 'windows-latest'
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.unix_cli_build.outputs.bin_path }}
file: ${{ steps.unix_build.outputs.bin_path }}
asset_name: ${{ matrix.asset_name }}
tag: ${{ github.ref }}
- name: Setup Java
if: startsWith(github.ref, 'refs/tags/v')
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
cache: 'gradle'
- name: Linux build desktop
id: linux_desktop_build
if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04')
shell: bash
run: |
scripts/desktop/build-lib-linux.sh
cd apps/multiplatform
./gradlew packageDeb
echo "::set-output name=package_path::$(echo $PWD/release/main/deb/simplex_*_amd64.deb)"
- name: Linux make AppImage
id: linux_appimage_build
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04'
shell: bash
run: |
scripts/desktop/make-appimage-linux.sh
echo "::set-output name=appimage_path::$(echo $PWD/apps/multiplatform/release/main/*imple*.AppImage)"
- name: Mac build desktop
id: mac_desktop_build
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'macos-latest'
shell: bash
run: |
scripts/desktop/build-lib-mac.sh
cd apps/multiplatform
./gradlew packageDmg
echo "::set-output name=package_path::$(echo $PWD/release/main/dmg/SimpleX-*.dmg)"
- name: Linux upload desktop package to release
if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04')
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.linux_desktop_build.outputs.package_path }}
asset_name: ${{ matrix.desktop_asset_name }}
tag: ${{ github.ref }}
- name: Linux upload AppImage to release
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-22.04'
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.linux_appimage_build.outputs.appimage_path }}
asset_name: simplex-desktop-x86_64.AppImage
tag: ${{ github.ref }}
- name: Mac upload desktop package to release
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'macos-latest'
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.mac_desktop_build.outputs.package_path }}
asset_name: ${{ matrix.desktop_asset_name }}
tag: ${{ github.ref }}
- name: Unix test
if: matrix.os != 'windows-latest'
timeout-minutes: 30

1
.gitignore vendored
View File

@@ -53,7 +53,6 @@ website/src/docs/
website/translations.json
website/src/img/images/
website/src/images/
website/src/js/lottie.min.js
# Generated files
website/package/generated*

View File

@@ -207,8 +207,6 @@ You can use SimpleX with your own servers and still communicate with people usin
Recent updates:
[July 22, 2023. SimpleX Chat: v5.2 released with message delivery receipts](./blog/20230722-simplex-chat-v5-2-message-delivery-receipts.md).
[May 23, 2023. SimpleX Chat: v5.1 released with message reactions and self-destruct passcode](./blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.md).
[Apr 22, 2023. SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb](./blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.md).
@@ -339,8 +337,8 @@ Please also join [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A
- ✅ Message reactions
- ✅ Message editing history
- ✅ Reduced battery and traffic usage in large groups.
- ✅ Message delivery confirmation (with sender opt-out per contact).
- 🏗 Desktop client.
- 🏗 Message delivery confirmation (with sender opt-in or opt-out per contact, TBC).
- SMP queue redundancy and rotation (manual is supported).
- Include optional message into connection request sent via contact address.
- Local app files encryption.

View File

@@ -14,28 +14,9 @@ class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
logger.debug("AppDelegate: didFinishLaunchingWithOptions")
application.registerForRemoteNotifications()
if #available(iOS 17.0, *) { trackKeyboard() }
return true
}
@available(iOS 17.0, *)
private func trackKeyboard() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
@available(iOS 17.0, *)
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
ChatModel.shared.keyboardHeight = keyboardFrame.cgRectValue.height
}
}
@available(iOS 17.0, *)
@objc func keyboardWillHide(_ notification: Notification) {
ChatModel.shared.keyboardHeight = 0
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02hhx", $0) }.joined()
logger.debug("AppDelegate: didRegisterForRemoteNotificationsWithDeviceToken \(token)")
@@ -61,7 +42,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
m.notificationMode != .off {
if let verification = ntfData["verification"] as? String,
let nonce = ntfData["nonce"] as? String {
if let token = m.deviceToken {
if let token = ChatModel.shared.deviceToken {
logger.debug("AppDelegate: didReceiveRemoteNotification: verification, confirming \(verification)")
Task {
do {
@@ -81,7 +62,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
}
} else if let checkMessages = ntfData["checkMessages"] as? Bool, checkMessages {
logger.debug("AppDelegate: didReceiveRemoteNotification: checkMessages")
if appStateGroupDefault.get().inactive && m.ntfEnablePeriodic {
if appStateGroupDefault.get().inactive {
receiveMessages(completionHandler)
} else {
completionHandler(.noData)
@@ -95,7 +76,7 @@ class AppDelegate: NSObject, UIApplicationDelegate {
}
func applicationWillTerminate(_ application: UIApplication) {
logger.debug("DEBUGGING: AppDelegate: applicationWillTerminate")
logger.debug("AppDelegate: applicationWillTerminate")
ChatModel.shared.filesToDelete.forEach {
removeFile($0)
}

View File

@@ -136,9 +136,6 @@ struct ContentView: View {
.sheet(isPresented: $showWhatsNew) {
WhatsNewView()
}
if chatModel.setDeliveryReceipts {
SetDeliveryReceiptsView()
}
IncomingCallView()
}
.onContinueUserActivity("INStartCallIntent", perform: processUserActivity)
@@ -179,13 +176,10 @@ struct ContentView: View {
}
private func runAuthenticate() {
logger.debug("DEBUGGING: runAuthenticate")
if !prefPerformLA {
userAuthorized = true
} else {
logger.debug("DEBUGGING: before dismissAllSheets")
dismissAllSheets(animated: false) {
logger.debug("DEBUGGING: in dismissAllSheets callback")
chatModel.chatId = nil
justAuthenticate()
}
@@ -196,7 +190,7 @@ struct ContentView: View {
userAuthorized = false
let laMode = privacyLocalAuthModeDefault.get()
authenticate(reason: NSLocalizedString("Unlock app", comment: "authentication reason"), selfDestruct: true) { laResult in
logger.debug("DEBUGGING: authenticate callback: \(String(describing: laResult))")
logger.debug("authenticate callback: \(String(describing: laResult))")
switch (laResult) {
case .success:
userAuthorized = true

View File

@@ -34,10 +34,6 @@ class BGManager {
}
func schedule() {
if !ChatModel.shared.ntfEnableLocal {
logger.debug("BGManager.schedule: disabled")
return
}
logger.debug("BGManager.schedule")
let request = BGAppRefreshTaskRequest(identifier: receiveTaskId)
request.earliestBeginDate = Date(timeIntervalSinceNow: bgRefreshInterval)
@@ -49,10 +45,6 @@ class BGManager {
}
private func handleRefresh(_ task: BGAppRefreshTask) {
if !ChatModel.shared.ntfEnableLocal {
logger.debug("BGManager.handleRefresh: disabled")
return
}
logger.debug("BGManager.handleRefresh")
schedule()
if appStateGroupDefault.get().inactive {

View File

@@ -13,7 +13,6 @@ import SimpleXChat
final class ChatModel: ObservableObject {
@Published var onboardingStage: OnboardingStage?
@Published var setDeliveryReceipts = false
@Published var v3DBMigration: V3DBMigrationState = v3DBMigrationDefault.get()
@Published var currentUser: User?
@Published var users: [UserInfo] = []
@@ -42,7 +41,7 @@ final class ChatModel: ObservableObject {
@Published var tokenRegistered = false
@Published var tokenStatus: NtfTknStatus?
@Published var notificationMode = NotificationsMode.off
@Published var notificationPreview: NotificationPreviewMode = ntfPreviewModeGroupDefault.get()
@Published var notificationPreview: NotificationPreviewMode? = ntfPreviewModeGroupDefault.get()
@Published var incognito: Bool = incognitoGroupDefault.get()
// pending notification actions
@Published var ntfContactRequest: ChatId?
@@ -58,8 +57,6 @@ final class ChatModel: ObservableObject {
@Published var stopPreviousRecPlay: URL? = nil // coordinates currently playing source
@Published var draft: ComposeState?
@Published var draftChatId: String?
// tracks keyboard height via subscription in AppDelegate
@Published var keyboardHeight: CGFloat = 0
var messageDelivery: Dictionary<Int64, () -> Void> = [:]
@@ -69,14 +66,6 @@ final class ChatModel: ObservableObject {
static var ok: Bool { ChatModel.shared.chatDbStatus == .ok }
var ntfEnableLocal: Bool {
notificationMode == .off || ntfEnableLocalGroupDefault.get()
}
var ntfEnablePeriodic: Bool {
notificationMode == .periodic || ntfEnablePeriodicGroupDefault.get()
}
func getUser(_ userId: Int64) -> User? {
currentUser?.userId == userId
? currentUser
@@ -144,14 +133,6 @@ final class ChatModel: ObservableObject {
updateChat(.direct(contact: contact), addMissing: contact.directOrUsed)
}
func updateContactConnectionStats(_ contact: Contact, _ connectionStats: ConnectionStats) {
var updatedConn = contact.activeConn
updatedConn.connectionStats = connectionStats
var updatedContact = contact
updatedContact.activeConn = updatedConn
updateContact(updatedContact)
}
func updateGroup(_ groupInfo: GroupInfo) {
updateChat(.group(groupInfo: groupInfo))
}
@@ -540,16 +521,6 @@ final class ChatModel: ObservableObject {
}
}
func updateGroupMemberConnectionStats(_ groupInfo: GroupInfo, _ member: GroupMember, _ connectionStats: ConnectionStats) {
if let conn = member.activeConn {
var updatedConn = conn
updatedConn.connectionStats = connectionStats
var updatedMember = member
updatedMember.activeConn = updatedConn
_ = upsertGroupMember(groupInfo, updatedMember)
}
}
func unreadChatItemCounts(itemsInView: Set<String>) -> UnreadChatItemCounts {
var i = 0
var totalBelow = 0

View File

@@ -159,24 +159,6 @@ func apiSetActiveUserAsync(_ userId: Int64, viewPwd: String?) async throws -> Us
throw r
}
func apiSetAllContactReceipts(enable: Bool) async throws {
let r = await chatSendCmd(.setAllContactReceipts(enable: enable))
if case .cmdOk = r { return }
throw r
}
func apiSetUserContactReceipts(_ userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings) async throws {
let r = await chatSendCmd(.apiSetUserContactReceipts(userId: userId, userMsgReceiptSettings: userMsgReceiptSettings))
if case .cmdOk = r { return }
throw r
}
func apiSetUserGroupReceipts(_ userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings) async throws {
let r = await chatSendCmd(.apiSetUserGroupReceipts(userId: userId, userMsgReceiptSettings: userMsgReceiptSettings))
if case .cmdOk = r { return }
throw r
}
func apiHideUser(_ userId: Int64, viewPwd: String) async throws -> User {
try await setUserPrivacy_(.apiHideUser(userId: userId, viewPwd: viewPwd))
}
@@ -482,10 +464,6 @@ func setNetworkConfig(_ cfg: NetCfg) throws {
throw r
}
func reconnectAllServers() async throws {
try await sendCommandOkResp(.reconnectAllServers)
}
func apiSetChatSettings(type: ChatType, id: Int64, chatSettings: ChatSettings) async throws {
try await sendCommandOkResp(.apiSetChatSettings(type: type, id: id, chatSettings: chatSettings))
}
@@ -496,9 +474,9 @@ func apiContactInfo(_ contactId: Int64) async throws -> (ConnectionStats?, Profi
throw r
}
func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (GroupMember, ConnectionStats?) {
func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (ConnectionStats?) {
let r = chatSendCmdSync(.apiGroupMemberInfo(groupId: groupId, groupMemberId: groupMemberId))
if case let .groupMemberInfo(_, _, member, connStats_) = r { return (member, connStats_) }
if case let .groupMemberInfo(_, _, _, connStats_) = r { return (connStats_) }
throw r
}
@@ -526,18 +504,6 @@ func apiAbortSwitchGroupMember(_ groupId: Int64, _ groupMemberId: Int64) throws
throw r
}
func apiSyncContactRatchet(_ contactId: Int64, _ force: Bool) throws -> ConnectionStats {
let r = chatSendCmdSync(.apiSyncContactRatchet(contactId: contactId, force: force))
if case let .contactRatchetSyncStarted(_, _, connectionStats) = r { return connectionStats }
throw r
}
func apiSyncGroupMemberRatchet(_ groupId: Int64, _ groupMemberId: Int64, _ force: Bool) throws -> (GroupMember, ConnectionStats) {
let r = chatSendCmdSync(.apiSyncGroupMemberRatchet(groupId: groupId, groupMemberId: groupMemberId, force: force))
if case let .groupMemberRatchetSyncStarted(_, _, member, connectionStats) = r { return (member, connectionStats) }
throw r
}
func apiGetContactCode(_ contactId: Int64) async throws -> (Contact, String) {
let r = await chatSendCmd(.apiGetContactCode(contactId: contactId))
if case let .contactCode(_, contact, connectionCode) = r { return (contact, connectionCode) }
@@ -802,35 +768,29 @@ func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws {
try await sendCommandOkResp(.apiChatUnread(type: type, id: id, unreadChat: unreadChat))
}
func receiveFile(user: User, fileId: Int64, auto: Bool = false) async {
if let chatItem = await apiReceiveFile(fileId: fileId, auto: auto) {
func receiveFile(user: User, fileId: Int64) async {
if let chatItem = await apiReceiveFile(fileId: fileId) {
DispatchQueue.main.async { chatItemSimpleUpdate(user, chatItem) }
}
}
func apiReceiveFile(fileId: Int64, inline: Bool? = nil, auto: Bool = false) async -> AChatItem? {
func apiReceiveFile(fileId: Int64, inline: Bool? = nil) async -> AChatItem? {
let r = await chatSendCmd(.receiveFile(fileId: fileId, inline: inline))
let am = AlertManager.shared
if case let .rcvFileAccepted(_, chatItem) = r { return chatItem }
if case .rcvFileAcceptedSndCancelled = r {
logger.debug("apiReceiveFile error: sender cancelled file transfer")
if !auto {
am.showAlertMsg(
title: "Cannot receive file",
message: "Sender cancelled file transfer."
)
}
am.showAlertMsg(
title: "Cannot receive file",
message: "Sender cancelled file transfer."
)
} else if let networkErrorAlert = networkErrorAlert(r) {
logger.error("apiReceiveFile network error: \(String(describing: r))")
am.showAlert(networkErrorAlert)
} else {
switch chatError(r) {
case .fileCancelled:
logger.debug("apiReceiveFile ignoring fileCancelled error")
case .fileAlreadyReceiving:
logger.error("apiReceiveFile error: \(String(describing: r))")
switch r {
case .chatCmdError(_, .error(.fileAlreadyReceiving)):
logger.debug("apiReceiveFile ignoring fileAlreadyReceiving error")
default:
logger.error("apiReceiveFile error: \(String(describing: r))")
am.showAlertMsg(
title: "Error receiving file",
message: "Error: \(String(describing: r))"
@@ -1115,7 +1075,6 @@ func initializeChat(start: Bool, dbKey: String? = nil, refreshInvitations: Bool
m.currentUser = try apiGetActiveUser()
if m.currentUser == nil {
onboardingStageDefault.set(.step1_SimpleXInfo)
privacyDeliveryReceiptsSet.set(true)
m.onboardingStage = .step1_SimpleXInfo
} else if start {
try startChat(refreshInvitations: refreshInvitations)
@@ -1145,9 +1104,6 @@ func startChat(refreshInvitations: Bool = true) throws {
m.onboardingStage = [.step1_SimpleXInfo, .step2_CreateProfile].contains(savedOnboardingStage) && m.users.count == 1
? .step3_CreateSimpleXAddress
: savedOnboardingStage
if m.onboardingStage == .onboardingComplete && !privacyDeliveryReceiptsSet.get() {
m.setDeliveryReceipts = true
}
}
}
ChatReceiver.shared.start()
@@ -1329,7 +1285,7 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
if let file = cItem.autoReceiveFile() {
Task {
await receiveFile(user: user, fileId: file.fileId, auto: true)
await receiveFile(user: user, fileId: file.fileId)
}
}
if cItem.showNotification {
@@ -1338,11 +1294,8 @@ func processReceivedMsg(_ res: ChatResponse) async {
case let .chatItemStatusUpdated(user, aChatItem):
let cInfo = aChatItem.chatInfo
let cItem = aChatItem.chatItem
if !cItem.isDeletedContent {
let added = active(user) ? m.upsertChatItem(cInfo, cItem) : true
if added && cItem.showNotification {
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
}
if !cItem.isDeletedContent && (!active(user) || m.upsertChatItem(cInfo, cItem)) {
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
}
if let endTask = m.messageDelivery[cItem.id] {
switch cItem.meta.itemStatus {
@@ -1496,14 +1449,6 @@ func processReceivedMsg(_ res: ChatResponse) async {
}
case .chatSuspended:
chatSuspended()
case let .contactSwitch(_, contact, switchProgress):
m.updateContactConnectionStats(contact, switchProgress.connectionStats)
case let .groupMemberSwitch(_, groupInfo, member, switchProgress):
m.updateGroupMemberConnectionStats(groupInfo, member, switchProgress.connectionStats)
case let .contactRatchetSync(_, contact, ratchetSyncProgress):
m.updateContactConnectionStats(contact, ratchetSyncProgress.connectionStats)
case let .groupMemberRatchetSync(_, groupInfo, member, ratchetSyncProgress):
m.updateGroupMemberConnectionStats(groupInfo, member, ratchetSyncProgress.connectionStats)
default:
logger.debug("unsupported event: \(res.responseType)")
}

View File

@@ -76,11 +76,9 @@ private func _chatSuspended() {
}
func activateChat(appState: AppState = .active) {
logger.debug("DEBUGGING: activateChat")
suspendLockQueue.sync {
appStateGroupDefault.set(appState)
if ChatModel.ok { apiActivateChat() }
logger.debug("DEBUGGING: activateChat: after apiActivateChat")
}
}
@@ -97,14 +95,10 @@ func initChatAndMigrate(refreshInvitations: Bool = true) {
}
func startChatAndActivate() {
logger.debug("DEBUGGING: startChatAndActivate")
if ChatModel.shared.chatRunning == true {
ChatReceiver.shared.start()
logger.debug("DEBUGGING: startChatAndActivate: after ChatReceiver.shared.start")
}
if .active != appStateGroupDefault.get() {
logger.debug("DEBUGGING: startChatAndActivate: before activateChat")
activateChat()
logger.debug("DEBUGGING: startChatAndActivate: after activateChat")
}
}

View File

@@ -57,37 +57,6 @@ private func serverHost(_ s: String) -> String {
}
}
enum SendReceipts: Identifiable, Hashable {
case yes
case no
case userDefault(Bool)
var id: Self { self }
var text: LocalizedStringKey {
switch self {
case .yes: return "yes"
case .no: return "no"
case let .userDefault(on): return on ? "default (yes)" : "default (no)"
}
}
func bool() -> Bool? {
switch self {
case .yes: return true
case .no: return false
case .userDefault: return nil
}
}
static func fromBool(_ enable: Bool?, userDefault def: Bool) -> SendReceipts {
if let enable = enable {
return enable ? .yes : .no
}
return .userDefault(def)
}
}
struct ChatInfoView: View {
@EnvironmentObject var chatModel: ChatModel
@Environment(\.dismiss) var dismiss: DismissAction
@@ -99,8 +68,6 @@ struct ChatInfoView: View {
@Binding var connectionCode: String?
@FocusState private var aliasTextFieldFocused: Bool
@State private var alert: ChatInfoViewAlert? = nil
@State private var sendReceipts = SendReceipts.userDefault(true)
@State private var sendReceiptsUserDefault = true
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
enum ChatInfoViewAlert: Identifiable {
@@ -109,7 +76,6 @@ struct ChatInfoView: View {
case networkStatusAlert
case switchAddressAlert
case abortSwitchAddressAlert
case syncConnectionForceAlert
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
var id: String {
@@ -119,7 +85,6 @@ struct ChatInfoView: View {
case .networkStatusAlert: return "networkStatusAlert"
case .switchAddressAlert: return "switchAddressAlert"
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case let .error(title, _): return "error \(title)"
}
}
@@ -150,14 +115,6 @@ struct ChatInfoView: View {
Section {
if let code = connectionCode { verifyCodeButton(code) }
contactPreferencesButton()
sendReceiptsOption()
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
}
if let contactLink = contact.contactLink {
@@ -184,18 +141,12 @@ struct ChatInfoView: View {
Button("Change receiving address") {
alert = .switchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|| connStats.ratchetSyncSendProhibited
)
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
.disabled(connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil })
if connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil } {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
.disabled(connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch })
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer })
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer })
@@ -217,12 +168,6 @@ struct ChatInfoView: View {
.navigationBarHidden(true)
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.onAppear {
if let currentUser = chatModel.currentUser {
sendReceiptsUserDefault = currentUser.sendRcptsContacts
}
sendReceipts = SendReceipts.fromBool(contact.chatSettings.sendRcpts, userDefault: sendReceiptsUserDefault)
}
.alert(item: $alert) { alertItem in
switch(alertItem) {
case .deleteContactAlert: return deleteContactAlert()
@@ -230,7 +175,6 @@ struct ChatInfoView: View {
case .networkStatusAlert: return networkStatusAlert()
case .switchAddressAlert: return switchAddressAlert(switchContactAddress)
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchContactAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncContactConnection(force: true) })
case let .error(title, error): return mkAlert(title: title, message: error)
}
}
@@ -243,30 +187,20 @@ struct ChatInfoView: View {
.frame(width: 192, height: 192)
.padding(.top, 12)
.padding()
if contact.verified {
(
Text(Image(systemName: "checkmark.shield"))
HStack {
if contact.verified {
Image(systemName: "checkmark.shield")
.foregroundColor(.secondary)
.font(.title2)
+ Text(" ")
+ Text(contact.profile.displayName)
.font(.largeTitle)
)
.multilineTextAlignment(.center)
.lineLimit(2)
.padding(.bottom, 2)
} else {
}
Text(contact.profile.displayName)
.font(.largeTitle)
.multilineTextAlignment(.center)
.lineLimit(2)
.lineLimit(1)
.padding(.bottom, 2)
}
if cInfo.fullName != "" && cInfo.fullName != cInfo.displayName && cInfo.fullName != contact.profile.displayName {
Text(cInfo.fullName)
.font(.title2)
.multilineTextAlignment(.center)
.lineLimit(4)
.lineLimit(2)
}
}
.frame(maxWidth: .infinity, alignment: .center)
@@ -346,44 +280,6 @@ struct ChatInfoView: View {
}
}
private func sendReceiptsOption() -> some View {
Picker(selection: $sendReceipts) {
ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in
Text(opt.text)
}
} label: {
Label("Send receipts", systemImage: "checkmark.message")
}
.frame(height: 36)
.onChange(of: sendReceipts) { _ in
setSendReceipts()
}
}
private func setSendReceipts() {
var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults
chatSettings.sendRcpts = sendReceipts.bool()
updateChatSettings(chat, chatSettings: chatSettings)
}
private func synchronizeConnectionButton() -> some View {
Button {
syncContactConnection(force: false)
} label: {
Label("Fix connection", systemImage: "exclamationmark.arrow.triangle.2.circlepath")
.foregroundColor(.orange)
}
}
private func synchronizeConnectionButtonForce() -> some View {
Button {
alert = .syncConnectionForceAlert
} label: {
Label("Renegotiate encryption", systemImage: "exclamationmark.triangle")
.foregroundColor(.red)
}
}
private func networkStatusRow() -> some View {
HStack {
Text("Network status")
@@ -474,10 +370,6 @@ struct ChatInfoView: View {
do {
let stats = try apiSwitchContact(contactId: contact.apiId)
connectionStats = stats
await MainActor.run {
chatModel.updateContactConnectionStats(contact, stats)
dismiss()
}
} catch let error {
logger.error("switchContactAddress apiSwitchContact error: \(responseError(error))")
let a = getErrorAlert(error, "Error changing address")
@@ -493,9 +385,6 @@ struct ChatInfoView: View {
do {
let stats = try apiAbortSwitchContact(contact.apiId)
connectionStats = stats
await MainActor.run {
chatModel.updateContactConnectionStats(contact, stats)
}
} catch let error {
logger.error("abortSwitchContactAddress apiAbortSwitchContact error: \(responseError(error))")
let a = getErrorAlert(error, "Error aborting address change")
@@ -505,25 +394,6 @@ struct ChatInfoView: View {
}
}
}
private func syncContactConnection(force: Bool) {
Task {
do {
let stats = try apiSyncContactRatchet(contact.apiId, force)
connectionStats = stats
await MainActor.run {
chatModel.updateContactConnectionStats(contact, stats)
dismiss()
}
} catch let error {
logger.error("syncContactConnection apiSyncContactRatchet error: \(responseError(error))")
let a = getErrorAlert(error, "Error synchronizing connection")
await MainActor.run {
alert = .error(title: a.title, error: a.message)
}
}
}
}
}
func switchAddressAlert(_ switchAddress: @escaping () -> Void) -> Alert {
@@ -544,15 +414,6 @@ func abortSwitchAddressAlert(_ abortSwitchAddress: @escaping () -> Void) -> Aler
)
}
func syncConnectionForceAlert(_ syncConnectionForce: @escaping () -> Void) -> Alert {
Alert(
title: Text("Renegotiate encryption?"),
message: Text("The encryption is working and the new encryption agreement is not required. It may result in connection errors!"),
primaryButton: .destructive(Text("Renegotiate"), action: syncConnectionForce),
secondaryButton: .cancel()
)
}
struct ChatInfoView_Previews: PreviewProvider {
static var previews: some View {
ChatInfoView(

View File

@@ -62,7 +62,6 @@ struct CIFileView: View {
case .rcvComplete: return true
case .rcvCancelled: return false
case .rcvError: return false
case .invalid: return false
}
}
return false
@@ -150,7 +149,6 @@ struct CIFileView: View {
case .rcvComplete: fileIcon("doc.fill")
case .rcvCancelled: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .rcvError: fileIcon("doc.fill", innerIcon: "xmark", innerIconSize: 10)
case .invalid: fileIcon("doc.fill", innerIcon: "questionmark", innerIconSize: 10)
}
} else {
fileIcon("doc.fill")
@@ -197,7 +195,7 @@ struct CIFileView_Previews: PreviewProvider {
static var previews: some View {
let sentFile: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
meta: CIMeta.getSample(1, .now, "", .sndSent, itemEdited: true),
content: .sndMsgContent(msgContent: .file("")),
quotedItem: nil,
file: CIFile.getSample(fileStatus: .sndComplete)

View File

@@ -99,7 +99,6 @@ struct CIImageView: View {
case .rcvTransfer: progressView()
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
case .invalid: fileIcon("questionmark", 10, 13)
default: EmptyView()
}
}

View File

@@ -13,47 +13,17 @@ struct CIMetaView: View {
@EnvironmentObject var chat: Chat
var chatItem: ChatItem
var metaColor = Color.secondary
var paleMetaColor = Color(UIColor.tertiaryLabel)
var body: some View {
if chatItem.isDeletedContent {
chatItem.timestampText.font(.caption).foregroundColor(metaColor)
} else {
let meta = chatItem.meta
let ttl = chat.chatInfo.timedMessagesTTL
switch meta.itemStatus {
case let .sndSent(sndProgress):
switch sndProgress {
case .complete: ciMetaText(meta, chatTTL: ttl, color: metaColor, sent: .sent)
case .partial: ciMetaText(meta, chatTTL: ttl, color: paleMetaColor, sent: .sent)
}
case let .sndRcvd(_, sndProgress):
switch sndProgress {
case .complete:
ZStack {
ciMetaText(meta, chatTTL: ttl, color: metaColor, sent: .rcvd1)
ciMetaText(meta, chatTTL: ttl, color: metaColor, sent: .rcvd2)
}
case .partial:
ZStack {
ciMetaText(meta, chatTTL: ttl, color: paleMetaColor, sent: .rcvd1)
ciMetaText(meta, chatTTL: ttl, color: paleMetaColor, sent: .rcvd2)
}
}
default:
ciMetaText(meta, chatTTL: ttl, color: metaColor)
}
ciMetaText(chatItem.meta, chatTTL: chat.chatInfo.timedMessagesTTL, color: metaColor)
}
}
}
enum SentCheckmark {
case sent
case rcvd1
case rcvd2
}
func ciMetaText(_ meta: CIMeta, chatTTL: Int?, color: Color = .clear, transparent: Bool = false, sent: SentCheckmark? = nil) -> Text {
func ciMetaText(_ meta: CIMeta, chatTTL: Int?, color: Color = .clear, transparent: Bool = false) -> Text {
var r = Text("")
if meta.itemEdited {
r = r + statusIconText("pencil", color)
@@ -67,16 +37,7 @@ func ciMetaText(_ meta: CIMeta, chatTTL: Int?, color: Color = .clear, transparen
r = r + Text(" ")
}
if let (icon, statusColor) = meta.statusIcon(color) {
let t = Text(Image(systemName: icon)).font(.caption2)
let gap = Text(" ").kerning(-1.25)
let t1 = t.foregroundColor(transparent ? .clear : statusColor.opacity(0.67))
switch sent {
case nil: r = r + t1
case .sent: r = r + t1 + gap
case .rcvd1: r = r + t.foregroundColor(transparent ? .clear : statusColor.opacity(0.67)) + gap
case .rcvd2: r = r + gap + t1
}
r = r + Text(" ")
r = r + statusIconText(icon, transparent ? .clear : statusColor) + Text(" ")
} else if !meta.disappearing {
r = r + statusIconText("circlebadge.fill", .clear) + Text(" ")
}
@@ -90,12 +51,8 @@ private func statusIconText(_ icon: String, _ color: Color) -> Text {
struct CIMetaView_Previews: PreviewProvider {
static var previews: some View {
Group {
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete)))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .partial)))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .complete)))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .partial)))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .badMsgHash, sndProgress: .complete)))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), itemEdited: true))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent))
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent, itemEdited: true))
CIMetaView(chatItem: ChatItem.getDeletedContentSample())
}
.previewLayout(.fixed(width: 360, height: 100))

View File

@@ -12,215 +12,25 @@ import SimpleXChat
let decryptErrorReason: LocalizedStringKey = "It can happen when you or your connection used the old database backup."
struct CIRcvDecryptionError: View {
@EnvironmentObject var chat: Chat
var msgDecryptError: MsgDecryptError
var msgCount: UInt32
var chatItem: ChatItem
var showMember = false
@State private var alert: CIRcvDecryptionErrorAlert?
enum CIRcvDecryptionErrorAlert: Identifiable {
case syncAllowedAlert(_ syncConnection: () -> Void)
case syncNotSupportedContactAlert
case syncNotSupportedMemberAlert
case decryptionErrorAlert
case error(title: LocalizedStringKey, error: LocalizedStringKey)
var id: String {
switch self {
case .syncAllowedAlert: return "syncAllowedAlert"
case .syncNotSupportedContactAlert: return "syncNotSupportedContactAlert"
case .syncNotSupportedMemberAlert: return "syncNotSupportedMemberAlert"
case .decryptionErrorAlert: return "decryptionErrorAlert"
case let .error(title, _): return "error \(title)"
}
}
}
var body: some View {
viewBody()
.onAppear {
// for direct chat ConnectionStats are populated on opening chat, see ChatView onAppear
if case let .group(groupInfo) = chat.chatInfo,
case let .groupRcv(groupMember) = chatItem.chatDir {
do {
let (member, stats) = try apiGroupMemberInfo(groupInfo.apiId, groupMember.groupMemberId)
if let s = stats {
ChatModel.shared.updateGroupMemberConnectionStats(groupInfo, member, s)
}
} catch let error {
logger.error("apiGroupMemberInfo error: \(responseError(error))")
}
}
CIMsgError(chatItem: chatItem, showMember: showMember) {
var message: Text
let why = Text(decryptErrorReason)
let permanent = Text("This error is permanent for this connection, please re-connect.")
switch msgDecryptError {
case .ratchetHeader:
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why + Text("\n") + permanent
case .tooManySkipped:
message = Text("\(msgCount) messages skipped.") + Text("\n") + why + Text("\n") + permanent
}
.alert(item: $alert) { alertItem in
switch(alertItem) {
case let .syncAllowedAlert(syncConnection): return syncAllowedAlert(syncConnection)
case .syncNotSupportedContactAlert: return Alert(title: Text("Fix not supported by contact"), message: message())
case .syncNotSupportedMemberAlert: return Alert(title: Text("Fix not supported by group member"), message: message())
case .decryptionErrorAlert: return Alert(title: Text("Decryption error"), message: message())
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
}
}
}
@ViewBuilder private func viewBody() -> some View {
if case let .direct(contact) = chat.chatInfo,
let contactStats = contact.activeConn.connectionStats {
if contactStats.ratchetSyncAllowed {
decryptionErrorItemFixButton(syncSupported: true) {
alert = .syncAllowedAlert { syncContactConnection(contact) }
}
} else if !contactStats.ratchetSyncSupported {
decryptionErrorItemFixButton(syncSupported: false) {
alert = .syncNotSupportedContactAlert
}
} else {
basicDecryptionErrorItem()
}
} else if case let .group(groupInfo) = chat.chatInfo,
case let .groupRcv(groupMember) = chatItem.chatDir,
let modelMember = ChatModel.shared.groupMembers.first(where: { $0.id == groupMember.id }),
let memberStats = modelMember.activeConn?.connectionStats {
if memberStats.ratchetSyncAllowed {
decryptionErrorItemFixButton(syncSupported: true) {
alert = .syncAllowedAlert { syncMemberConnection(groupInfo, groupMember) }
}
} else if !memberStats.ratchetSyncSupported {
decryptionErrorItemFixButton(syncSupported: false) {
alert = .syncNotSupportedMemberAlert
}
} else {
basicDecryptionErrorItem()
}
} else {
basicDecryptionErrorItem()
AlertManager.shared.showAlert(Alert(title: Text("Decryption error"), message: message))
}
}
private func basicDecryptionErrorItem() -> some View {
decryptionErrorItem { alert = .decryptionErrorAlert }
}
private func decryptionErrorItemFixButton(syncSupported: Bool, _ onClick: @escaping (() -> Void)) -> some View {
ZStack(alignment: .bottomTrailing) {
VStack(alignment: .leading, spacing: 2) {
HStack {
if showMember, let member = chatItem.memberDisplayName {
Text(member).fontWeight(.medium) + Text(": ")
}
Text(chatItem.content.text)
.foregroundColor(.red)
.italic()
}
(
Text(Image(systemName: "exclamationmark.arrow.triangle.2.circlepath"))
.foregroundColor(syncSupported ? .accentColor : .secondary)
.font(.callout)
+ Text(" ")
+ Text("Fix connection")
.foregroundColor(syncSupported ? .accentColor : .secondary)
.font(.callout)
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, transparent: true)
)
}
.padding(.horizontal, 12)
CIMetaView(chatItem: chatItem)
.padding(.horizontal, 12)
}
.onTapGesture(perform: { onClick() })
.padding(.vertical, 6)
.background(Color(uiColor: .tertiarySystemGroupedBackground))
.cornerRadius(18)
.textSelection(.disabled)
}
private func decryptionErrorItem(_ onClick: @escaping (() -> Void)) -> some View {
func text() -> Text {
Text(chatItem.content.text)
.foregroundColor(.red)
.italic()
+ Text(" ")
+ ciMetaText(chatItem.meta, chatTTL: nil, transparent: true)
}
return ZStack(alignment: .bottomTrailing) {
HStack {
if showMember, let member = chatItem.memberDisplayName {
Text(member).fontWeight(.medium) + Text(": ") + text()
} else {
text()
}
}
.padding(.horizontal, 12)
CIMetaView(chatItem: chatItem)
.padding(.horizontal, 12)
}
.onTapGesture(perform: { onClick() })
.padding(.vertical, 6)
.background(Color(uiColor: .tertiarySystemGroupedBackground))
.cornerRadius(18)
.textSelection(.disabled)
}
private func message() -> Text {
var message: Text
let why = Text(decryptErrorReason)
switch msgDecryptError {
case .ratchetHeader:
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
case .tooManySkipped:
message = Text("\(msgCount) messages skipped.") + Text("\n") + why
case .ratchetEarlier:
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
case .other:
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
}
return message
}
private func syncMemberConnection(_ groupInfo: GroupInfo, _ member: GroupMember) {
Task {
do {
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, member.groupMemberId, false)
await MainActor.run {
ChatModel.shared.updateGroupMemberConnectionStats(groupInfo, mem, stats)
}
} catch let error {
logger.error("syncMemberConnection apiSyncGroupMemberRatchet error: \(responseError(error))")
let a = getErrorAlert(error, "Error synchronizing connection")
await MainActor.run {
alert = .error(title: a.title, error: a.message)
}
}
}
}
private func syncContactConnection(_ contact: Contact) {
Task {
do {
let stats = try apiSyncContactRatchet(contact.apiId, false)
await MainActor.run {
ChatModel.shared.updateContactConnectionStats(contact, stats)
}
} catch let error {
logger.error("syncContactConnection apiSyncContactRatchet error: \(responseError(error))")
let a = getErrorAlert(error, "Error synchronizing connection")
await MainActor.run {
alert = .error(title: a.title, error: a.message)
}
}
}
}
private func syncAllowedAlert(_ syncConnection: @escaping () -> Void) -> Alert {
Alert(
title: Text("Fix connection?"),
message: message(),
primaryButton: .default(Text("Fix"), action: syncConnection),
secondaryButton: .cancel()
)
}
}
//struct CIRcvDecryptionError_Previews: PreviewProvider {

View File

@@ -212,7 +212,6 @@ struct CIVideoView: View {
}
case .rcvCancelled: fileIcon("xmark", 10, 13)
case .rcvError: fileIcon("xmark", 10, 13)
case .invalid: fileIcon("questionmark", 10, 13)
default: EmptyView()
}
}
@@ -247,10 +246,10 @@ struct CIVideoView: View {
.padding([.trailing, .top], 11)
}
private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64, Bool) async -> Void) {
private func receiveFileIfValidSize(file: CIFile, receiveFile: @escaping (User, Int64) async -> Void) {
Task {
if let user = ChatModel.shared.currentUser {
await receiveFile(user, file.fileId, false)
await receiveFile(user, file.fileId)
}
}
}

View File

@@ -144,7 +144,6 @@ struct VoiceMessagePlayer: View {
case .rcvComplete: playbackButton()
case .rcvCancelled: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
case .rcvError: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
case .invalid: playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
}
} else {
playPauseIcon("play.fill", Color(uiColor: .tertiaryLabel))
@@ -269,7 +268,7 @@ struct CIVoiceView_Previews: PreviewProvider {
static var previews: some View {
let sentVoiceMessage: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
meta: CIMeta.getSample(1, .now, "", .sndSent, itemEdited: true),
content: .sndMsgContent(msgContent: .voice(text: "", duration: 30)),
quotedItem: nil,
file: CIFile.getSample(fileStatus: .sndComplete)

View File

@@ -32,7 +32,7 @@ func emojiText(_ text: String) -> Text {
struct EmojiItemView_Previews: PreviewProvider {
static var previews: some View {
Group{
EmojiItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete)))
EmojiItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent))
EmojiItemView(chatItem: ChatItem.getSample(2, .directRcv, .now, "👍"))
}
.previewLayout(.fixed(width: 360, height: 70))

View File

@@ -75,14 +75,14 @@ struct FramedCIVoiceView_Previews: PreviewProvider {
static var previews: some View {
let sentVoiceMessage: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
meta: CIMeta.getSample(1, .now, "", .sndSent, itemEdited: true),
content: .sndMsgContent(msgContent: .voice(text: "Hello there", duration: 30)),
quotedItem: nil,
file: CIFile.getSample(fileStatus: .sndComplete)
)
let voiceMessageWithQuote: ChatItem = ChatItem(
chatDir: .directSnd,
meta: CIMeta.getSample(1, .now, "", .sndSent(sndProgress: .complete), itemEdited: true),
meta: CIMeta.getSample(1, .now, "", .sndSent, itemEdited: true),
content: .sndMsgContent(msgContent: .voice(text: "", duration: 30)),
quotedItem: CIQuote.getSample(1, .now, "Hi", chatDir: .directRcv),
file: CIFile.getSample(fileStatus: .sndComplete)

View File

@@ -349,8 +349,8 @@ struct FramedItemView_Previews: PreviewProvider {
Group{
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello"), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .groupRcv(groupMember: GroupMember.sampleData), .now, "hello", quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directSnd)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent, quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent, quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this covers -"), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this text has the time on the same line "), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "https://simplex.chat"), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
@@ -363,10 +363,10 @@ struct FramedItemView_Previews: PreviewProvider {
struct FramedItemView_Edited_Previews: PreviewProvider {
static var previews: some View {
Group {
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .groupRcv(groupMember: GroupMember.sampleData), .now, "hello", quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directSnd), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent, quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent, quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv), itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this covers -", .rcvRead, itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this text has the time on the same line ", .rcvRead, itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "https://simplex.chat", .rcvRead, itemEdited: true), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
@@ -381,10 +381,10 @@ struct FramedItemView_Edited_Previews: PreviewProvider {
struct FramedItemView_Deleted_Previews: PreviewProvider {
static var previews: some View {
Group {
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .groupRcv(groupMember: GroupMember.sampleData), .now, "hello", quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directSnd), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent(sndProgress: .complete), quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent, quotedItem: CIQuote.getSample(1, .now, "hi", chatDir: .directRcv), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directSnd, .now, "👍", .sndSent, quotedItem: CIQuote.getSample(1, .now, "Hello too", chatDir: .directRcv), itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this covers -", .rcvRead, itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too!!! this text has the time on the same line ", .rcvRead, itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
FramedItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "https://simplex.chat", .rcvRead, itemDeleted: .deleted(deletedTs: .now)), allowMenu: Binding.constant(true), audioPlayer: .constant(nil), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))

View File

@@ -46,7 +46,7 @@ struct MarkedDeletedItemView: View {
struct MarkedDeletedItemView_Previews: PreviewProvider {
static var previews: some View {
Group {
MarkedDeletedItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)))
MarkedDeletedItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemDeleted: .deleted(deletedTs: .now)))
}
.previewLayout(.fixed(width: 360, height: 200))
}

View File

@@ -87,7 +87,7 @@ struct MsgContentView: View {
func messageText(_ text: String, _ formattedText: [FormattedText]?, _ sender: String?, icon: String? = nil, preview: Bool = false) -> Text {
let s = text
var res: Text
if let ft = formattedText, ft.count > 0 && ft.count <= 200 {
if let ft = formattedText, ft.count > 0 {
res = formatText(ft[0], preview)
var i = 1
while i < ft.count {

View File

@@ -13,25 +13,7 @@ struct ChatItemInfoView: View {
@Environment(\.colorScheme) var colorScheme
var ci: ChatItem
@Binding var chatItemInfo: ChatItemInfo?
@State private var selection: CIInfoTab = .history
@State private var alert: CIInfoViewAlert? = nil
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
enum CIInfoTab {
case history
case quote
case delivery
}
enum CIInfoViewAlert: Identifiable {
case deliveryStatusAlert(status: CIStatus)
var id: String {
switch self {
case .deliveryStatusAlert: return "deliveryStatusAlert"
}
}
}
var body: some View {
NavigationView {
@@ -43,11 +25,6 @@ struct ChatItemInfoView: View {
}
}
}
.alert(item: $alert) { alertItem in
switch(alertItem) {
case let .deliveryStatusAlert(status): return deliveryStatusAlert(status)
}
}
}
}
@@ -57,92 +34,44 @@ struct ChatItemInfoView: View {
: NSLocalizedString("Received message", comment: "message info title")
}
private var numTabs: Int {
var numTabs = 1
if chatItemInfo?.memberDeliveryStatuses != nil {
numTabs += 1
}
if ci.quotedItem != nil {
numTabs += 1
}
return numTabs
}
@ViewBuilder private func itemInfoView() -> some View {
if numTabs > 1 {
TabView(selection: $selection) {
if let mdss = chatItemInfo?.memberDeliveryStatuses {
deliveryTab(mdss)
.tabItem {
Label("Delivery", systemImage: "checkmark.message")
}
.tag(CIInfoTab.delivery)
}
historyTab()
.tabItem {
Label("History", systemImage: "clock")
}
.tag(CIInfoTab.history)
if let qi = ci.quotedItem {
quoteTab(qi)
.tabItem {
Label("In reply to", systemImage: "arrowshape.turn.up.left")
}
.tag(CIInfoTab.quote)
}
}
.onAppear {
if chatItemInfo?.memberDeliveryStatuses != nil {
selection = .delivery
}
}
} else {
historyTab()
}
}
@ViewBuilder private func details() -> some View {
let meta = ci.meta
VStack(alignment: .leading, spacing: 16) {
Text(title)
.font(.largeTitle)
.bold()
.padding(.bottom)
infoRow("Sent at", localTimestamp(meta.itemTs))
if !ci.chatDir.sent {
infoRow("Received at", localTimestamp(meta.createdAt))
}
switch (meta.itemDeleted) {
case let .deleted(deletedTs):
if let deletedTs = deletedTs {
infoRow("Deleted at", localTimestamp(deletedTs))
}
case let .moderated(deletedTs, _):
if let deletedTs = deletedTs {
infoRow("Moderated at", localTimestamp(deletedTs))
}
default: EmptyView()
}
if let deleteAt = meta.itemTimed?.deleteAt {
infoRow("Disappears at", localTimestamp(deleteAt))
}
if developerTools {
infoRow("Database ID", "\(meta.itemId)")
infoRow("Record updated at", localTimestamp(meta.updatedAt))
}
}
}
@ViewBuilder private func historyTab() -> some View {
GeometryReader { g in
let maxWidth = (g.size.width - 32) * 0.84
ScrollView {
VStack(alignment: .leading, spacing: 16) {
details()
Divider().padding(.vertical)
Text(title)
.font(.largeTitle)
.bold()
.padding(.bottom)
let maxWidth = (g.size.width - 32) * 0.84
infoRow("Sent at", localTimestamp(meta.itemTs))
if !ci.chatDir.sent {
infoRow("Received at", localTimestamp(meta.createdAt))
}
switch (meta.itemDeleted) {
case let .deleted(deletedTs):
if let deletedTs = deletedTs {
infoRow("Deleted at", localTimestamp(deletedTs))
}
case let .moderated(deletedTs, _):
if let deletedTs = deletedTs {
infoRow("Moderated at", localTimestamp(deletedTs))
}
default: EmptyView()
}
if let deleteAt = meta.itemTimed?.deleteAt {
infoRow("Disappears at", localTimestamp(deleteAt))
}
if developerTools {
infoRow("Database ID", "\(meta.itemId)")
infoRow("Record updated at", localTimestamp(meta.updatedAt))
}
if let chatItemInfo = chatItemInfo,
!chatItemInfo.itemVersions.isEmpty {
Divider().padding(.vertical)
Text("History")
.font(.title2)
.padding(.bottom, 4)
@@ -152,21 +81,16 @@ struct ChatItemInfoView: View {
}
}
}
else {
Text("No history")
.foregroundColor(.secondary)
.frame(maxWidth: .infinity)
}
}
.padding()
}
.padding()
.frame(maxHeight: .infinity, alignment: .top)
}
}
@ViewBuilder private func itemVersionView(_ itemVersion: ChatItemVersion, _ maxWidth: CGFloat, current: Bool) -> some View {
VStack(alignment: .leading, spacing: 4) {
textBubble(itemVersion.msgContent.text, itemVersion.formattedText, nil)
versionText(itemVersion)
.allowsHitTesting(false)
.padding(.horizontal, 12)
.padding(.vertical, 6)
@@ -195,9 +119,9 @@ struct ChatItemInfoView: View {
.frame(maxWidth: maxWidth, alignment: .leading)
}
@ViewBuilder private func textBubble(_ text: String, _ formattedText: [FormattedText]?, _ sender: String? = nil) -> some View {
if text != "" {
messageText(text, formattedText, sender)
@ViewBuilder private func versionText(_ itemVersion: ChatItemVersion) -> some View {
if itemVersion.msgContent.text != "" {
messageText(itemVersion.msgContent.text, itemVersion.formattedText, nil)
} else {
Text("no text")
.italic()
@@ -205,143 +129,9 @@ struct ChatItemInfoView: View {
}
}
@ViewBuilder private func quoteTab(_ qi: CIQuote) -> some View {
GeometryReader { g in
let maxWidth = (g.size.width - 32) * 0.84
ScrollView {
VStack(alignment: .leading, spacing: 16) {
details()
Divider().padding(.vertical)
Text("In reply to")
.font(.title2)
.padding(.bottom, 4)
quotedMsgView(qi, maxWidth)
}
.padding()
}
.frame(maxHeight: .infinity, alignment: .top)
}
}
@ViewBuilder private func quotedMsgView(_ qi: CIQuote, _ maxWidth: CGFloat) -> some View {
VStack(alignment: .leading, spacing: 4) {
textBubble(qi.text, qi.formattedText, qi.getSender(nil))
.allowsHitTesting(false)
.padding(.horizontal, 12)
.padding(.vertical, 6)
.background(quotedMsgFrameColor(qi, colorScheme))
.cornerRadius(18)
.contextMenu {
if qi.text != "" {
Button {
showShareSheet(items: [qi.text])
} label: {
Label("Share", systemImage: "square.and.arrow.up")
}
Button {
UIPasteboard.general.string = qi.text
} label: {
Label("Copy", systemImage: "doc.on.doc")
}
}
}
Text(localTimestamp(qi.sentAt))
.foregroundStyle(.secondary)
.font(.caption)
.padding(.horizontal, 12)
}
.frame(maxWidth: maxWidth, alignment: .leading)
}
func quotedMsgFrameColor(_ qi: CIQuote, _ colorScheme: ColorScheme) -> Color {
(qi.chatDir?.sent ?? false)
? (colorScheme == .light ? sentColorLight : sentColorDark)
: Color(uiColor: .tertiarySystemGroupedBackground)
}
@ViewBuilder private func deliveryTab(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> some View {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
details()
Divider().padding(.vertical)
Text("Delivery")
.font(.title2)
.padding(.bottom, 4)
memberDeliveryStatusesView(memberDeliveryStatuses)
}
.padding()
}
.frame(maxHeight: .infinity, alignment: .top)
}
@ViewBuilder private func memberDeliveryStatusesView(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> some View {
VStack(alignment: .leading, spacing: 12) {
let mss = membersStatuses(memberDeliveryStatuses)
if !mss.isEmpty {
ForEach(mss, id: \.0.groupMemberId) { memberStatus in
memberDeliveryStatusView(memberStatus.0, memberStatus.1)
}
} else {
Text("No info on delivery")
.foregroundColor(.secondary)
}
}
}
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus)] {
memberDeliveryStatuses.compactMap({ mds in
if let mem = ChatModel.shared.groupMembers.first(where: { $0.groupMemberId == mds.groupMemberId }) {
return (mem, mds.memberDeliveryStatus)
} else {
return nil
}
})
}
private func memberDeliveryStatusView(_ member: GroupMember, _ status: CIStatus) -> some View {
HStack{
ProfileImage(imageStr: member.image)
.frame(width: 30, height: 30)
.padding(.trailing, 2)
Text(member.chatViewName)
.lineLimit(1)
Spacer()
Group {
if let (icon, statusColor) = status.statusIcon(Color.secondary) {
switch status {
case .sndRcvd:
ZStack(alignment: .trailing) {
Image(systemName: icon)
.foregroundColor(statusColor.opacity(0.67))
.padding(.trailing, 6)
Image(systemName: icon)
.foregroundColor(statusColor.opacity(0.67))
}
default:
Image(systemName: icon)
.foregroundColor(statusColor)
}
} else {
Image(systemName: "ellipsis")
.foregroundColor(Color.secondary)
}
}
.onTapGesture {
alert = .deliveryStatusAlert(status: status)
}
}
}
func deliveryStatusAlert(_ status: CIStatus) -> Alert {
Alert(
title: Text(status.statusText),
message: Text(status.statusDescription)
)
}
private func itemInfoShareText() -> String {
let meta = ci.meta
var shareText: [String] = [String.localizedStringWithFormat(NSLocalizedString("# %@", comment: "copied message info title, # <title>"), title), ""]
var shareText: [String] = [title, ""]
shareText += [String.localizedStringWithFormat(NSLocalizedString("Sent at: %@", comment: "copied message info"), localTimestamp(meta.itemTs))]
if !ci.chatDir.sent {
shareText += [String.localizedStringWithFormat(NSLocalizedString("Received at: %@", comment: "copied message info"), localTimestamp(meta.createdAt))]
@@ -366,41 +156,9 @@ struct ChatItemInfoView: View {
String.localizedStringWithFormat(NSLocalizedString("Record updated at: %@", comment: "copied message info"), localTimestamp(meta.updatedAt))
]
}
if let qi = ci.quotedItem {
shareText += ["", NSLocalizedString("## In reply to", comment: "copied message info")]
let t = qi.text
shareText += [""]
if let sender = qi.getSender(nil) {
shareText += [String.localizedStringWithFormat(
NSLocalizedString("%@ at %@:", comment: "copied message info, <sender> at <time>"),
sender,
localTimestamp(qi.sentAt)
)]
} else {
shareText += [String.localizedStringWithFormat(
NSLocalizedString("%@:", comment: "copied message info"),
localTimestamp(qi.sentAt)
)]
}
shareText += [t != "" ? t : NSLocalizedString("no text", comment: "copied message info in history")]
}
if let mdss = chatItemInfo?.memberDeliveryStatuses {
let mss = membersStatuses(mdss)
if !mss.isEmpty {
shareText += ["", NSLocalizedString("## Delivery", comment: "copied message info")]
shareText += [""]
for (member, status) in mss {
shareText += [String.localizedStringWithFormat(
NSLocalizedString("%@: %@", comment: "copied message info, <recipient>: <message delivery status description>"),
member.chatViewName,
status.statusDescription
)]
}
}
}
if let chatItemInfo = chatItemInfo,
!chatItemInfo.itemVersions.isEmpty {
shareText += ["", NSLocalizedString("## History", comment: "copied message info")]
shareText += ["", NSLocalizedString("History", comment: "copied message info")]
for (index, itemVersion) in chatItemInfo.itemVersions.enumerated() {
let t = itemVersion.msgContent.text
shareText += [

View File

@@ -125,9 +125,9 @@ struct ChatItemView_Previews: PreviewProvider {
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getDeletedContentSample(), revealed: Binding.constant(false))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), revealed: Binding.constant(false))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemDeleted: .deleted(deletedTs: .now)), revealed: Binding.constant(false))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent, itemLive: true), revealed: Binding.constant(true))
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemLive: true), revealed: Binding.constant(true))
}
.previewLayout(.fixed(width: 360, height: 70))
.environmentObject(Chat.sampleData)

View File

@@ -22,7 +22,7 @@ struct ChatView: View {
@State private var showAddMembersSheet: Bool = false
@State private var composeState = ComposeState()
@State private var deletingItem: ChatItem? = nil
@State private var keyboardVisible = false
@FocusState private var keyboardVisible: Bool
@State private var showDeleteMessage = false
@State private var connectionStats: ConnectionStats?
@State private var customUserProfile: Profile?
@@ -39,16 +39,6 @@ struct ChatView: View {
@State private var selectedMember: GroupMember? = nil
var body: some View {
if #available(iOS 16.0, *) {
viewBody
.scrollDismissesKeyboard(.immediately)
.keyboardPadding()
} else {
viewBody
}
}
private var viewBody: some View {
let cInfo = chat.chatInfo
return VStack(spacing: 0) {
if searchMode {
@@ -75,14 +65,17 @@ struct ChatView: View {
.navigationTitle(cInfo.chatViewName)
.navigationBarTitleDisplayMode(.inline)
.onAppear {
initChatView()
}
.onChange(of: chatModel.chatId) { cId in
if cId != nil {
initChatView()
} else {
dismiss()
if chatModel.draftChatId == cInfo.id, let draft = chatModel.draft {
composeState = draft
}
if chat.chatStats.unreadChat {
Task {
await markChatUnread(chat, unreadChat: false)
}
}
}
.onChange(of: chatModel.chatId) { _ in
if chatModel.chatId == nil { dismiss() }
}
.onDisappear {
VideoPlayerView.players.removeAll()
@@ -192,32 +185,6 @@ struct ChatView: View {
}
}
private func initChatView() {
let cInfo = chat.chatInfo
if case let .direct(contact) = cInfo {
Task {
do {
let (stats, _) = try await apiContactInfo(chat.chatInfo.apiId)
await MainActor.run {
if let s = stats {
chatModel.updateContactConnectionStats(contact, s)
}
}
} catch let error {
logger.error("apiContactInfo error: \(responseError(error))")
}
}
}
if chatModel.draftChatId == cInfo.id, let draft = chatModel.draft {
composeState = draft
}
if chat.chatStats.unreadChat {
Task {
await markChatUnread(chat, unreadChat: false)
}
}
}
private func searchToolbar() -> some View {
HStack {
HStack {
@@ -627,7 +594,6 @@ struct ChatView: View {
menu.append(viewInfoUIAction())
menu.append(deleteUIAction())
} else if ci.isDeletedContent {
menu.append(viewInfoUIAction())
menu.append(deleteUIAction())
}
return menu
@@ -650,7 +616,7 @@ struct ChatView: View {
private func reactionUIMenuPreiOS16(_ rs: [UIAction]) -> UIMenu {
UIMenu(
title: NSLocalizedString("React", comment: "chat item menu"),
title: NSLocalizedString("React...", comment: "chat item menu"),
image: UIImage(systemName: "face.smiling"),
children: rs
)
@@ -770,12 +736,6 @@ struct ChatView: View {
await MainActor.run {
chatItemInfo = ciInfo
}
if case let .group(gInfo) = chat.chatInfo {
let groupMembers = await apiListMembers(gInfo.groupId)
await MainActor.run {
ChatModel.shared.groupMembers = groupMembers
}
}
} catch let error {
logger.error("apiGetChatItemInfo error: \(responseError(error))")
}

View File

@@ -234,7 +234,7 @@ struct ComposeView: View {
@EnvironmentObject var chatModel: ChatModel
@ObservedObject var chat: Chat
@Binding var composeState: ComposeState
@Binding var keyboardVisible: Bool
@FocusState.Binding var keyboardVisible: Bool
@State var linkUrl: URL? = nil
@State var prevLinkUrl: URL? = nil
@@ -665,21 +665,17 @@ struct ComposeView: View {
if let oldMsgContent = ei.content.msgContent {
do {
let mc = updateMsgContent(oldMsgContent)
if mc != oldMsgContent || (ei.meta.itemLive ?? false) {
let chatItem = try await apiUpdateChatItem(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
itemId: ei.id,
msg: mc,
live: live
)
await MainActor.run {
_ = self.chatModel.upsertChatItem(self.chat.chatInfo, chatItem)
}
return chatItem
} else {
return nil
let chatItem = try await apiUpdateChatItem(
type: chat.chatInfo.chatType,
id: chat.chatInfo.apiId,
itemId: ei.id,
msg: mc,
live: live
)
await MainActor.run {
_ = self.chatModel.upsertChatItem(self.chat.chatInfo, chatItem)
}
return chatItem
} catch {
logger.error("ChatView.sendMessage error: \(error.localizedDescription)")
AlertManager.shared.showAlertMsg(title: "Error updating message", message: "Error: \(responseError(error))")
@@ -947,18 +943,19 @@ struct ComposeView_Previews: PreviewProvider {
static var previews: some View {
let chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
@State var composeState = ComposeState(message: "hello")
@FocusState var keyboardVisible: Bool
return Group {
ComposeView(
chat: chat,
composeState: $composeState,
keyboardVisible: Binding.constant(true)
keyboardVisible: $keyboardVisible
)
.environmentObject(ChatModel())
ComposeView(
chat: chat,
composeState: $composeState,
keyboardVisible: Binding.constant(true)
keyboardVisible: $keyboardVisible
)
.environmentObject(ChatModel())
}

View File

@@ -16,7 +16,7 @@ struct NativeTextEditor: UIViewRepresentable {
@Binding var disableEditing: Bool
let height: CGFloat
let font: UIFont
@Binding var focused: Bool
@FocusState.Binding var focused: Bool
let alignment: TextAlignment
let onImagesAdded: ([UploadContent]) -> Void
@@ -144,12 +144,13 @@ private class CustomUITextField: UITextView, UITextViewDelegate {
struct NativeTextEditor_Previews: PreviewProvider{
static var previews: some View {
@FocusState var keyboardVisible: Bool
return NativeTextEditor(
text: Binding.constant("Hello, world!"),
disableEditing: Binding.constant(false),
height: 100,
font: UIFont.preferredFont(forTextStyle: .body),
focused: Binding.constant(false),
focused: $keyboardVisible,
alignment: TextAlignment.leading,
onImagesAdded: { _ in }
)

View File

@@ -27,7 +27,7 @@ struct SendMessageView: View {
var onMediaAdded: ([UploadContent]) -> Void
@State private var holdingVMR = false
@Namespace var namespace
@Binding var keyboardVisible: Bool
@FocusState.Binding var keyboardVisible: Bool
@State private var teHeight: CGFloat = 42
@State private var teFont: Font = .body
@State private var teUiFont: UIFont = UIFont.preferredFont(forTextStyle: .body)
@@ -401,6 +401,7 @@ struct SendMessageView_Previews: PreviewProvider {
@State var composeStateNew = ComposeState()
let ci = ChatItem.getSample(1, .directSnd, .now, "hello")
@State var composeStateEditing = ComposeState(editingItem: ci)
@FocusState var keyboardVisible: Bool
@State var sendEnabled: Bool = true
return Group {
@@ -411,7 +412,7 @@ struct SendMessageView_Previews: PreviewProvider {
composeState: $composeStateNew,
sendMessage: { _ in },
onMediaAdded: { _ in },
keyboardVisible: Binding.constant(true)
keyboardVisible: $keyboardVisible
)
}
VStack {
@@ -421,7 +422,7 @@ struct SendMessageView_Previews: PreviewProvider {
composeState: $composeStateEditing,
sendMessage: { _ in },
onMediaAdded: { _ in },
keyboardVisible: Binding.constant(true)
keyboardVisible: $keyboardVisible
)
}
}

View File

@@ -9,8 +9,6 @@
import SwiftUI
import SimpleXChat
let SMALL_GROUPS_RCPS_MEM_LIMIT: Int = 20
struct GroupChatInfoView: View {
@EnvironmentObject var chatModel: ChatModel
@Environment(\.dismiss) var dismiss: DismissAction
@@ -23,8 +21,6 @@ struct GroupChatInfoView: View {
@State private var showAddMembersSheet: Bool = false
@State private var connectionStats: ConnectionStats?
@State private var connectionCode: String?
@State private var sendReceipts = SendReceipts.userDefault(true)
@State private var sendReceiptsUserDefault = true
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@State private var searchText: String = ""
@FocusState private var searchFocussed
@@ -34,7 +30,6 @@ struct GroupChatInfoView: View {
case clearChatAlert
case leaveGroupAlert
case cantInviteIncognitoAlert
case largeGroupReceiptsDisabled
var id: GroupChatInfoViewAlert { get { self } }
}
@@ -57,11 +52,6 @@ struct GroupChatInfoView: View {
addOrEditWelcomeMessage()
}
groupPreferencesButton($groupInfo)
if members.filter { $0.memberCurrent }.count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
sendReceiptsOption()
} else {
sendReceiptsOptionDisabled()
}
} header: {
Text("")
} footer: {
@@ -125,14 +115,9 @@ struct GroupChatInfoView: View {
case .clearChatAlert: return clearChatAlert()
case .leaveGroupAlert: return leaveGroupAlert()
case .cantInviteIncognitoAlert: return cantInviteIncognitoAlert()
case .largeGroupReceiptsDisabled: return largeGroupReceiptsDisabledAlert()
}
}
.onAppear {
if let currentUser = chatModel.currentUser {
sendReceiptsUserDefault = currentUser.sendRcptsSmallGroups
}
sendReceipts = SendReceipts.fromBool(groupInfo.chatSettings.sendRcpts, userDefault: sendReceiptsUserDefault)
do {
if let link = try apiGetGroupLink(groupInfo.groupId) {
(groupLink, groupLinkMemberRole) = link
@@ -141,7 +126,6 @@ struct GroupChatInfoView: View {
logger.error("GroupChatInfoView apiGetGroupLink: \(responseError(error))")
}
}
.keyboardPadding()
}
private func groupInfoHeader() -> some View {
@@ -153,14 +137,12 @@ struct GroupChatInfoView: View {
.padding()
Text(cInfo.displayName)
.font(.largeTitle)
.multilineTextAlignment(.center)
.lineLimit(4)
.lineLimit(1)
.padding(.bottom, 2)
if cInfo.fullName != "" && cInfo.fullName != cInfo.displayName {
Text(cInfo.fullName)
.font(.title2)
.multilineTextAlignment(.center)
.lineLimit(8)
.lineLimit(2)
}
}
.frame(maxWidth: .infinity, alignment: .center)
@@ -343,38 +325,6 @@ struct GroupChatInfoView: View {
secondaryButton: .cancel()
)
}
private func sendReceiptsOption() -> some View {
Picker(selection: $sendReceipts) {
ForEach([.yes, .no, .userDefault(sendReceiptsUserDefault)]) { (opt: SendReceipts) in
Text(opt.text)
}
} label: {
Label("Send receipts", systemImage: "checkmark.message")
}
.frame(height: 36)
.onChange(of: sendReceipts) { _ in
setSendReceipts()
}
}
private func setSendReceipts() {
var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults
chatSettings.sendRcpts = sendReceipts.bool()
updateChatSettings(chat, chatSettings: chatSettings)
}
private func sendReceiptsOptionDisabled() -> some View {
HStack {
Label("Send receipts", systemImage: "checkmark.message")
Spacer()
Text("disabled")
.foregroundStyle(.secondary)
}
.onTapGesture {
alert = .largeGroupReceiptsDisabled
}
}
}
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bool = false) -> some View {
@@ -403,13 +353,6 @@ func cantInviteIncognitoAlert() -> Alert {
)
}
func largeGroupReceiptsDisabledAlert() -> Alert {
Alert(
title: Text("Receipts are disabled"),
message: Text("This group has over \(SMALL_GROUPS_RCPS_MEM_LIMIT) members, delivery receipts are not sent.")
)
}
struct GroupChatInfoView_Previews: PreviewProvider {
static var previews: some View {
GroupChatInfoView(chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []), groupInfo: GroupInfo.sampleData)

View File

@@ -27,8 +27,6 @@ struct GroupMemberInfoView: View {
case changeMemberRoleAlert(mem: GroupMember, role: GroupMemberRole)
case switchAddressAlert
case abortSwitchAddressAlert
case syncConnectionForceAlert
case connectViaMemberAddressAlert(contactLink: String)
case connRequestSentAlert(type: ConnReqType)
case error(title: LocalizedStringKey, error: LocalizedStringKey)
case other(alert: Alert)
@@ -39,8 +37,6 @@ struct GroupMemberInfoView: View {
case let .changeMemberRoleAlert(_, role): return "changeMemberRoleAlert \(role.rawValue)"
case .switchAddressAlert: return "switchAddressAlert"
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
case .connectViaMemberAddressAlert: return "connectViaMemberAddressAlert"
case .connRequestSentAlert: return "connRequestSentAlert"
case let .error(title, _): return "error \(title)"
case let .other(alert): return "other \(alert)"
@@ -81,13 +77,6 @@ struct GroupMemberInfoView: View {
}
}
if let code = connectionCode { verifyCodeButton(code) }
if let connStats = connectionStats,
connStats.ratchetSyncAllowed {
synchronizeConnectionButton()
}
// } else if developerTools {
// synchronizeConnectionButtonForce()
// }
}
}
@@ -140,18 +129,12 @@ struct GroupMemberInfoView: View {
Button("Change receiving address") {
alert = .switchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|| connStats.ratchetSyncSendProhibited
)
.disabled(connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil })
if connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil } {
Button("Abort changing address") {
alert = .abortSwitchAddressAlert
}
.disabled(
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch }
|| connStats.ratchetSyncSendProhibited
)
.disabled(connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil && !$0.canAbortSwitch })
}
smpServers("Receiving via", connStats.rcvQueuesInfo.map { $0.rcvServer })
smpServers("Sending via", connStats.sndQueuesInfo.map { $0.sndServer })
@@ -179,7 +162,7 @@ struct GroupMemberInfoView: View {
}
newRole = member.memberRole
do {
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let stats = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
member = mem
connectionStats = stats
@@ -202,8 +185,6 @@ struct GroupMemberInfoView: View {
case let .changeMemberRoleAlert(mem, _): return changeMemberRoleAlert(mem)
case .switchAddressAlert: return switchAddressAlert(switchMemberAddress)
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchMemberAddress)
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) })
case let .connectViaMemberAddressAlert(contactLink): return connectViaMemberAddressAlert(contactLink)
case let .connRequestSentAlert(type): return connReqSentAlert(type)
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
case let .other(alert): return alert
@@ -213,23 +194,12 @@ struct GroupMemberInfoView: View {
func connectViaAddressButton(_ contactLink: String) -> some View {
Button {
alert = .connectViaMemberAddressAlert(contactLink: contactLink)
connectViaAddress(contactLink)
} label: {
Label("Connect", systemImage: "link")
}
}
func connectViaMemberAddressAlert(_ contactLink: String) -> Alert {
return Alert(
title: Text("Connect directly?"),
message: Text("Сonnection request will be sent to this group member."),
primaryButton: .default(Text("Connect")) {
connectViaAddress(contactLink)
},
secondaryButton: .cancel()
)
}
func connectViaAddress(_ contactLink: String) {
Task {
let (connReqType, connectAlert) = await apiConnect_(connReq: contactLink)
@@ -275,30 +245,19 @@ struct GroupMemberInfoView: View {
.frame(width: 192, height: 192)
.padding(.top, 12)
.padding()
if mem.verified {
(
Text(Image(systemName: "checkmark.shield"))
.foregroundColor(.secondary)
.font(.title2)
+ Text(" ")
+ Text(mem.displayName)
.font(.largeTitle)
)
.multilineTextAlignment(.center)
.lineLimit(2)
.padding(.bottom, 2)
} else {
HStack {
if mem.verified {
Image(systemName: "checkmark.shield")
}
Text(mem.displayName)
.font(.largeTitle)
.multilineTextAlignment(.center)
.lineLimit(2)
.padding(.bottom, 2)
.lineLimit(1)
}
.padding(.bottom, 2)
if mem.fullName != "" && mem.fullName != mem.displayName {
Text(mem.fullName)
.font(.title2)
.multilineTextAlignment(.center)
.lineLimit(4)
.lineLimit(2)
}
}
.frame(maxWidth: .infinity, alignment: .center)
@@ -332,24 +291,7 @@ struct GroupMemberInfoView: View {
systemImage: member.verified ? "checkmark.shield" : "shield"
)
}
}
private func synchronizeConnectionButton() -> some View {
Button {
syncMemberConnection(force: false)
} label: {
Label("Fix connection", systemImage: "exclamationmark.arrow.triangle.2.circlepath")
.foregroundColor(.orange)
}
}
private func synchronizeConnectionButtonForce() -> some View {
Button {
alert = .syncConnectionForceAlert
} label: {
Label("Renegotiate encryption", systemImage: "exclamationmark.triangle")
.foregroundColor(.red)
}
}
private func removeMemberButton(_ mem: GroupMember) -> some View {
@@ -415,11 +357,7 @@ struct GroupMemberInfoView: View {
Task {
do {
let stats = try apiSwitchGroupMember(groupInfo.apiId, member.groupMemberId)
connectionStats = stats
await MainActor.run {
chatModel.updateGroupMemberConnectionStats(groupInfo, member, stats)
dismiss()
}
connectionStats = stats
} catch let error {
logger.error("switchMemberAddress apiSwitchGroupMember error: \(responseError(error))")
let a = getErrorAlert(error, "Error changing address")
@@ -435,9 +373,6 @@ struct GroupMemberInfoView: View {
do {
let stats = try apiAbortSwitchGroupMember(groupInfo.apiId, member.groupMemberId)
connectionStats = stats
await MainActor.run {
chatModel.updateGroupMemberConnectionStats(groupInfo, member, stats)
}
} catch let error {
logger.error("abortSwitchMemberAddress apiAbortSwitchGroupMember error: \(responseError(error))")
let a = getErrorAlert(error, "Error aborting address change")
@@ -447,25 +382,6 @@ struct GroupMemberInfoView: View {
}
}
}
private func syncMemberConnection(force: Bool) {
Task {
do {
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, member.groupMemberId, force)
connectionStats = stats
await MainActor.run {
chatModel.updateGroupMemberConnectionStats(groupInfo, mem, stats)
dismiss()
}
} catch let error {
logger.error("syncMemberConnection apiSyncGroupMemberRatchet error: \(responseError(error))")
let a = getErrorAlert(error, "Error synchronizing connection")
await MainActor.run {
alert = .error(title: a.title, error: a.message)
}
}
}
}
}
struct GroupMemberInfoView_Previews: PreviewProvider {

View File

@@ -263,7 +263,6 @@ struct ChatListNavLink: View {
.sheet(isPresented: $showContactConnectionInfo) {
if case let .contactConnection(contactConnection) = chat.chatInfo {
ContactConnectionInfo(contactConnection: contactConnection)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
}
}
.onTapGesture {
@@ -380,7 +379,6 @@ struct ChatListNavLink: View {
.onTapGesture { showInvalidJSON = true }
.sheet(isPresented: $showInvalidJSON) {
invalidJSONView(json)
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
}
}
}

View File

@@ -18,14 +18,6 @@ struct ChatListView: View {
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
var body: some View {
if #available(iOS 16.0, *) {
viewBody.scrollDismissesKeyboard(.immediately)
} else {
viewBody
}
}
private var viewBody: some View {
ZStack(alignment: .topLeading) {
NavStackCompat(
isActive: Binding(
@@ -63,40 +55,12 @@ struct ChatListView: View {
.onChange(of: chatModel.appOpenUrl) { _ in connectViaUrl() }
.onAppear() { connectViaUrl() }
.onDisappear() { withAnimation { userPickerVisible = false } }
.refreshable {
AlertManager.shared.showAlert(Alert(
title: Text("Reconnect servers?"),
message: Text("Reconnect all connected servers to force message delivery. It uses additional traffic."),
primaryButton: .default(Text("Ok")) {
Task {
do {
try await reconnectAllServers()
} catch let error {
AlertManager.shared.showAlertMsg(title: "Error", message: "\(responseError(error))")
}
}
},
secondaryButton: .cancel()
))
}
.offset(x: -8)
.listStyle(.plain)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
let user = chatModel.currentUser ?? User.sampleData
ZStack(alignment: .topTrailing) {
ProfileImage(imageStr: user.image, color: Color(uiColor: .quaternaryLabel))
.frame(width: 32, height: 32)
.padding(.trailing, 4)
let allRead = chatModel.users
.filter { u in !u.user.activeUser && !u.user.hidden }
.allSatisfy { u in u.unreadCount == 0 }
if !allRead {
unreadBadge(size: 12)
}
}
.onTapGesture {
Button {
if chatModel.users.filter({ u in u.user.activeUser || !u.user.hidden }).count > 1 {
withAnimation {
userPickerVisible.toggle()
@@ -104,6 +68,19 @@ struct ChatListView: View {
} else {
showSettings = true
}
} label: {
let user = chatModel.currentUser ?? User.sampleData
ZStack(alignment: .topTrailing) {
ProfileImage(imageStr: user.image, color: Color(uiColor: .quaternaryLabel))
.frame(width: 32, height: 32)
.padding(.trailing, 4)
let allRead = chatModel.users
.filter { u in !u.user.activeUser && !u.user.hidden }
.allSatisfy { u in u.unreadCount == 0 }
if !allRead {
unreadBadge(size: 12)
}
}
}
}
ToolbarItem(placement: .principal) {

View File

@@ -258,20 +258,20 @@ struct ChatPreviewView_Previews: PreviewProvider {
))
ChatPreviewView(chat: Chat(
chatInfo: ChatInfo.sampleData.direct,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))]
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent)]
))
ChatPreviewView(chat: Chat(
chatInfo: ChatInfo.sampleData.direct,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent)],
chatStats: ChatStats(unreadCount: 11, minUnreadItemId: 0)
))
ChatPreviewView(chat: Chat(
chatInfo: ChatInfo.sampleData.direct,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now))]
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent, itemDeleted: .deleted(deletedTs: .now))]
))
ChatPreviewView(chat: Chat(
chatInfo: ChatInfo.sampleData.direct,
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent)],
chatStats: ChatStats(unreadCount: 3, minUnreadItemId: 0)
))
ChatPreviewView(chat: Chat(

View File

@@ -65,7 +65,7 @@ struct MigrateToAppGroupView: View {
case .exporting:
center {
ProgressView(value: 0.33)
Text("Exporting database archive")
Text("Exporting database archive...")
}
migrationProgress()
case .export_error:
@@ -82,7 +82,7 @@ struct MigrateToAppGroupView: View {
case .migrating:
center {
ProgressView(value: 0.67)
Text("Migrating database archive")
Text("Migrating database archive...")
}
migrationProgress()
case .migration_error:

View File

@@ -1,9 +0,0 @@
//
// Keyboard.swift
// SimpleX (iOS)
//
// Created by Evgeny on 10/07/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import Foundation

View File

@@ -1,21 +0,0 @@
//
// KeyboardPadding.swift
// SimpleX (iOS)
//
// Created by Evgeny on 10/07/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import SwiftUI
extension View {
@ViewBuilder func keyboardPadding() -> some View {
if #available(iOS 17.0, *) {
GeometryReader { g in
self.padding(.bottom, max(0, ChatModel.shared.keyboardHeight - g.safeAreaInsets.bottom))
}
} else {
self
}
}
}

View File

@@ -37,7 +37,7 @@ struct LocalAuthRequest {
}
func authenticate(title: LocalizedStringKey? = nil, reason: String, selfDestruct: Bool = false, completed: @escaping (LAResult) -> Void) {
logger.debug("DEBUGGING: authenticate")
logger.debug("authenticate")
switch privacyLocalAuthModeDefault.get() {
case .system: systemAuthenticate(reason, completed)
case .passcode:
@@ -58,24 +58,21 @@ func authenticate(title: LocalizedStringKey? = nil, reason: String, selfDestruct
}
func systemAuthenticate(_ reason: String, _ completed: @escaping (LAResult) -> Void) {
logger.debug("DEBUGGING: systemAuthenticate")
let laContext = LAContext()
var authAvailabilityError: NSError?
if laContext.canEvaluatePolicy(.deviceOwnerAuthentication, error: &authAvailabilityError) {
logger.debug("DEBUGGING: systemAuthenticate: canEvaluatePolicy callback")
laContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason) { success, authError in
logger.debug("DEBUGGING: systemAuthenticate evaluatePolicy callback")
DispatchQueue.main.async {
if success {
completed(LAResult.success)
} else {
logger.error("DEBUGGING: systemAuthenticate authentication error: \(authError.debugDescription)")
logger.error("authentication error: \(authError.debugDescription)")
completed(LAResult.failed(authError: authError?.localizedDescription))
}
}
}
} else {
logger.error("DEBUGGING: authentication availability error: \(authAvailabilityError.debugDescription)")
logger.error("authentication availability error: \(authAvailabilityError.debugDescription)")
completed(LAResult.unavailable(authError: authAvailabilityError?.localizedDescription))
}
}

View File

@@ -36,7 +36,7 @@ struct AddGroupView: View {
}
}
} else {
createGroupView().keyboardPadding()
createGroupView()
}
}

View File

@@ -104,7 +104,6 @@ struct CreateProfile: View {
}
}
.padding()
.keyboardPadding()
}
func textField(_ placeholder: LocalizedStringKey, text: Binding<String>) -> some View {

View File

@@ -220,37 +220,6 @@ private let versionDescriptions: [VersionDescription] = [
description: "Thanks to the users [contribute via Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!"
),
]
),
VersionDescription(
version: "v5.2",
post: URL(string: "https://simplex.chat/blog/20230722-simplex-chat-v5-2-message-delivery-receipts.html"),
features: [
FeatureDescription(
icon: "checkmark",
title: "Message delivery receipts!",
description: "The second tick we missed! ✅"
),
FeatureDescription(
icon: "star",
title: "Find chats faster",
description: "Filter unread and favorite chats."
),
FeatureDescription(
icon: "exclamationmark.arrow.triangle.2.circlepath",
title: "Keep your connections",
description: "Fix encryption after restoring backups."
),
FeatureDescription(
icon: "stopwatch",
title: "Make one message disappear",
description: "Even when disabled in the conversation."
),
FeatureDescription(
icon: "gift",
title: "A few more things",
description: "- more stable message delivery.\n- a bit better groups.\n- and more!"
),
]
)
]

View File

@@ -18,7 +18,7 @@ struct TerminalView: View {
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
@State var composeState: ComposeState = ComposeState()
@State private var keyboardVisible = false
@FocusState private var keyboardVisible: Bool
@State var authorized = !UserDefaults.standard.bool(forKey: DEFAULT_PERFORM_LA)
@State private var terminalItem: TerminalItem?
@State private var scrolled = false

View File

@@ -51,9 +51,8 @@ struct AdvancedNetworkSettings: View {
}
.disabled(currentNetCfg == NetCfg.proxyDefaults)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [5_000000, 7_500000, 10_000000, 15_000000, 20_000000, 30_000000, 45_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout", selection: $netCfg.tcpTimeout, values: [3_000000, 5_000000, 7_000000, 10_000000, 15_000000, 20_000000, 30_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout per KB", selection: $netCfg.tcpTimeoutPerKb, values: [10_000, 20_000, 40_000, 75_000, 100_000], label: secondsLabel)
timeoutSettingPicker("TCP connection timeout", selection: $netCfg.tcpConnectTimeout, values: [2_500000, 5_000000, 7_500000, 10_000000, 15_000000, 20_000000], label: secondsLabel)
timeoutSettingPicker("Protocol timeout", selection: $netCfg.tcpTimeout, values: [1_500000, 3_000000, 5_000000, 7_000000, 10_000000, 15_000000], label: secondsLabel)
timeoutSettingPicker("PING interval", selection: $netCfg.smpPingInterval, values: [120_000000, 300_000000, 600_000000, 1200_000000, 2400_000000, 3600_000000], label: secondsLabel)
intSettingPicker("PING count", selection: $netCfg.smpPingCount, values: [1, 2, 3, 5, 8], label: "")
Toggle("Enable TCP keep-alive", isOn: $enableKeepAlive)
@@ -153,9 +152,7 @@ struct AdvancedNetworkSettings: View {
private func timeoutSettingPicker(_ title: LocalizedStringKey, selection: Binding<Int>, values: [Int], label: String) -> some View {
Picker(title, selection: selection) {
let v = selection.wrappedValue
let vs = values.contains(v) ? values : values + [v]
ForEach(vs, id: \.self) { value in
ForEach(values, id: \.self) { value in
Text("\(String(format: "%g", (Double(value) / 1000000))) \(secondsLabel)")
}
}

View File

@@ -11,12 +11,9 @@ import SimpleXChat
struct NotificationsView: View {
@EnvironmentObject var m: ChatModel
@State private var notificationMode: NotificationsMode = ChatModel.shared.notificationMode
@State private var notificationMode: NotificationsMode?
@State private var showAlert: NotificationAlert?
@State private var legacyDatabase = dbContainerGroupDefault.get() == .documents
// @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
// @AppStorage(GROUP_DEFAULT_NTF_ENABLE_LOCAL, store: groupDefaults) private var ntfEnableLocal = false
// @AppStorage(GROUP_DEFAULT_NTF_ENABLE_PERIODIC, store: groupDefaults) private var ntfEnablePeriodic = false
var body: some View {
List {
@@ -29,7 +26,9 @@ struct NotificationsView: View {
}
} footer: {
VStack(alignment: .leading) {
Text(ntfModeDescription(notificationMode))
if let mode = notificationMode {
Text(ntfModeDescription(mode))
}
}
.font(.callout)
.padding(.top, 1)
@@ -44,6 +43,7 @@ struct NotificationsView: View {
return Alert(title: Text("No device token!"))
}
}
.onAppear { notificationMode = m.notificationMode }
} label: {
HStack {
Text("Send notifications")
@@ -76,7 +76,7 @@ struct NotificationsView: View {
HStack {
Text("Show preview")
Spacer()
Text(m.notificationPreview.label)
Text(m.notificationPreview?.label ?? "")
}
}
} header: {
@@ -88,15 +88,8 @@ struct NotificationsView: View {
.padding(.top, 1)
}
}
// if developerTools {
// Section(String("Experimental")) {
// Toggle(String("Always enable local"), isOn: $ntfEnableLocal)
// Toggle(String("Always enable periodic"), isOn: $ntfEnablePeriodic)
// }
// }
.disabled(legacyDatabase)
}
.disabled(legacyDatabase)
}
private func notificationAlert(_ alert: NotificationAlert, _ token: DeviceToken) -> Alert {
@@ -173,7 +166,7 @@ func ntfModeDescription(_ mode: NotificationsMode) -> LocalizedStringKey {
struct SelectionListView<Item: SelectableItem>: View {
var list: [Item]
@Binding var selection: Item
@Binding var selection: Item?
var onSelection: ((Item) -> Void)?
@State private var tapped: Item? = nil

View File

@@ -10,32 +10,12 @@ import SwiftUI
import SimpleXChat
struct PrivacySettings: View {
@EnvironmentObject var m: ChatModel
@AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true
@AppStorage(DEFAULT_PRIVACY_LINK_PREVIEWS) private var useLinkPreviews = true
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
@State private var currentLAMode = privacyLocalAuthModeDefault.get()
@State private var contactReceipts = false
@State private var contactReceiptsReset = false
@State private var contactReceiptsOverrides = 0
@State private var contactReceiptsDialogue = false
@State private var groupReceipts = false
@State private var groupReceiptsReset = false
@State private var groupReceiptsOverrides = 0
@State private var groupReceiptsDialogue = false
@State private var alert: PrivacySettingsViewAlert?
enum PrivacySettingsViewAlert: Identifiable {
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
var id: String {
switch self {
case let .error(title, _): return "error \(title)"
}
}
}
var body: some View {
VStack {
@@ -88,175 +68,6 @@ struct PrivacySettings: View {
Text("Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.")
}
}
Section {
settingsRow("person") {
Toggle("Contacts", isOn: $contactReceipts)
}
settingsRow("person.2") {
Toggle("Small groups (max 20)", isOn: $groupReceipts)
}
} header: {
Text("Send delivery receipts to")
} footer: {
VStack(alignment: .leading) {
Text("These settings are for your current profile **\(ChatModel.shared.currentUser?.displayName ?? "")**.")
Text("They can be overridden in contact and group settings.")
}
.frame(maxWidth: .infinity, alignment: .leading)
}
.confirmationDialog(contactReceiptsDialogTitle, isPresented: $contactReceiptsDialogue, titleVisibility: .visible) {
Button(contactReceipts ? "Enable (keep overrides)" : "Disable (keep overrides)") {
setSendReceiptsContacts(contactReceipts, clearOverrides: false)
}
Button(contactReceipts ? "Enable for all" : "Disable for all", role: .destructive) {
setSendReceiptsContacts(contactReceipts, clearOverrides: true)
}
Button("Cancel", role: .cancel) {
contactReceiptsReset = true
contactReceipts.toggle()
}
}
.confirmationDialog(groupReceiptsDialogTitle, isPresented: $groupReceiptsDialogue, titleVisibility: .visible) {
Button(groupReceipts ? "Enable (keep overrides)" : "Disable (keep overrides)") {
setSendReceiptsGroups(groupReceipts, clearOverrides: false)
}
Button(contactReceipts ? "Enable for all" : "Disable for all", role: .destructive) {
setSendReceiptsGroups(groupReceipts, clearOverrides: true)
}
Button("Cancel", role: .cancel) {
groupReceiptsReset = true
groupReceipts.toggle()
}
}
}
}
.onChange(of: contactReceipts) { _ in
if contactReceiptsReset {
contactReceiptsReset = false
} else {
setOrAskSendReceiptsContacts(contactReceipts)
}
}
.onChange(of: groupReceipts) { _ in
if groupReceiptsReset {
groupReceiptsReset = false
} else {
setOrAskSendReceiptsGroups(groupReceipts)
}
}
.onAppear {
if let u = m.currentUser {
if contactReceipts != u.sendRcptsContacts {
contactReceiptsReset = true
contactReceipts = u.sendRcptsContacts
}
if groupReceipts != u.sendRcptsSmallGroups {
groupReceiptsReset = true
groupReceipts = u.sendRcptsSmallGroups
}
}
}
.alert(item: $alert) { alert in
switch alert {
case let .error(title, error):
return Alert(title: Text(title), message: Text(error))
}
}
}
private func setOrAskSendReceiptsContacts(_ enable: Bool) {
contactReceiptsOverrides = m.chats.reduce(0) { count, chat in
let sendRcpts = chat.chatInfo.contact?.chatSettings.sendRcpts
return count + (sendRcpts == nil || sendRcpts == enable ? 0 : 1)
}
if contactReceiptsOverrides == 0 {
setSendReceiptsContacts(enable, clearOverrides: false)
} else {
contactReceiptsDialogue = true
}
}
private var contactReceiptsDialogTitle: LocalizedStringKey {
contactReceipts
? "Sending receipts is disabled for \(contactReceiptsOverrides) contacts"
: "Sending receipts is enabled for \(contactReceiptsOverrides) contacts"
}
private func setSendReceiptsContacts(_ enable: Bool, clearOverrides: Bool) {
Task {
do {
if let currentUser = m.currentUser {
let userMsgReceiptSettings = UserMsgReceiptSettings(enable: enable, clearOverrides: clearOverrides)
try await apiSetUserContactReceipts(currentUser.userId, userMsgReceiptSettings: userMsgReceiptSettings)
privacyDeliveryReceiptsSet.set(true)
await MainActor.run {
var updatedUser = currentUser
updatedUser.sendRcptsContacts = enable
m.updateUser(updatedUser)
if clearOverrides {
m.chats.forEach { chat in
if var contact = chat.chatInfo.contact {
let sendRcpts = contact.chatSettings.sendRcpts
if sendRcpts != nil && sendRcpts != enable {
contact.chatSettings.sendRcpts = nil
m.updateContact(contact)
}
}
}
}
}
}
} catch let error {
alert = .error(title: "Error setting contact delivery receipts!", error: "Error: \(responseError(error))")
}
}
}
private func setOrAskSendReceiptsGroups(_ enable: Bool) {
groupReceiptsOverrides = m.chats.reduce(0) { count, chat in
let sendRcpts = chat.chatInfo.groupInfo?.chatSettings.sendRcpts
return count + (sendRcpts == nil || sendRcpts == enable ? 0 : 1)
}
if groupReceiptsOverrides == 0 {
setSendReceiptsGroups(enable, clearOverrides: false)
} else {
groupReceiptsDialogue = true
}
}
private var groupReceiptsDialogTitle: LocalizedStringKey {
groupReceipts
? "Sending receipts is disabled for \(groupReceiptsOverrides) groups"
: "Sending receipts is enabled for \(groupReceiptsOverrides) groups"
}
private func setSendReceiptsGroups(_ enable: Bool, clearOverrides: Bool) {
Task {
do {
if let currentUser = m.currentUser {
let userMsgReceiptSettings = UserMsgReceiptSettings(enable: enable, clearOverrides: clearOverrides)
try await apiSetUserGroupReceipts(currentUser.userId, userMsgReceiptSettings: userMsgReceiptSettings)
privacyDeliveryReceiptsSet.set(true)
await MainActor.run {
var updatedUser = currentUser
updatedUser.sendRcptsSmallGroups = enable
m.updateUser(updatedUser)
if clearOverrides {
m.chats.forEach { chat in
if var groupInfo = chat.chatInfo.groupInfo {
let sendRcpts = groupInfo.chatSettings.sendRcpts
if sendRcpts != nil && sendRcpts != enable {
groupInfo.chatSettings.sendRcpts = nil
m.updateGroup(groupInfo)
}
}
}
}
}
}
} catch let error {
alert = .error(title: "Error setting group delivery receipts!", error: "Error: \(responseError(error))")
}
}
}

View File

@@ -1,100 +0,0 @@
//
// SetDeliveryReceiptsView.swift
// SimpleX (iOS)
//
// Created by Evgeny on 12/07/2023.
// Copyright © 2023 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct SetDeliveryReceiptsView: View {
@EnvironmentObject var m: ChatModel
var body: some View {
VStack(spacing: 16) {
Text("Delivery receipts!")
.font(.title)
.foregroundColor(.secondary)
.padding(.vertical)
.multilineTextAlignment(.center)
Spacer()
Button("Enable") {
Task {
do {
if let currentUser = m.currentUser {
try await apiSetAllContactReceipts(enable: true)
await MainActor.run {
var updatedUser = currentUser
updatedUser.sendRcptsContacts = true
m.updateUser(updatedUser)
m.setDeliveryReceipts = false
privacyDeliveryReceiptsSet.set(true)
}
do {
let users = try await listUsersAsync()
await MainActor.run { m.users = users }
} catch let error {
logger.debug("listUsers error: \(responseError(error))")
}
}
} catch let error {
AlertManager.shared.showAlert(Alert(
title: Text("Error enabling delivery receipts!"),
message: Text("Error: \(responseError(error))")
))
await MainActor.run {
m.setDeliveryReceipts = false
}
}
}
}
.font(.largeTitle)
Group {
if m.users.count > 1 {
Text("Sending delivery receipts will be enabled for all contacts in all visible chat profiles.")
} else {
Text("Sending delivery receipts will be enabled for all contacts.")
}
}
.multilineTextAlignment(.center)
Spacer()
VStack(spacing: 8) {
Button {
AlertManager.shared.showAlert(Alert(
title: Text("Delivery receipts are disabled!"),
message: Text("You can enable them later via app Privacy & Security settings."),
primaryButton: .default(Text("Don't show again")) {
m.setDeliveryReceipts = false
privacyDeliveryReceiptsSet.set(true)
},
secondaryButton: .default(Text("Ok")) {
m.setDeliveryReceipts = false
}
))
} label: {
HStack {
Text("Don't enable")
Image(systemName: "chevron.right")
}
}
Text("You can enable later via Settings").font(.footnote)
}
}
.padding()
.padding(.horizontal)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(uiColor: .systemBackground))
}
}
struct SetDeliveryReceiptsView_Previews: PreviewProvider {
static var previews: some View {
SetDeliveryReceiptsView()
}
}

View File

@@ -31,7 +31,6 @@ let DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
let DEFAULT_PRIVACY_LINK_PREVIEWS = "privacyLinkPreviews"
let DEFAULT_PRIVACY_SIMPLEX_LINK_MODE = "privacySimplexLinkMode"
let DEFAULT_PRIVACY_PROTECT_SCREEN = "privacyProtectScreen"
let DEFAULT_PRIVACY_DELIVERY_RECEIPTS_SET = "privacyDeliveryReceiptsSet"
let DEFAULT_EXPERIMENTAL_CALLS = "experimentalCalls"
let DEFAULT_CHAT_ARCHIVE_NAME = "chatArchiveName"
let DEFAULT_CHAT_ARCHIVE_TIME = "chatArchiveTime"
@@ -66,7 +65,6 @@ let appDefaults: [String: Any] = [
DEFAULT_PRIVACY_LINK_PREVIEWS: true,
DEFAULT_PRIVACY_SIMPLEX_LINK_MODE: SimpleXLinkMode.description.rawValue,
DEFAULT_PRIVACY_PROTECT_SCREEN: false,
DEFAULT_PRIVACY_DELIVERY_RECEIPTS_SET: false,
DEFAULT_EXPERIMENTAL_CALLS: false,
DEFAULT_CHAT_V3_DB_MIGRATION: V3DBMigrationState.offer.rawValue,
DEFAULT_DEVELOPER_TOOLS: false,
@@ -116,8 +114,6 @@ let privacySimplexLinkModeDefault = EnumDefault<SimpleXLinkMode>(defaults: UserD
let privacyLocalAuthModeDefault = EnumDefault<LAMode>(defaults: UserDefaults.standard, forKey: DEFAULT_LA_MODE, withDefault: .system)
let privacyDeliveryReceiptsSet = BoolDefault(defaults: UserDefaults.standard, forKey: DEFAULT_PRIVACY_DELIVERY_RECEIPTS_SET)
let onboardingStageDefault = EnumDefault<OnboardingStage>(defaults: UserDefaults.standard, forKey: DEFAULT_ONBOARDING_STAGE, withDefault: .onboardingComplete)
let customDisappearingMessageTimeDefault = IntDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME)

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="cs" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ na %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ je připojen!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- více stabilní doručování zpráv.
- o trochu lepší skupiny.
- a více!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt; Připojte se ke mne přes SimpleX Chat&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Ještě pár věcí</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Nový kontakt</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Přerušit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Přerušit změnu adresy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Přerušit změnu adresy?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Změna adresy bude přerušena. Budou použity staré přijímací adresy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Povolit nevratné smazání odeslaných zpráv.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Povolit odesílání souborů a médii.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Povolit odesílání hlasových zpráv.</target>
@@ -1151,11 +1123,6 @@
<target>Předvolby kontaktů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Kontakty</target>
<note>No comment provided by engineer.</note>
</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>Kontakty mohou označit zprávy ke smazání; vy je budete moci zobrazit.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Chyba dešifrování</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Smazáno v: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Potvrzení o doručení jsou vypnuté!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Potvrzení o doručení!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Popis</target>
@@ -1604,21 +1561,11 @@
<target>Přímé zprávy mezi členy jsou v této skupině zakázány.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Vypnout (zachovat přepsání)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Vypnutí zámku SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Vypnout pro všechny</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Mizící zpráva</target>
@@ -1679,11 +1626,6 @@
<target>Nevytvářet adresu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Nepovolovat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Znovu neukazuj</target>
@@ -1724,11 +1666,6 @@
<target>Zapnout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Povolit (zachovat přepsání)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Zapnutí zámku SimpleX</target>
@@ -1744,11 +1681,6 @@
<target>Povolit automatické mazání zpráv?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Povolit pro všechny</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Povolit okamžitá oznámení?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Chyba přerušení změny adresy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Chyba mazání uživatelského profilu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Chyba povolení potvrzení o doručení!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Chyba při aktivaci oznámení</target>
@@ -2044,10 +1970,6 @@
<target>Chyba při odesílání zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Chyba při spuštění chatu</target>
@@ -2063,11 +1985,6 @@
<target>Chyba při přepínání profilu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Chyba synchronizace připojení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Chyba aktualizace odkazu skupiny</target>
@@ -2108,11 +2025,6 @@
<target>Chyba: žádný soubor databáze</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>I při vypnutí v konverzaci.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Ukončit bez uložení</target>
@@ -2133,9 +2045,9 @@
<target>Exportovaný archiv databáze.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Exportuji archiv databáze</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Exportuji archiv databáze...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2150,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Oblíbené</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2178,66 +2089,11 @@
<target>Soubory a média</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Soubory a média</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Soubory a média jsou zakázány v této skupině.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Soubory a média jsou zakázány!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filtrovat nepřečtené a oblíbené chaty.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Konečně je máme! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Najděte chaty rychleji</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Opravit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Opravit připojení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Opravit připojení?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Opravit šifrování po obnovení zálohy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Opravit nepodporované kontaktem</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Opravit nepodporované členem skupiny</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Pro konzoli</target>
@@ -2343,11 +2199,6 @@
<target>Členové skupiny mohou posílat mizící zprávy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Členové skupiny mohou posílat soubory a média.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Členové skupiny mohou posílat hlasové zprávy.</target>
@@ -2543,11 +2394,6 @@
<target>Vylepšená konfigurace serveru</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>V odpovědi na</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Inkognito</target>
@@ -2731,11 +2577,6 @@
<target>Připojení ke skupině</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Zachovat vaše připojení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Chyba klíčenky</target>
@@ -2826,11 +2667,6 @@
<target>Vytvořte si soukromé připojení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Nechat jednu zprávu zmizet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Změnit profil na soukromý!</target>
@@ -2901,11 +2737,6 @@
<target>Chyba doručení zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Potvrzení o doručení zprávy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Návrh zprávy</target>
@@ -2941,9 +2772,9 @@
<target>Zprávy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Přenášení archivu databáze</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Přenášení archivu databáze...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3096,21 +2927,11 @@
<target>Žádný token zařízení!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Žádné filtrované chaty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Skupina nebyla nalezena!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Žádná historie</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>Nemáte oprávnění nahrávat hlasové zprávy</target>
@@ -3195,11 +3016,6 @@
<target>Předvolby skupiny mohou měnit pouze vlastníci skupiny.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Pouze majitelé skupiny mohou povolit soubory a média.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Pouze majitelé skupin mohou povolit zasílání hlasových zpráv.</target>
@@ -3520,11 +3336,6 @@
<target>Zakázat posílání mizících zpráv.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Zakázat odesílání souborů a médií.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Zakázat odesílání hlasových zpráv.</target>
@@ -3545,10 +3356,6 @@
<target>Časový limit protokolu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Nabízená oznámení</target>
@@ -3559,8 +3366,9 @@
<target>Ohodnoťte aplikaci</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Reagovat...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3632,14 +3440,6 @@
<target>Příjemci uvidí aktualizace během jejich psaní.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Záznam aktualizován v</target>
@@ -3700,21 +3500,6 @@
<target>Odstranit přístupovou frázi z klíčenek?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Znovu vyjednat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Znovu vyjednat šifrování</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Znovu vyjednat šifrování?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Odpověď</target>
@@ -3970,10 +3755,6 @@
<target>Poslat živou zprávu - zpráva se bude aktualizovat pro příjemce během psaní</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Odeslat přímou zprávu</target>
@@ -4009,11 +3790,6 @@
<target>Zasílání otázek a nápadů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Odeslat potvrzení</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Odeslat je z galerie nebo vlastní klávesnice.</target>
@@ -4029,31 +3805,11 @@
<target>Odesílatel možná smazal požadavek připojení.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných chat profilech.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Odesílání potvrzení o doručení bude povoleno pro všechny kontakty.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Odesílání souboru bude zastaveno.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Odesílání potvrzení o doručení je vypnuto pro %lld kontakty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Odesílání potvrzení o doručení je povoleno pro %lld kontakty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Odesílání přes</target>
@@ -4491,11 +4247,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Vytvořený archiv je k dispozici v aplikaci Nastavení / Databáze / Archiv staré databáze.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>Šifrování funguje a nové povolení šifrování není vyžadováno. To může vyvolat chybu v připojení!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Skupina je plně decentralizovaná - je viditelná pouze pro členy.</target>
@@ -4531,10 +4282,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Profil je sdílen pouze s vašimi kontakty.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>Odesílatel NEBUDE informován</target>
@@ -4560,16 +4307,6 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Měl by tam být alespoň jeden viditelný uživatelský profil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Toto nastavení je pro váš aktuální profil **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Mohou být přepsány v nastavení kontaktů</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Tuto akci nelze vrátit zpět - všechny přijaté a odeslané soubory a média budou smazány. Obrázky s nízkým rozlišením zůstanou zachovány.</target>
@@ -4585,6 +4322,11 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
<target>Tuto akci nelze vzít zpět - váš profil, kontakty, zprávy a soubory budou nenávratně ztraceny.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Tato chyba je pro toto připojení trvalá, připojte se znovu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Tato skupina již neexistuje.</target>
@@ -4699,7 +4441,6 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Odobl.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5049,16 +4790,6 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
<target>Můžete vytvořit později</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Můžete povolit později v Nastavení</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Můžete je povolit později v nastavení Soukromí &amp; Bezpečnosti aplikace</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Profil uživatele můžete skrýt nebo ztlumit - přejeďte prstem doprava.</target>
@@ -5395,16 +5126,6 @@ Servery SimpleX nevidí váš profil.</target>
<target>správce</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>povoluji šifrování pro %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>povoluji šifrování…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>vždy</target>
@@ -5465,14 +5186,14 @@ Servery SimpleX nevidí váš profil.</target>
<target>změnil vaši roli na %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>změna adresy pro %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>změna adresy pro %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>změna adresy</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>změna adresy...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5575,14 +5296,6 @@ Servery SimpleX nevidí váš profil.</target>
<target>výchozí (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>smazáno</target>
@@ -5628,46 +5341,6 @@ Servery SimpleX nevidí váš profil.</target>
<target>povoleno pro vás</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>šifrování povoleno</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>šifrování povoleno pro %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>šifrování ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>šifrování ok pro %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>opětovné vyjednávání šifrování povoleno</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>opětovné vyjednávání šifrování povoleno pro %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>vyžadováno opětovné vyjednávání šifrování</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>vyžadováno opětovné vyjednávání šifrování pro %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>ukončeno</target>
@@ -5939,11 +5612,6 @@ Servery SimpleX nevidí váš profil.</target>
<target>tajný</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>bezpečnostní kód změněn</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>začíná…</target>
@@ -6088,7 +5756,7 @@ Servery SimpleX nevidí váš profil.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="cs" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6120,7 +5788,7 @@ Servery SimpleX nevidí váš profil.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="cs" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "cs",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="de" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ an %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ ist mit Ihnen verbunden!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- stabilere Zustellung von Nachrichten.
- ein bisschen verbesserte Gruppen.
- und mehr!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Verbinden Sie sich per SimpleX Chat mit mir&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Ein paar weitere Dinge</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Ein neuer Kontakt</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Abbrechen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Wechsel der Adresse abbrechen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Wechsel der Adresse abbrechen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Der Wechsel der Adresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Unwiederbringliches löschen von gesendeten Nachrichten erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Das Senden von Dateien und Medien erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Das Senden von Sprachnachrichten erlauben.</target>
@@ -1151,11 +1123,6 @@
<target>Kontakt Präferenzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Kontakte</target>
<note>No comment provided by engineer.</note>
</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>Ihre Kontakte können Nachrichten zum Löschen markieren. Sie können diese Nachrichten trotzdem anschauen.</target>
@@ -1284,7 +1251,7 @@
<trans-unit id="Database encryption passphrase will be updated and stored in the keychain.&#10;" xml:space="preserve">
<source>Database encryption passphrase will be updated and stored in the keychain.
</source>
<target>Das Passwort für die Datenbankverschlüsselung wird aktualisiert und im Schlüsselbund gespeichert.
<target>Das Passwort für die Datenbankverschlüsselung wird aktualisiert und im Keychain gespeichert.
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -1322,7 +1289,7 @@
</trans-unit>
<trans-unit id="Database passphrase is different from saved in the keychain." xml:space="preserve">
<source>Database passphrase is different from saved in the keychain.</source>
<target>Das Datenbank-Passwort unterscheidet sich von dem im Schlüsselbund gespeicherten.</target>
<target>Das Datenbank-Passwort unterscheidet sich von dem im Keychain gespeicherten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
@@ -1338,7 +1305,7 @@
<trans-unit id="Database will be encrypted and the passphrase stored in the keychain.&#10;" xml:space="preserve">
<source>Database will be encrypted and the passphrase stored in the keychain.
</source>
<target>Die Datenbank wird verschlüsselt, und das Passwort im Schlüsselbund gespeichert.
<target>Die Datenbank wird verschlüsselt, und das Passwort im Keychain gespeichert.
</target>
<note>No comment provided by engineer.</note>
</trans-unit>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Entschlüsselungsfehler</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Gelöscht um: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Zustellungs-Quittierungen sind deaktiviert!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Zustellungs-Quittierungen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Beschreibung</target>
@@ -1604,21 +1561,11 @@
<target>In dieser Gruppe sind Direktnachrichten zwischen Mitgliedern nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Deaktivieren (vorgenommene Einstellungen bleiben erhalten)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>SimpleX Sperre deaktivieren</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Für Alle deaktivieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Verschwindende Nachricht</target>
@@ -1679,11 +1626,6 @@
<target>Keine Adresse erstellt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Nicht aktivieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Nicht nochmals anzeigen</target>
@@ -1724,11 +1666,6 @@
<target>Aktivieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Aktivieren (vorgenommene Einstellungen bleiben erhalten)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>SimpleX Sperre aktivieren</target>
@@ -1744,11 +1681,6 @@
<target>Automatisches Löschen von Nachrichten aktivieren?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Für Alle aktivieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Sofortige Benachrichtigungen aktivieren?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Fehler beim Abbrechen des Adresswechsels</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Fehler beim Löschen des Benutzerprofils</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Fehler beim Aktivieren der Empfangsbestätigungen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Fehler beim Aktivieren der Benachrichtigungen</target>
@@ -2044,11 +1970,6 @@
<target>Fehler beim Senden der Nachricht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Fehler beim Setzen der Empfangsbestätigungen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Fehler beim Starten des Chats</target>
@@ -2064,11 +1985,6 @@
<target>Fehler beim Umschalten des Profils!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Fehler beim Synchronisieren der Verbindung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Fehler beim Aktualisieren des Gruppen-Links</target>
@@ -2109,11 +2025,6 @@
<target>Fehler: Keine Datenbankdatei</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Auch wenn sie im Chat deaktiviert sind.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Beenden ohne Speichern</target>
@@ -2134,9 +2045,9 @@
<target>Exportiertes Datenbankarchiv.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Exportieren des Datenbank-Archivs</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Export des Datenbankarchivs...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Favorit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>Dateien &amp; Medien</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Dateien und Medien</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>In dieser Gruppe sind Dateien und Medien nicht erlaubt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Dateien und Medien sind nicht erlaubt!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Nach ungelesenen und favorisierten Chats filtern.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Endlich haben wir sie! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Chats schneller finden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Reparieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Verbindung reparieren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Verbindung reparieren?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Reparatur der Verschlüsselung nach wiedereinspielen von Backups.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Reparatur wird vom Kontakt nicht unterstützt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Reparatur wird vom Gruppenmitglied nicht unterstützt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Für Konsole</target>
@@ -2344,11 +2199,6 @@
<target>Gruppenmitglieder können verschwindende Nachrichten senden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Gruppenmitglieder können Dateien und Medien senden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Gruppenmitglieder können Sprachnachrichten versenden.</target>
@@ -2544,11 +2394,6 @@
<target>Verbesserte Serverkonfiguration</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>Als Antwort auf</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Inkognito</target>
@@ -2732,19 +2577,14 @@
<target>Der Gruppe beitreten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Ihre Verbindungen beibehalten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>KeyChain Fehler</target>
<target>Keystore Fehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keychain error" xml:space="preserve">
<source>Keychain error</source>
<target>KeyChain Fehler</target>
<target>Schlüsselbundfehler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="LIVE" xml:space="preserve">
@@ -2827,11 +2667,6 @@
<target>Stellen Sie eine private Verbindung her</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Eine verschwindende Nachricht verfassen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Privates Profil erzeugen!</target>
@@ -2902,11 +2737,6 @@
<target>Fehler bei der Nachrichtenzustellung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Empfangsbestätigungen für Nachrichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Nachrichtenentwurf</target>
@@ -2942,9 +2772,9 @@
<target>Nachrichten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Datenbank-Archiv wird migriert</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Das Datenbankarchiv wird migriert...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Kein Geräte-Token!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Keine gefilterten Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Die Gruppe wurde nicht gefunden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Keine Vergangenheit</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>
@@ -3196,11 +3016,6 @@
<target>Gruppenpräferenzen können nur von Gruppen-Eigentümern geändert werden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Nur Gruppenbesitzer können Dateien und Medien aktivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Sprachnachrichten können nur von Gruppen-Eigentümern aktiviert werden.</target>
@@ -3521,11 +3336,6 @@
<target>Das Senden von verschwindenden Nachrichten verbieten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Das Senden von Dateien und Medien nicht erlauben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Das Senden von Sprachnachrichten nicht erlauben.</target>
@@ -3546,11 +3356,6 @@
<target>Protokollzeitüberschreitung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Protokollzeitüberschreitung pro kB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Push-Benachrichtigungen</target>
@@ -3561,9 +3366,9 @@
<target>Bewerten Sie die App</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Reagiere…</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Reaktion...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3636,16 +3440,6 @@
<target>Die Empfänger sehen Nachrichtenaktualisierungen, während Sie sie eingeben.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Alle verbundenen Server werden neu verbunden, um die Zustellung der Nachricht zu erzwingen. Dies verursacht zusätzlichen Datenverkehr.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Die Server neu verbinden?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Datensatz aktualisiert um</target>
@@ -3706,21 +3500,6 @@
<target>Passwort aus dem Schlüsselbund entfernen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Neu aushandeln</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Verschlüsselung neu aushandeln</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Verschlüsselung neu aushandeln?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Antwort</target>
@@ -3743,7 +3522,7 @@
</trans-unit>
<trans-unit id="Reset to defaults" xml:space="preserve">
<source>Reset to defaults</source>
<target>Auf Voreinstellungen zurücksetzen</target>
<target>Auf Standardwerte zurücksetzen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Restart the app to create a new chat profile" xml:space="preserve">
@@ -3976,11 +3755,6 @@
<target>Eine Live Nachricht senden - der/die Empfänger sieht/sehen Nachrichtenaktualisierungen, während Sie sie eingeben</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Zustellungs-Quittierungen versenden an</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Direktnachricht senden</target>
@@ -4016,11 +3790,6 @@
<target>Senden Sie Fragen und Ideen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Quittierungen versenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen.</target>
@@ -4036,31 +3805,11 @@
<target>Der Absender hat möglicherweise die Verbindungsanfrage gelöscht.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Das Senden von Empfangsbestätigungen an alle Kontakte in allen sichtbaren Chat-Profilen wird aktiviert.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Das Senden von Empfangsbestätigungen an alle Kontakte wird aktiviert.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Das Senden der Datei wird beendet.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Das Senden von Empfangsbestätigungen an %lld Kontakte ist deaktiviert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Das Senden von Empfangsbestätigungen an %lld Kontakte ist aktiviert</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Senden über</target>
@@ -4498,11 +4247,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Das erzeugte Archiv ist über Einstellungen / Datenbank / Altes Datenbankarchiv verfügbar.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>Die Verschlüsselung funktioniert und ein neues Verschlüsselungsabkommen ist nicht erforderlich. Es kann zu Verbindungsfehlern kommen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Die Gruppe ist vollständig dezentralisiert sie ist nur für Mitglieder sichtbar.</target>
@@ -4538,11 +4282,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Das Profil wird nur mit Ihren Kontakten geteilt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>Das zweite Häkchen, welches wir vermisst haben! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>Der Absender wird NICHT benachrichtigt</target>
@@ -4568,16 +4307,6 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Es muss mindestens ein sichtbares Benutzer-Profil vorhanden sein.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Diese Einstellungen betreffen Ihr aktuelles Profil **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Diese können in den Kontakteinstellungen überschrieben werden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Diese Aktion kann nicht rückgängig gemacht werden! Alle empfangenen und gesendeten Dateien und Medien werden gelöscht. Bilder mit niedriger Auflösung bleiben erhalten.</target>
@@ -4593,6 +4322,11 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
<target>Diese Aktion kann nicht rückgängig gemacht werden! Ihr Profil und Ihre Kontakte, Nachrichten und Dateien gehen unwiderruflich verloren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Es handelt sich um einen permanenten Fehler für diese Verbindung - bitte verbinden Sie sich neu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Diese Gruppe existiert nicht mehr.</target>
@@ -4707,7 +4441,6 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Fav. entf.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4790,6 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
<target>Sie können dies später erstellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Sie können diese später in den Einstellungen aktivieren</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Sie können diese später in den Datenschutz &amp; Sicherheits-Einstellungen der App aktivieren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Sie können ein Benutzerprofil verbergen oder stummschalten - wischen Sie es nach rechts.</target>
@@ -5403,16 +5126,6 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>Verschlüsselung von %@ zustimmen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>Verschlüsselung zustimmen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>Immer</target>
@@ -5473,14 +5186,14 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>änderte Ihre Rolle auf %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>Adresse von %@ wechseln…</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>Wechseln der Adresse für %@ ...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>Wechsel der Adresse</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>Wechseln der Adresse ...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5296,6 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Voreinstellung (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>Voreinstellung (Nein)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>Voreinstellung (Ja)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>Gelöscht</target>
@@ -5638,46 +5341,6 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>Für Sie aktiviert</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>Verschlüsselung wurde zugestimmt</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>Verschlüsselung von %@ wurde zugestimmt</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>Verschlüsselung ist in Ordnung</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>Verschlüsselung für %@ ist in Ordnung</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>Neuaushandlung der Verschlüsselung erlaubt</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>Neuaushandlung der Verschlüsselung von %@ erlaubt</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>Neuaushandlung der Verschlüsselung notwendig</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>Neuaushandlung der Verschlüsselung von %@ notwendig</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>beendet</target>
@@ -5949,11 +5612,6 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
<target>geheim</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>Sicherheitscode wurde geändert</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>Verbindung wird gestartet…</target>
@@ -6098,7 +5756,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="de" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5788,7 @@ SimpleX-Server können Ihr Profil nicht einsehen.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="de" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "de",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="en" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ at %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ is connected!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- more stable message delivery.
- a bit better groups.
- and more!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Connect to me via SimpleX Chat&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>A few more things</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>A new contact</target>
@@ -610,11 +591,6 @@
<target>Allow to irreversibly delete sent messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Allow to send files and media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Allow to send voice messages.</target>
@@ -1151,11 +1127,6 @@
<target>Contact preferences</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Contacts</target>
<note>No comment provided by engineer.</note>
</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>Contacts can mark messages for deletion; you will be able to view them.</target>
@@ -1362,7 +1333,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Decryption error</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1520,6 @@
<target>Deleted at: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Delivery receipts are disabled!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Description</target>
@@ -1604,21 +1565,11 @@
<target>Direct messages between members are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Disable (keep overrides)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Disable SimpleX Lock</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Disable for all</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Disappearing message</target>
@@ -1679,11 +1630,6 @@
<target>Don't create address</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Don't enable</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Don't show again</target>
@@ -1724,11 +1670,6 @@
<target>Enable</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Enable (keep overrides)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Enable SimpleX Lock</target>
@@ -1744,11 +1685,6 @@
<target>Enable automatic message deletion?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Enable for all</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Enable instant notifications?</target>
@@ -1959,11 +1895,6 @@
<target>Error deleting user profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Error enabling delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Error enabling notifications</target>
@@ -2044,11 +1975,6 @@
<target>Error sending message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Error setting delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Error starting chat</target>
@@ -2064,11 +1990,6 @@
<target>Error switching profile!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Error synchronizing connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Error updating group link</target>
@@ -2109,11 +2030,6 @@
<target>Error: no database file</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Even when disabled in the conversation.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Exit without saving</target>
@@ -2134,9 +2050,9 @@
<target>Exported database archive.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Exporting database archive</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Exporting database archive...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2179,66 +2095,11 @@
<target>Files &amp; media</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Files and media</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Files and media are prohibited in this group.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Files and media prohibited!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filter unread and favorite chats.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Finally, we have them! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Find chats faster</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Fix</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Fix connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Fix connection?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Fix encryption after restoring backups.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Fix not supported by contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Fix not supported by group member</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>For console</target>
@@ -2344,11 +2205,6 @@
<target>Group members can send disappearing messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Group members can send files and media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Group members can send voice messages.</target>
@@ -2544,11 +2400,6 @@
<target>Improved server configuration</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>In reply to</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Incognito</target>
@@ -2732,11 +2583,6 @@
<target>Joining group</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Keep your connections</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>KeyChain error</target>
@@ -2827,11 +2673,6 @@
<target>Make a private connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Make one message disappear</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Make profile private!</target>
@@ -2902,11 +2743,6 @@
<target>Message delivery error</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Message delivery receipts!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Message draft</target>
@@ -2942,9 +2778,9 @@
<target>Messages &amp; files</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Migrating database archive</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Migrating database archive...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2933,11 @@
<target>No device token!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>No filtered chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Group not found!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>No history</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>
@@ -3196,11 +3022,6 @@
<target>Only group owners can change group preferences.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Only group owners can enable files and media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Only group owners can enable voice messages.</target>
@@ -3521,11 +3342,6 @@
<target>Prohibit sending disappearing messages.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Prohibit sending files and media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Prohibit sending voice messages.</target>
@@ -3546,11 +3362,6 @@
<target>Protocol timeout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Protocol timeout per KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Push notifications</target>
@@ -3561,9 +3372,9 @@
<target>Rate the app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>React</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>React...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3636,16 +3447,6 @@
<target>Recipients see updates as you type them.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Reconnect all connected servers to force message delivery. It uses additional traffic.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Reconnect servers?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Record updated at</target>
@@ -3706,21 +3507,6 @@
<target>Remove passphrase from keychain?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Renegotiate</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Renegotiate encryption</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Renegotiate encryption?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Reply</target>
@@ -3976,11 +3762,6 @@
<target>Send a live message - it will update for the recipient(s) as you type it</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Send delivery receipts to</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Send direct message</target>
@@ -4016,11 +3797,6 @@
<target>Send questions and ideas</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Send receipts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Send them from gallery or custom keyboards.</target>
@@ -4036,31 +3812,11 @@
<target>Sender may have deleted the connection request.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Sending delivery receipts will be enabled for all contacts.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Sending file will be stopped.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Sending receipts is disabled for %lld contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Sending receipts is enabled for %lld contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Sending via</target>
@@ -4498,11 +4254,6 @@ It can happen because of some bug or when the connection is compromised.</target
<target>The created archive is available via app Settings / Database / Old database archive.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>The group is fully decentralized it is visible only to the members.</target>
@@ -4538,11 +4289,6 @@ It can happen because of some bug or when the connection is compromised.</target
<target>The profile is only shared with your contacts.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>The second tick we missed! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>The sender will NOT be notified</target>
@@ -4568,16 +4314,6 @@ It can happen because of some bug or when the connection is compromised.</target
<target>There should be at least one visible user profile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>These settings are for your current profile **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>They can be overridden in contact settings</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</target>
@@ -4593,6 +4329,11 @@ It can happen because of some bug or when the connection is compromised.</target
<target>This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>This error is permanent for this connection, please re-connect.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>This group no longer exists.</target>
@@ -5057,16 +4798,6 @@ To connect, please ask your contact to create another connection link and check
<target>You can create it later</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>You can enable later via Settings</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>You can enable them later via app Privacy &amp; Security settings.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>You can hide or mute a user profile - swipe it to the right.</target>
@@ -5403,16 +5134,6 @@ SimpleX servers cannot see your profile.</target>
<target>admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>agreeing encryption for %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>agreeing encryption…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>always</target>
@@ -5473,14 +5194,14 @@ SimpleX servers cannot see your profile.</target>
<target>changed your role to %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>changing address for %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>changing address for %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>changing address</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>changing address...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5304,6 @@ SimpleX servers cannot see your profile.</target>
<target>default (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>default (no)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>default (yes)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>deleted</target>
@@ -5638,46 +5349,6 @@ SimpleX servers cannot see your profile.</target>
<target>enabled for you</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>encryption agreed</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>encryption agreed for %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>encryption ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>encryption ok for %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>encryption re-negotiation allowed</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>encryption re-negotiation allowed for %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>encryption re-negotiation required</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>encryption re-negotiation required for %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>ended</target>
@@ -5949,11 +5620,6 @@ SimpleX servers cannot see your profile.</target>
<target>secret</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>security code changed</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>starting…</target>
@@ -6098,7 +5764,7 @@ SimpleX servers cannot see your profile.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="en" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5796,7 @@ SimpleX servers cannot see your profile.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="en" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "en",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "es",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -172,84 +172,68 @@
<target state="translated">%llds</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%lldw" xml:space="preserve" approved="no">
<trans-unit id="%lldw" xml:space="preserve">
<source>%lldw</source>
<target state="translated">%lldw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="(" xml:space="preserve" approved="no">
<trans-unit id="(" xml:space="preserve">
<source>(</source>
<target state="translated">(</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=")" xml:space="preserve" approved="no">
<trans-unit id=")" xml:space="preserve">
<source>)</source>
<target state="translated">)</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" approved="no">
<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 state="translated">**Lisää uusi kontakti**: luo kertakäyttöinen QR-koodi tai linkki kontaktille.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve" approved="no">
<trans-unit id="**Create link / QR code** for your contact to use." xml:space="preserve">
<source>**Create link / QR code** for your contact to use.</source>
<target state="translated">**Luo linkki / QR-koodi* kontaktille.</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" approved="no">
<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 state="translated">**Yksityisempi**: tarkista uudet viestit 20 minuutin välein. Laitetunnus jaetaan SimpleX Chat -palvelimen kanssa, mutta ei sitä, kuinka monta yhteystietoa tai viestiä sinulla on.</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" approved="no">
<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 state="translated">**Yksityisin**: älä käytä SimpleX Chat -ilmoituspalvelinta, tarkista viestit ajoittain taustalla (riippuu siitä, kuinka usein käytät sovellusta).</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Paste received link** or open it in the browser and tap **Open in mobile app**." xml:space="preserve" approved="no">
<trans-unit id="**Paste received link** or open it in the browser and tap **Open in mobile app**." xml:space="preserve">
<source>**Paste received link** or open it in the browser and tap **Open in mobile app**.</source>
<target state="translated">**Liitä vastaanotettu linkki** tai avaa se selaimessa ja napauta **Avaa mobiilisovelluksessa**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve" approved="no">
<trans-unit id="**Please note**: you will NOT be able to recover or change passphrase if you lose it." xml:space="preserve">
<source>**Please note**: you will NOT be able to recover or change passphrase if you lose it.</source>
<target state="translated">**Huomaa**: et voi palauttaa tai muuttaa tunnuslausetta, jos kadotat sen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from." xml:space="preserve" approved="no">
<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 state="translated">**Suositus**: laitetunnus ja ilmoitukset lähetetään SimpleX Chat -ilmoituspalvelimelle, mutta ei viestin sisältöä, kokoa tai sitä, keneltä se on peräisin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**Scan QR code**: to connect to your contact in person or via video call." xml:space="preserve" approved="no">
<trans-unit id="**Scan QR code**: to connect to your contact in person or via video call." xml:space="preserve">
<source>**Scan QR code**: to connect to your contact in person or via video call.</source>
<target state="translated">**Skannaa QR-koodi**: muodosta yhteys kontaktiisi henkilökohtaisesti tai videopuhelun kautta.</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" approved="no">
<trans-unit id="**Warning**: Instant push notifications require passphrase saved in Keychain." xml:space="preserve">
<source>**Warning**: Instant push notifications require passphrase saved in Keychain.</source>
<target state="translated">**Varoitus**: Välittömät push-ilmoitukset vaativat tunnuslauseen, joka on tallennettu Keychainiin.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve" approved="no">
<trans-unit id="**e2e encrypted** audio call" xml:space="preserve">
<source>**e2e encrypted** audio call</source>
<target state="translated">**e2e-salattu** äänipuhelu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="**e2e encrypted** video call" xml:space="preserve" approved="no">
<trans-unit id="**e2e encrypted** video call" xml:space="preserve">
<source>**e2e encrypted** video call</source>
<target state="translated">**e2e-salattu** videopuhelu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="*bold*" xml:space="preserve" approved="no">
<trans-unit id="*bold*" xml:space="preserve">
<source>\*bold*</source>
<target state="translated">\*bold*</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=", " xml:space="preserve" approved="no">
<trans-unit id=", " xml:space="preserve">
<source>, </source>
<target state="translated">, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="." xml:space="preserve">
@@ -276,14 +260,12 @@
<source>2 weeks</source>
<note>message ttl</note>
</trans-unit>
<trans-unit id="6" xml:space="preserve" approved="no">
<trans-unit id="6" xml:space="preserve">
<source>6</source>
<target state="translated">6</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id=": " xml:space="preserve" approved="no">
<trans-unit id=": " xml:space="preserve">
<source>: </source>
<target state="translated">: </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
@@ -3824,7 +3806,7 @@ SimpleX servers cannot see your profile.</source>
</trans-unit>
<trans-unit id="%@:" xml:space="preserve" approved="no">
<source>%@:</source>
<target state="translated">%@:</target>
<target state="needs-translation">%@:</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="%d weeks" xml:space="preserve" approved="no">
@@ -3837,26 +3819,6 @@ SimpleX servers cannot see your profile.</source>
<target state="translated">%lld sekuntia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="5 minutes" xml:space="preserve" approved="no">
<source>5 minutes</source>
<target state="translated">5 minuuttia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="30 seconds" xml:space="preserve" approved="no">
<source>30 seconds</source>
<target state="translated">30 sekuntia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages skipped." xml:space="preserve" approved="no">
<source>%u messages skipped.</source>
<target state="translated">%u viestit ohitettu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%u messages failed to decrypt." xml:space="preserve" approved="no">
<source>%u messages failed to decrypt.</source>
<target state="translated">%u viestien salauksen purku epäonnistui.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
</body>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="fi" datatype="plaintext">

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="fr" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ à %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ est connecté·e !</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- une diffusion plus stable des messages.
- des groupes un peu plus performants.
- et bien d'autres choses encore !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Contactez-moi via SimpleX Chat&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Encore quelques points</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Un nouveau contact</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Annuler</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Annuler le changement d'adresse</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Abandonner le changement d'adresse ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Le changement d'adresse sera annulé. L'ancienne adresse de réception sera utilisée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Autoriser la suppression irréversible de messages envoyés.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Permet l'envoi de fichiers et de médias.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Autoriser l'envoi de messages vocaux.</target>
@@ -732,7 +704,7 @@
</trans-unit>
<trans-unit id="Audio/video calls are prohibited." xml:space="preserve">
<source>Audio/video calls are prohibited.</source>
<target>Les appels audio/vidéo sont interdits.</target>
<target>Interdire les appels audio/vidéo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Authentication cancelled" xml:space="preserve">
@@ -1151,11 +1123,6 @@
<target>Préférences de contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Contacts</target>
<note>No comment provided by engineer.</note>
</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>Vos contacts peuvent marquer les messages pour les supprimer ; vous pourrez les consulter.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Erreur de déchiffrement</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Supprimé à : %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Les accusés de réception sont désactivés !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Justificatifs de réception!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Description</target>
@@ -1604,21 +1561,11 @@
<target>Les messages directs entre membres sont interdits dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Désactiver (conserver les remplacements)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Désactiver SimpleX Lock</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Désactiver pour tous</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Message éphémère</target>
@@ -1679,11 +1626,6 @@
<target>Ne pas créer d'adresse</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Ne pas activer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Ne plus afficher</target>
@@ -1724,11 +1666,6 @@
<target>Activer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Activer (conserver les remplacements)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Activer SimpleX Lock</target>
@@ -1744,11 +1681,6 @@
<target>Activer la suppression automatique des messages ?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Activer pour tous</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Activer les notifications instantanées?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Erreur lors de l'annulation du changement d'adresse</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Erreur lors de la suppression du profil utilisateur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Erreur lors de l'activation des accusés de réception!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Erreur lors de l'activation des notifications</target>
@@ -2044,11 +1970,6 @@
<target>Erreur lors de l'envoi du message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Erreur lors de la configuration des accusés de réception !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Erreur lors du démarrage du chat</target>
@@ -2064,11 +1985,6 @@
<target>Erreur lors du changement de profil !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Erreur de synchronisation de connexion</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Erreur lors de la mise à jour du lien de groupe</target>
@@ -2109,11 +2025,6 @@
<target>Erreur: pas de fichier de base de données</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Même s'il est désactivé dans la conversation.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Quitter sans sauvegarder</target>
@@ -2134,9 +2045,9 @@
<target>Archive de la base de données exportée.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Exportation de l'archive de la base de données</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Exportation de l'archive de la base de données...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Favoris</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>Fichiers &amp; médias</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Fichiers et médias</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Les fichiers et les médias sont interdits dans ce groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Fichiers et médias interdits !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filtrer les messages non lus et favoris.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Enfin, les voilà ! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Trouver des messages plus rapidement</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Réparer</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Réparer la connexion</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Réparer la connexion?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Réparer le chiffrement après la restauration des sauvegardes.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Correction non prise en charge par le contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Correction non prise en charge par un membre du groupe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Pour la console</target>
@@ -2344,11 +2199,6 @@
<target>Les membres du groupes peuvent envoyer des messages éphémères.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Les membres du groupe peuvent envoyer des fichiers et des médias.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Les membres du groupe peuvent envoyer des messages vocaux.</target>
@@ -2544,11 +2394,6 @@
<target>Configuration de serveur améliorée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>En réponse à</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Incognito</target>
@@ -2732,11 +2577,6 @@
<target>Entrain de rejoindre le groupe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Conserver vos connexions</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Erreur du trousseau de clés</target>
@@ -2827,11 +2667,6 @@
<target>Établir une connexion privée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Rendre un message éphémère</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Rendre un profil privé !</target>
@@ -2902,11 +2737,6 @@
<target>Erreur de distribution du message</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Accusés de réception des messages !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Brouillon de message</target>
@@ -2942,9 +2772,9 @@
<target>Messages</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Migration de l'archive de la base de données</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Migration de l'archive de la base de données...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Pas de token d'appareil!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Pas de chats filtrés</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Groupe introuvable !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Aucun historique</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>Pas l'autorisation d'enregistrer un message vocal</target>
@@ -3196,11 +3016,6 @@
<target>Seuls les propriétaires du groupe peuvent modifier les préférences du groupe.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Seuls les propriétaires du groupe peuvent activer les fichiers et les médias.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Seuls les propriétaires de groupes peuvent activer les messages vocaux.</target>
@@ -3521,11 +3336,6 @@
<target>Interdire lenvoi de messages éphémères.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Interdire l'envoi de fichiers et de médias.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Interdire l'envoi de messages vocaux.</target>
@@ -3546,11 +3356,6 @@
<target>Délai du protocole</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Délai d'attente du protocole par KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Notifications push</target>
@@ -3561,9 +3366,9 @@
<target>Évaluer l'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Réagissez…</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Réagir...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3598,7 +3403,7 @@
</trans-unit>
<trans-unit id="Received at" xml:space="preserve">
<source>Received at</source>
<target>Reçu à</target>
<target>Reçu le</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Received at: %@" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3633,17 +3437,7 @@
</trans-unit>
<trans-unit id="Recipients see updates as you type them." xml:space="preserve">
<source>Recipients see updates as you type them.</source>
<target>Les destinataires voient les mises à jour au fur et à mesure que vous leur écrivez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Reconnecter tous les serveurs connectés pour forcer la livraison des messages. Cette méthode utilise du trafic supplémentaire.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Reconnecter les serveurs?</target>
<target>Les destinataires voient les mises à jour au fur et à mesure que vous les tapez.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
@@ -3706,21 +3500,6 @@
<target>Supprimer la phrase secrète de la keychain?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Renégocier</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Renégocier le chiffrement</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Renégocier le chiffrement?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Répondre</target>
@@ -3976,11 +3755,6 @@
<target>Envoyez un message dynamique - il sera mis à jour pour le⸱s destinataire⸱s au fur et à mesure que vous le tapez</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Envoyer les accusés de réception à</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Envoi de message direct</target>
@@ -4016,11 +3790,6 @@
<target>Envoyez vos questions et idées</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Envoyer les justificatifs</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Envoyez-les depuis la phototèque ou des claviers personnalisés.</target>
@@ -4036,31 +3805,11 @@
<target>L'expéditeur a peut-être supprimé la demande de connexion.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>L'envoi d'accusés de réception sera activé pour tous les contacts dans tous les profils de chat visibles.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>L'envoi d'accusés de réception sera activé pour tous les contacts.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>L'envoi du fichier sera interrompu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>L'envoi d'accusés de réception est désactivé pour %lld contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>L'envoi d'accusés de réception est activé pour %lld contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Envoi via</target>
@@ -4498,11 +4247,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>L'archive créée est disponible via l'app Paramètres / Base de données / Ancienne archive de base de données.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>Le chiffrement fonctionne et le nouvel accord de chiffrement n'est pas nécessaire. Cela peut provoquer des erreurs de connexion !</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Le groupe est entièrement décentralisé il n'est visible que par ses membres.</target>
@@ -4538,11 +4282,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Le profil n'est partagé qu'avec vos contacts.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>Le deuxième coche que nous avons manqué ! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>L'expéditeur N'en sera PAS informé</target>
@@ -4568,16 +4307,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Il doit y avoir au moins un profil d'utilisateur visible.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Ces paramètres s'appliquent à votre profil actuel **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Ils peuvent être remplacés dans les paramètres des contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées.</target>
@@ -4593,6 +4322,11 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
<target>Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Cette erreur est persistante pour cette connexion, veuillez vous reconnecter.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Ce groupe n'existe plus.</target>
@@ -4707,7 +4441,6 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Unfav.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4790,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
<target>Vous pouvez la créer plus tard</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Vous pouvez l'activer ultérieurement via Paramètres</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Vous pouvez les activer ultérieurement via les paramètres de Confidentialité et Sécurité de l'application.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Vous pouvez masquer ou mettre en sourdine un profil d'utilisateur - faites-le glisser vers la droite.</target>
@@ -5403,16 +5126,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>admin</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>acceptant le chiffrement pour %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>accord sur le chiffrement…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>toujours</target>
@@ -5473,14 +5186,14 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>a modifié votre rôle pour %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>changement d'adresse pour %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>changement d'adresse pour %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>changement d'adresse</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>changement d'adresse...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5296,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>défaut (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>par défaut (non)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>par défaut (oui)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>supprimé</target>
@@ -5638,46 +5341,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>activé pour vous</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>chiffrement accepté</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>chiffrement accepté pour %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>chiffrement ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>chiffrement ok pour %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>renégociation de chiffrement autorisée</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>renégociation de chiffrement autorisée pour %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>renégociation de chiffrement requise</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>renégociation de chiffrement requise pour %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>terminé</target>
@@ -5949,11 +5612,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
<target>secret</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>code de sécurité modifié</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>lancement…</target>
@@ -6098,7 +5756,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="fr" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5788,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="fr" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "fr",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="it" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ alle %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ è connesso/a!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- recapito dei messaggi più stabile.
- gruppi un po' migliorati.
- e altro ancora!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Connettiti a me via SimpleX Chat&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Qualche altra cosa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Un contatto nuovo</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Interrompi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Interrompi il cambio di indirizzo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Interrompere il cambio di indirizzo?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Il cambio di indirizzo verrà interrotto. Verrà usato il vecchio indirizzo di ricezione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Permetti di eliminare irreversibilmente i messaggi inviati.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Consenti l'invio di file e contenuti multimediali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Permetti l'invio di messaggi vocali.</target>
@@ -1151,11 +1123,6 @@
<target>Preferenze del contatto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Contatti</target>
<note>No comment provided by engineer.</note>
</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>I contatti possono contrassegnare i messaggi per l'eliminazione; potrai vederli.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Errore di decifrazione</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Eliminato il: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Le ricevute di consegna sono disattivate!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Ricevute di consegna!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Descrizione</target>
@@ -1604,21 +1561,11 @@
<target>I messaggi diretti tra i membri sono vietati in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Disattiva (mantieni sostituzioni)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Disattiva SimpleX Lock</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Disattiva per tutti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Messaggio a tempo</target>
@@ -1679,11 +1626,6 @@
<target>Non creare un indirizzo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Non attivare</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Non mostrare più</target>
@@ -1724,11 +1666,6 @@
<target>Attiva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Attiva (mantieni sostituzioni)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Attiva SimpleX Lock</target>
@@ -1744,11 +1681,6 @@
<target>Attivare l'eliminazione automatica dei messaggi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Attiva per tutti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Attivare le notifiche istantanee?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Errore nell'interruzione del cambio di indirizzo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Errore nell'eliminazione del profilo utente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Errore nell'attivazione delle ricevute di consegna!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Errore nell'attivazione delle notifiche</target>
@@ -2044,11 +1970,6 @@
<target>Errore nell'invio del messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Errore nell'impostazione delle ricevute di consegna!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Errore di avvio della chat</target>
@@ -2064,11 +1985,6 @@
<target>Errore nel cambio di profilo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Errore nella sincronizzazione della connessione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Errore nell'aggiornamento del link del gruppo</target>
@@ -2109,11 +2025,6 @@
<target>Errore: nessun file di database</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Anche quando disattivato nella conversazione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Esci senza salvare</target>
@@ -2134,9 +2045,9 @@
<target>Archivio database esportato.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Esportazione archivio database</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Esportazione archivio database...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Preferito</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>File e multimediali</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>File e multimediali</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>File e contenuti multimediali sono vietati in questo gruppo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>File e contenuti multimediali vietati!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filtra le chat non lette e preferite.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Finalmente le abbiamo! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Trova le chat più velocemente</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Correggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Correggi connessione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Correggere la connessione?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Correggi la crittografia dopo il ripristino dei backup.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Correzione non supportata dal contatto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Correzione non supportata dal membro del gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Per console</target>
@@ -2344,11 +2199,6 @@
<target>I membri del gruppo possono inviare messaggi a tempo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>I membri del gruppo possono inviare file e contenuti multimediali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>I membri del gruppo possono inviare messaggi vocali.</target>
@@ -2544,11 +2394,6 @@
<target>Configurazione del server migliorata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>In risposta a</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Incognito</target>
@@ -2732,11 +2577,6 @@
<target>Ingresso nel gruppo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Mantieni le tue connessioni</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Errore del portachiavi</target>
@@ -2827,11 +2667,6 @@
<target>Crea una connessione privata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Fai sparire un messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Rendi privato il profilo!</target>
@@ -2902,11 +2737,6 @@
<target>Errore di recapito del messaggio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Ricevute di consegna dei messaggi!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Bozza dei messaggi</target>
@@ -2942,9 +2772,9 @@
<target>Messaggi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Migrazione archivio del database</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Migrazione archivio del database...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Nessun token del dispositivo!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Nessuna chat filtrata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Gruppo non trovato!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Nessuna cronologia</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>
@@ -3196,11 +3016,6 @@
<target>Solo i proprietari del gruppo possono modificarne le preferenze.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Solo i proprietari del gruppo possono attivare file e contenuti multimediali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Solo i proprietari del gruppo possono attivare i messaggi vocali.</target>
@@ -3521,11 +3336,6 @@
<target>Proibisci l'invio di messaggi a tempo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Proibisci l'invio di file e contenuti multimediali.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Proibisci l'invio di messaggi vocali.</target>
@@ -3546,11 +3356,6 @@
<target>Scadenza del protocollo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Scadenza del protocollo per KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Notifiche push</target>
@@ -3561,9 +3366,9 @@
<target>Valuta l'app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Reagisci</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Reagisci...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3636,16 +3440,6 @@
<target>I destinatari vedono gli aggiornamenti mentre li digiti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Riconnetti tutti i server connessi per imporre il recapito dei messaggi. Utilizza traffico aggiuntivo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Riconnettere i server?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Registro aggiornato il</target>
@@ -3706,21 +3500,6 @@
<target>Rimuovere la password dal portachiavi?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Rinegoziare</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Rinegoziare crittografia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Rinegoziare la crittografia?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Rispondi</target>
@@ -3976,11 +3755,6 @@
<target>Invia un messaggio in diretta: si aggiornerà per i destinatari mentre lo digiti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Invia ricevute di consegna a</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Invia messaggio diretto</target>
@@ -4016,11 +3790,6 @@
<target>Invia domande e idee</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Invia ricevute</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Inviali dalla galleria o dalle tastiere personalizzate.</target>
@@ -4036,31 +3805,11 @@
<target>Il mittente potrebbe aver eliminato la richiesta di connessione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>L'invio delle ricevute di consegna sarà attivo per tutti i contatti in tutti i profili di chat visibili.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>L'invio delle ricevute di consegna sarà attivo per tutti i contatti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>L'invio del file verrà interrotto.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>L'invio di ricevute è disattivato per %lld contatti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>L'invio di ricevute è attivo per %lld contatti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Invio tramite</target>
@@ -4498,11 +4247,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>L'archivio creato è disponibile via Impostazioni / Database / Archivio database vecchio.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>La crittografia funziona e il nuovo accordo sulla crittografia non è richiesto. Potrebbero verificarsi errori di connessione!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Il gruppo è completamente decentralizzato: è visibile solo ai membri.</target>
@@ -4538,11 +4282,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Il profilo è condiviso solo con i tuoi contatti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>Il secondo segno di spunta che ci mancava! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>Il mittente NON verrà avvisato</target>
@@ -4568,16 +4307,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Deve esserci almeno un profilo utente visibile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Queste impostazioni sono per il tuo profilo attuale **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Possono essere sovrascritte nelle impostazioni dei contatti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Questa azione non può essere annullata: tutti i file e i media ricevuti e inviati verranno eliminati. Rimarranno le immagini a bassa risoluzione.</target>
@@ -4593,6 +4322,11 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
<target>Questa azione non può essere annullata: il tuo profilo, i contatti, i messaggi e i file andranno persi in modo irreversibile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>L'errore è permanente per questa connessione, riconnettiti.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Questo gruppo non esiste più.</target>
@@ -4707,7 +4441,6 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Non pref.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4790,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
<target>Puoi crearlo più tardi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Puoi attivarle più tardi nelle impostazioni</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Puoi attivarle più tardi nelle impostazioni di privacy e sicurezza dell'app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Puoi nascondere o silenziare un profilo utente - scorrilo verso destra.</target>
@@ -5403,16 +5126,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>amministratore</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>concordando la crittografia per %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>concordando la crittografia…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>sempre</target>
@@ -5473,14 +5186,14 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>cambiato il tuo ruolo in %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>cambio indirizzo per %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>cambio indirizzo per %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>cambio indirizzo</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>cambio indirizzo...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5296,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>predefinito (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>predefinito (no)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>predefinito (sì)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>eliminato</target>
@@ -5638,46 +5341,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>attivato per te</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>crittografia concordata</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>crittografia concordata per %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>crittografia ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>crittografia ok per %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>rinegoziazione della crittografia consentita</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>rinegoziazione della crittografia consentita per %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>richiesta rinegoziazione della crittografia</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>richiesta rinegoziazione della crittografia per %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>terminata</target>
@@ -5949,11 +5612,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
<target>segreto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>codice di sicurezza modificato</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>avvio…</target>
@@ -6098,7 +5756,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="it" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5788,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="it" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "it",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="ja" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,10 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ 接続中!</target>
@@ -301,12 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -383,10 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;SimpleX Chatでつながろう&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>新しい連絡先</target>
@@ -601,10 +587,6 @@
<target>送信済みメッセージの永久削除を許可する。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>音声メッセージの送信を許可する。</target>
@@ -1140,10 +1122,6 @@
<target>連絡先の設定</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<note>No comment provided by engineer.</note>
</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>連絡先はメッセージを削除対象とすることができます。あなたには閲覧可能です。</target>
@@ -1350,7 +1328,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>復号化エラー</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1537,14 +1515,6 @@
<target>削除完了: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>説明</target>
@@ -1590,19 +1560,11 @@
<target>このグループではメンバー間のダイレクトメッセージが使用禁止です。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>SimpleXロックを無効にする</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>消えるメッセージ</target>
@@ -1663,10 +1625,6 @@
<target>アドレスを作成しないでください</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>次から表示しない</target>
@@ -1707,10 +1665,6 @@
<target>有効</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>SimpleXロックを有効にする</target>
@@ -1726,10 +1680,6 @@
<target>自動メッセージ削除を有効にしますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>即時通知を有効にしますか?</target>
@@ -1939,10 +1889,6 @@
<target>ユーザのプロフィール削除にエラー発生</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>通知の有効化にエラー発生</target>
@@ -2023,10 +1969,6 @@
<target>メッセージ送信にエラー発生</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>チャット開始にエラー発生</target>
@@ -2042,10 +1984,6 @@
<target>プロフィール切り替えにエラー発生!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>グループのリンクのアップデートにエラー発生</target>
@@ -2086,10 +2024,6 @@
<target>エラー: データベースが存在しません</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>保存せずに閉じる</target>
@@ -2110,9 +2044,9 @@
<target>データベースのアーカイブをエクスポートします。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>データベース アーカイブをエクスポートしています</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>データベース アーカイブをエクスポートしています...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2154,54 +2088,10 @@
<target>ファイルとメディア</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>コンソール</target>
@@ -2307,10 +2197,6 @@
<target>グループのメンバーが消えるメッセージを送信できます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>グループのメンバーが音声メッセージを送信できます。</target>
@@ -2506,10 +2392,6 @@
<target>サーバ設定の向上</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>シークレットモード</target>
@@ -2693,10 +2575,6 @@
<target>グループに参加</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>キーチェーンのエラー</target>
@@ -2787,10 +2665,6 @@
<target>プライベートな接続をする</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>プロフィールを非表示にできます!</target>
@@ -2861,10 +2735,6 @@
<target>メッセージ送信エラー</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>メッセージの下書き</target>
@@ -2900,9 +2770,9 @@
<target>メッセージ &amp; ファイル</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>データベースのアーカイブを移行しています</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>データベースのアーカイブを移行しています...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3055,19 +2925,11 @@
<target>デバイストークンがありません!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>グループが見つかりません!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</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>
@@ -3152,10 +3014,6 @@
<target>グループ設定を変えられるのはグループのオーナーだけです。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>音声メッセージを利用可能に設定できるのはグループのオーナーだけです。</target>
@@ -3476,10 +3334,6 @@
<target>消えるメッセージを使用禁止にする。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>音声メッセージを使用禁止にする。</target>
@@ -3500,10 +3354,6 @@
<target>プロトコル・タイムアウト</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>プッシュ通知</target>
@@ -3514,8 +3364,9 @@
<target>アプリを評価</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>リアクション...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3587,14 +3438,6 @@
<target>受信者には、入力時に更新内容が表示されます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>レコード更新日時</target>
@@ -3655,18 +3498,6 @@
<target>キーチェーンからパスフレーズを削除しますか?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>返信</target>
@@ -3922,10 +3753,6 @@
<target>ライブメッセージを送信 (入力しながら宛先の画面で更新される)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>ダイレクトメッセージを送信</target>
@@ -3961,10 +3788,6 @@
<target>質問やアイデアを送る</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>ギャラリーまたはカスタム キーボードから送信します。</target>
@@ -3980,27 +3803,11 @@
<target>送信元が繋がりリクエストを削除したかもしれません。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>ファイルの送信を停止します。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>経由で送信</target>
@@ -4437,10 +4244,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>作成されたアーカイブは、アプリの設定/データベース/過去のデータベースアーカイブから利用できます。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>グループは完全分散型で、メンバーしか内容を見れません。</target>
@@ -4476,10 +4279,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>プロフィールは連絡先にしか共有されません。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>送信者には通知されません</target>
@@ -4505,14 +4304,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>少なくとも1つのユーザープロフィールが表示されている必要があります。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>ファイルとメディアが全て削除されます (※元に戻せません※)。低解像度の画像が残ります。</target>
@@ -4528,6 +4319,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>あなたのプロフィール、連絡先、メッセージ、ファイルが完全削除されます (※元に戻せません※)。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>このエラーはこの接続では永続的なものです。再接続してください。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>このグループはもう存在しません。</target>
@@ -4991,14 +4787,6 @@ 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="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>ユーザープロファイルを右にスワイプすると、非表示またはミュートにすることができます。</target>
@@ -5335,14 +5123,6 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>管理者</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>常に</target>
@@ -5403,12 +5183,14 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>あなたの役割を %@ に変更しました</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>%@ のアドレスを変更しています...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>アドレスを変更しています…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5511,14 +5293,6 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>デフォルト (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>削除完了</target>
@@ -5564,38 +5338,6 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>あなたに有効</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>終了</target>
@@ -5866,10 +5608,6 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
<target>シークレット</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>接続中…</target>
@@ -6014,7 +5752,7 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="ja" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6046,7 +5784,7 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="ja" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "ja",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="nl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ bij %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ is verbonden!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- stabielere berichtbezorging.
- een beetje betere groepen.
- en meer!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Maak verbinding met mij via SimpleX Chat&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Nog een paar dingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Een nieuw contact</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Afbreken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Annuleer het wijzigen van het adres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Adres wijziging afbreken?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Adres wijziging wordt afgebroken. Het oude ontvangstadres wordt gebruikt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Sta toe om verzonden berichten onomkeerbaar te verwijderen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Sta toe om bestanden en media te verzenden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Sta toe om spraak berichten te verzenden.</target>
@@ -1151,11 +1123,6 @@
<target>Contact voorkeuren</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Contacten</target>
<note>No comment provided by engineer.</note>
</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>Contact personen kunnen berichten markeren voor verwijdering; u kunt ze wel bekijken.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Decodering fout</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Verwijderd om: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Ontvangstbewijzen zijn uitgeschakeld!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Ontvangstbewijzen!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Beschrijving</target>
@@ -1604,21 +1561,11 @@
<target>Directe berichten tussen leden zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Uitschakelen (overschrijvingen behouden)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>SimpleX Vergrendelen uitschakelen</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Uitschakelen voor iedereen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Verdwijnend bericht</target>
@@ -1679,11 +1626,6 @@
<target>Maak geen adres aan</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Niet inschakelen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Niet meer weergeven</target>
@@ -1724,11 +1666,6 @@
<target>Inschakelen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Inschakelen (overschrijvingen behouden)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>SimpleX Vergrendelen inschakelen</target>
@@ -1744,11 +1681,6 @@
<target>Automatisch verwijderen van berichten aanzetten?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Inschakelen voor iedereen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Onmiddellijke meldingen inschakelen?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Fout bij het afbreken van adres wijziging</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Fout bij het verwijderen van gebruikers profiel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Fout bij het inschakelen van ontvangstbevestiging!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Fout bij inschakelen van meldingen</target>
@@ -2044,11 +1970,6 @@
<target>Fout bij verzenden van bericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Fout bij het instellen van ontvangstbevestiging!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Fout bij het starten van de chat</target>
@@ -2064,11 +1985,6 @@
<target>Fout bij wisselen van profiel!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Fout bij het synchroniseren van de verbinding</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Fout bij bijwerken van groep link</target>
@@ -2109,11 +2025,6 @@
<target>Fout: geen database bestand</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Zelfs wanneer uitgeschakeld in het gesprek.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Afsluiten zonder opslaan</target>
@@ -2134,9 +2045,9 @@
<target>Geëxporteerd database archief.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Database archief exporteren</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Database archief exporteren...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Favoriet</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>Bestanden en media</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Bestanden en media</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Bestanden en media zijn verboden in deze groep.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Bestanden en media verboden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filter ongelezen en favoriete chats.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Eindelijk, we hebben ze! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Vind gesprekken sneller</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Herstel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Verbinding herstellen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Verbinding herstellen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Repareer versleuteling na het herstellen van back-ups.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Herstel wordt niet ondersteund door contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Herstel wordt niet ondersteund door groepslid</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Voor console</target>
@@ -2344,11 +2199,6 @@
<target>Groepsleden kunnen verdwijnende berichten sturen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Groepsleden kunnen bestanden en media verzenden.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Groepsleden kunnen spraak berichten verzenden.</target>
@@ -2544,11 +2394,6 @@
<target>Verbeterde serverconfiguratie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>In antwoord op</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Incognito</target>
@@ -2732,11 +2577,6 @@
<target>Deel nemen aan groep</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Behoud uw verbindingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Keychain fout</target>
@@ -2827,11 +2667,6 @@
<target>Maak een privéverbinding</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Eén bericht laten verdwijnen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Profiel privé maken!</target>
@@ -2902,11 +2737,6 @@
<target>Fout bij bezorging van bericht</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Ontvangstbevestiging voor berichten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Concept bericht</target>
@@ -2942,9 +2772,9 @@
<target>Berichten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Database archief migreren</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Database archief migreren...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Geen apparaattoken!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Geen gefilterde gesprekken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Groep niet gevonden!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Geen geschiedenis</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>
@@ -3196,11 +3016,6 @@
<target>Alleen groep eigenaren kunnen groep voorkeuren wijzigen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Alleen groepseigenaren kunnen bestanden en media inschakelen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Alleen groep eigenaren kunnen spraak berichten inschakelen.</target>
@@ -3521,11 +3336,6 @@
<target>Verbied het verzenden van verdwijnende berichten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Verbied het verzenden van bestanden en media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Verbieden het verzenden van spraak berichten.</target>
@@ -3546,11 +3356,6 @@
<target>Protocol timeout</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Protocol timeout per KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Push meldingen</target>
@@ -3561,9 +3366,9 @@
<target>Beoordeel de app</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Reageer</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Reageer...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3636,16 +3440,6 @@
<target>Ontvangers zien updates terwijl u ze typt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Verbind alle verbonden servers opnieuw om de bezorging van berichten af te dwingen. Het maakt gebruik van extra data.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Servers opnieuw verbinden?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Record bijgewerkt op</target>
@@ -3706,21 +3500,6 @@
<target>Wachtwoord van de keychain verwijderen?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Opnieuw onderhandelen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Heronderhandel over versleuteling</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Heronderhandelen over versleuteling?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Antwoord</target>
@@ -3976,11 +3755,6 @@
<target>Stuur een live bericht, het wordt bijgewerkt voor de ontvanger(s) terwijl u het typt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Stuur ontvangstbewijzen naar</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Direct bericht sturen</target>
@@ -4016,11 +3790,6 @@
<target>Stuur vragen en ideeën</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Ontvangstbewijzen verzenden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Stuur ze vanuit de galerij of aangepaste toetsenborden.</target>
@@ -4036,31 +3805,11 @@
<target>De afzender heeft mogelijk het verbindingsverzoek verwijderd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Het verzenden van ontvangstbevestiging wordt ingeschakeld voor alle contacten in alle zichtbare chatprofielen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Het verzenden van ontvangstbevestiging wordt ingeschakeld voor alle contactpersonen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Het verzenden van het bestand wordt gestopt.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Het verzenden van ontvangstbevestiging is uitgeschakeld voor %lld-contactpersonen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Het verzenden van ontvangstbevestiging is ingeschakeld voor %lld-contactpersonen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Verzenden via</target>
@@ -4498,11 +4247,6 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Het aangemaakte archief is beschikbaar via app Instellingen / Database / Oud database archief.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>De versleuteling werkt en de nieuwe versleutelingsovereenkomst is niet vereist. Dit kan leiden tot verbindingsfouten!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>De groep is volledig gedecentraliseerd het is alleen zichtbaar voor de leden.</target>
@@ -4538,11 +4282,6 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Het profiel wordt alleen gedeeld met uw contacten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>De tweede vink die we gemist hebben! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>De afzender wordt NIET op de hoogte gebracht</target>
@@ -4568,16 +4307,6 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Er moet ten minste één zichtbaar gebruikers profiel zijn.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Deze instellingen zijn voor uw huidige profiel **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Ze kunnen worden overschreven in contactinstellingen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Deze actie kan niet ongedaan worden gemaakt, alle ontvangen en verzonden bestanden en media worden verwijderd. Foto's met een lage resolutie blijven behouden.</target>
@@ -4593,6 +4322,11 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
<target>Deze actie kan niet ongedaan worden gemaakt. Uw profiel, contacten, berichten en bestanden gaan onomkeerbaar verloren.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Deze fout is permanent voor deze verbinding, maak opnieuw verbinding.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Deze groep bestaat niet meer.</target>
@@ -4707,7 +4441,6 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Niet fav.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4790,6 @@ Om verbinding te maken, vraagt u uw contactpersoon om een andere verbinding link
<target>U kan het later maken</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>U kunt later inschakelen via Instellingen</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>U kunt ze later inschakelen via de privacy- en beveiligingsinstellingen van de app.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>U kunt een gebruikers profiel verbergen of dempen - veeg het naar rechts.</target>
@@ -5154,7 +4877,7 @@ Om verbinding te maken, vraagt u uw contactpersoon om een andere verbinding link
</trans-unit>
<trans-unit id="You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." xml:space="preserve">
<source>You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts.</source>
<target>U mag ALLEEN de meest recente versie van uw chat database op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten.</target>
<target>U mag de meest recente versie van uw chat database ALLEEN op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You need to allow your contact to send voice messages to be able to send them." xml:space="preserve">
@@ -5402,16 +5125,6 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>Beheerder</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>versleuteling overeenkomen voor %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>versleuteling overeenkomen…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>altijd</target>
@@ -5472,14 +5185,14 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>veranderde je rol in %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>adres wijzigen voor %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>adres wijzigen voor %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>adres wijzigen</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>adres wijzigen...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5582,16 +5295,6 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>standaard (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>standaard (nee)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>standaard (ja)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>verwijderd</target>
@@ -5637,46 +5340,6 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>voor u ingeschakeld</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>versleuteling overeengekomen</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>versleuteling overeengekomen voor % @</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>versleuteling ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>versleuteling ok voor % @</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>versleuteling heronderhandeling toegestaan</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>versleuteling heronderhandeling toegestaan voor % @</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>heronderhandeling van versleuteling vereist</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>heronderhandeling van versleuteling vereist voor % @</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>geëindigd</target>
@@ -5948,11 +5611,6 @@ SimpleX servers kunnen uw profiel niet zien.</target>
<target>geheim</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>beveiligingscode gewijzigd</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>beginnen…</target>
@@ -6097,7 +5755,7 @@ SimpleX servers kunnen uw profiel niet zien.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="nl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6129,7 +5787,7 @@ SimpleX servers kunnen uw profiel niet zien.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="nl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "nl",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="pl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ o %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ jest połączony!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- bardziej stabilne dostarczanie wiadomości.
- nieco lepsze grupy.
- i więcej!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Połącz się ze mną poprzez SimpleX Chat.&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Jeszcze kilka rzeczy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Nowy kontakt</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Przerwij</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Przerwij zmianę adresu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Przerwać zmianę adresu?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Zmiana adresu zostanie przerwana. Użyty zostanie stary adres odbiorczy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Zezwól na nieodwracalne usunięcie wysłanych wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Pozwól na wysyłanie plików i mediów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Zezwól na wysyłanie wiadomości głosowych.</target>
@@ -1151,11 +1123,6 @@
<target>Preferencje kontaktu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Kontakty</target>
<note>No comment provided by engineer.</note>
</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>Kontakty mogą oznaczać wiadomości do usunięcia; będziesz mógł je zobaczyć.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Błąd odszyfrowania</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Usunięto o: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Potwierdzenia dostawy są wyłączone!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Potwierdzenia dostawy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Opis</target>
@@ -1604,21 +1561,11 @@
<target>Bezpośrednie wiadomości między członkami są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Wyłącz (zachowaj nadpisania)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Wyłącz blokadę SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Wyłącz dla wszystkich</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Znikająca wiadomość</target>
@@ -1679,11 +1626,6 @@
<target>Nie twórz adresu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Nie włączaj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Nie pokazuj ponownie</target>
@@ -1724,11 +1666,6 @@
<target>Włącz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Włącz (zachowaj nadpisania)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Włącz blokadę SimpleX</target>
@@ -1744,11 +1681,6 @@
<target>Czy włączyć automatyczne usuwanie wiadomości?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Włącz dla wszystkich</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Włączyć natychmiastowe powiadomienia?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Błąd przerwania zmiany adresu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Błąd usuwania profilu użytkownika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Błąd włączania potwierdzeń dostawy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Błąd włączania powiadomień</target>
@@ -2044,11 +1970,6 @@
<target>Błąd wysyłania wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Błąd ustawiania potwierdzeń dostawy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Błąd uruchamiania czatu</target>
@@ -2064,11 +1985,6 @@
<target>Błąd przełączania profilu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Błąd synchronizacji połączenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Błąd aktualizacji linku grupy</target>
@@ -2109,11 +2025,6 @@
<target>Błąd: brak pliku bazy danych</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Nawet po wyłączeniu w rozmowie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Wyjdź bez zapisywania</target>
@@ -2134,9 +2045,9 @@
<target>Wyeksportowane archiwum bazy danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Eksportowanie archiwum bazy danych</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Eksportowanie archiwum bazy danych...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Ulubione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>Pliki i media</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Pliki i media</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Pliki i media są zabronione w tej grupie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Pliki i media zabronione!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Filtruj nieprzeczytane i ulubione czaty.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>W końcu je mamy! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Szybciej znajduj czaty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Napraw</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Napraw połączenie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Naprawić połączenie?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Napraw szyfrowanie po przywróceniu kopii zapasowych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Naprawa nie jest obsługiwana przez kontakt</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Naprawa nie jest obsługiwana przez członka grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Dla konsoli</target>
@@ -2344,11 +2199,6 @@
<target>Członkowie grupy mogą wysyłać znikające wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Członkowie grupy mogą wysyłać pliki i media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Członkowie grupy mogą wysyłać wiadomości głosowe.</target>
@@ -2544,11 +2394,6 @@
<target>Ulepszona konfiguracja serwera</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>W odpowiedzi na</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Incognito</target>
@@ -2732,11 +2577,6 @@
<target>Dołączanie do grupy</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Zachowaj swoje połączenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Błąd pęku kluczy</target>
@@ -2827,11 +2667,6 @@
<target>Nawiąż prywatne połączenie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Spraw, aby jedna wiadomość zniknęła</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Ustaw profil jako prywatny!</target>
@@ -2902,11 +2737,6 @@
<target>Błąd dostarczenia wiadomości</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Potwierdzenia dostarczenia wiadomości!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Wersja robocza wiadomości</target>
@@ -2942,9 +2772,9 @@
<target>Wiadomości i pliki</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Migrowanie archiwum bazy danych</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Migrowanie archiwum bazy danych...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Brak tokenu urządzenia!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Brak filtrowanych czatów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Nie znaleziono grupy!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</source>
<target>Brak historii</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>
@@ -3196,11 +3016,6 @@
<target>Tylko właściciele grup mogą zmieniać preferencje grupy.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Tylko właściciele grup mogą włączać pliki i media.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Tylko właściciele grup mogą włączyć wiadomości głosowe.</target>
@@ -3521,11 +3336,6 @@
<target>Zabroń wysyłania znikających wiadomości.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Zakaz wysyłania plików i mediów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Zabroń wysyłania wiadomości głosowych.</target>
@@ -3546,11 +3356,6 @@
<target>Limit czasu protokołu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Limit czasu protokołu na KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Powiadomienia push</target>
@@ -3561,9 +3366,9 @@
<target>Oceń aplikację</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Reaguj</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Zareaguj...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3636,16 +3440,6 @@
<target>Odbiorcy widzą aktualizacje podczas ich wpisywania.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Połącz ponownie wszystkie połączone serwery, aby wymusić dostarczanie wiadomości. Wykorzystuje dodatkowy ruch.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Ponownie połączyć serwery?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Rekord zaktualizowany o</target>
@@ -3706,21 +3500,6 @@
<target>Usunąć hasło z pęku kluczy?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Renegocjuj</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Renegocjuj szyfrowanie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Renegocjować szyfrowanie?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Odpowiedz</target>
@@ -3976,11 +3755,6 @@
<target>Wysyłaj wiadomości na żywo - będą one aktualizowane dla odbiorcy(ów) w trakcie ich wpisywania</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Wyślij potwierdzenia dostawy do</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Wyślij wiadomość bezpośrednią</target>
@@ -4016,11 +3790,6 @@
<target>Wyślij pytania i pomysły</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Wyślij potwierdzenia</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Wyślij je z galerii lub niestandardowych klawiatur.</target>
@@ -4036,31 +3805,11 @@
<target>Nadawca mógł usunąć prośbę o połączenie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Wysyłanie potwierdzeń dostawy zostanie włączone dla wszystkich kontaktów we wszystkich widocznych profilach czatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Wysyłanie potwierdzeń dostawy zostanie włączone dla wszystkich kontaktów.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Wysyłanie pliku zostanie przerwane.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Wysyłanie potwierdzeń jest wyłączone dla %lld kontaktów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Wysyłanie potwierdzeń jest włączone dla %lld kontaktów</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Wysyłanie przez</target>
@@ -4283,7 +4032,6 @@
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import - you may see Chat console for more details." xml:space="preserve">
<source>Some non-fatal errors occurred during import - you may see Chat console for more details.</source>
<target>Podczas importu wystąpiły niekrytyczne błędy - więcej szczegółów można znaleźć w konsoli czatu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Somebody" xml:space="preserve">
@@ -4498,11 +4246,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Utworzone archiwum jest dostępne poprzez aplikację Ustawienia / Baza danych / Stare archiwum bazy danych.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>Szyfrowanie działa, a nowe uzgodnienie szyfrowania nie jest wymagane. Może to spowodować błędy w połączeniu!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Grupa jest w pełni zdecentralizowana jest widoczna tylko dla członków.</target>
@@ -4538,11 +4281,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Profil jest udostępniany tylko Twoim kontaktom.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>Drugi tik, który przegapiliśmy! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>Nadawca NIE zostanie powiadomiony</target>
@@ -4568,16 +4306,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Powinien istnieć co najmniej jeden widoczny profil użytkownika.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Te ustawienia dotyczą Twojego bieżącego profilu **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Można je nadpisać w ustawieniach kontaktu</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Tego działania nie można cofnąć - wszystkie odebrane i wysłane pliki oraz media zostaną usunięte. Obrazy o niskiej rozdzielczości pozostaną.</target>
@@ -4593,6 +4321,11 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
<target>Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Ten błąd jest trwały dla tego połączenia, proszę o ponowne połączenie.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Ta grupa już nie istnieje.</target>
@@ -4707,7 +4440,6 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Nie ulub.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4789,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
<target>Możesz go utworzyć później</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Możesz włączyć później w Ustawieniach</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Możesz je włączyć później w ustawieniach Prywatności i Bezpieczeństwa aplikacji.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Możesz ukryć lub wyciszyć profil użytkownika - przesuń palcem w prawo.</target>
@@ -5403,16 +5125,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>administrator</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>uzgadnianie szyfrowania dla %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>uzgadnianie szyfrowania…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>zawsze</target>
@@ -5473,14 +5185,14 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>zmieniono Twoją rolę na %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>zmienienie adresu dla %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>zmienienie adresu dla %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>zmiana adresu</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>zmienienie adresu...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5295,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>domyślne (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>domyślnie (nie)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>domyślnie (tak)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>usunięty</target>
@@ -5638,46 +5340,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>włączone dla Ciebie</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>uzgodniono szyfrowanie</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>uzgodniono szyfrowanie dla %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>szyfrowanie ok</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>szyfrowanie ok dla %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>renegocjacja szyfrowania dozwolona</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>renegocjacja szyfrowania dozwolona dla %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>renegocjacja szyfrowania wymagana</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>renegocjacja szyfrowania wymagana dla %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>zakończona</target>
@@ -5949,11 +5611,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
<target>sekret</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>kod bezpieczeństwa zmieniony</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>uruchamianie…</target>
@@ -6098,7 +5755,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5787,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="pl" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "pl",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="ru" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,11 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<target>%1$@ в %2$@:</target>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>Установлено соединение с %@!</target>
@@ -302,15 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<target>- более стабильная доставка сообщений.
- немного улучшенные группы.
- и прочее!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -387,11 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;Соединитесь со мной в SimpleX Chat.&lt;/a&gt;&lt;/p&gt;</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<target>Еще несколько изменений</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>Новый контакт</target>
@@ -421,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>Прекратить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>Прекратить изменение адреса</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>Прекратить изменение адреса?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -517,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>Изменение адреса будет прекращено. Будет использоваться старый адрес.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -610,11 +587,6 @@
<target>Разрешить необратимо удалять отправленные сообщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>Разрешить посылать файлы и медиа.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>Разрешить отправлять голосовые сообщения.</target>
@@ -1151,11 +1123,6 @@
<target>Предпочтения контакта</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<target>Контакты</target>
<note>No comment provided by engineer.</note>
</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>Контакты могут помечать сообщения для удаления; Вы сможете просмотреть их.</target>
@@ -1362,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>Ошибка расшифровки</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1549,16 +1516,6 @@
<target>Удалено: %@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<target>Отчёты о доставке выключены!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<target>Отчёты о доставке!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>Описание</target>
@@ -1604,21 +1561,11 @@
<target>Прямые сообщения между членами группы запрещены.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<target>Выключить (кроме исключений)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>Отключить блокировку SimpleX</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<target>Выключить для всех</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>Исчезающее сообщение</target>
@@ -1679,11 +1626,6 @@
<target>Не создавать адрес</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<target>Не включать</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>Не показывать</target>
@@ -1724,11 +1666,6 @@
<target>Включить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<target>Включить (кроме исключений)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>Включить блокировку SimpleX</target>
@@ -1744,11 +1681,6 @@
<target>Включить автоматическое удаление сообщений?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<target>Включить для всех</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>Включить мгновенные уведомления?</target>
@@ -1866,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>Ошибка при прекращении изменения адреса</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1959,11 +1890,6 @@
<target>Ошибка удаления профиля пользователя</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<target>Ошибка при включении отчётов о доставке!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>Ошибка при включении уведомлений</target>
@@ -2044,11 +1970,6 @@
<target>Ошибка при отправке сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<target>Ошибка настроек отчётов о доставке!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>Ошибка при запуске чата</target>
@@ -2064,11 +1985,6 @@
<target>Ошибка выбора профиля!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<target>Ошибка синхронизации соединения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>Ошибка обновления ссылки группы</target>
@@ -2109,11 +2025,6 @@
<target>Ошибка: данные чата не найдены</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<target>Даже когда они выключены в разговоре.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>Выйти без сохранения</target>
@@ -2134,9 +2045,9 @@
<target>Архив чата экспортирован.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>Архив чата экспортируется</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>Архив чата экспортируется...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2151,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>Избранный</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2179,66 +2089,11 @@
<target>Файлы и медиа</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>Файлы и медиа</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>Файлы и медиа запрещены в этой группе.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>Файлы и медиа запрещены!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<target>Фильтровать непрочитанные и избранные чаты.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>Наконец-то, мы их добавили! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<target>Быстро найти чаты</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<target>Починить</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<target>Починить соединение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<target>Починить соединение?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<target>Починить шифрование после восстановления из бэкапа.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<target>Починка не поддерживается контактом</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<target>Починка не поддерживается членом группы</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>Для консоли</target>
@@ -2344,11 +2199,6 @@
<target>Члены группы могут посылать исчезающие сообщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>Члены группы могут слать файлы и медиа.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>Члены группы могут отправлять голосовые сообщения.</target>
@@ -2544,11 +2394,6 @@
<target>Улучшенная конфигурация серверов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<target>В ответ на</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>Инкогнито</target>
@@ -2732,11 +2577,6 @@
<target>Вступление в группу</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>Сохраните Ваши соединения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
<source>KeyChain error</source>
<target>Ошибка KeyChain</target>
@@ -2827,11 +2667,6 @@
<target>Добавьте контакт</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<target>Одно исчезающее сообщение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>Сделайте профиль скрытым!</target>
@@ -2902,11 +2737,6 @@
<target>Ошибка доставки сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<target>Отчеты о доставке сообщений!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>Черновик сообщения</target>
@@ -2942,9 +2772,9 @@
<target>Сообщения</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>Данные чата перемещаются</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>Данные чата перемещаются...</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3097,21 +2927,11 @@
<target>Отсутствует токен устройства!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>Нет отфильтрованных разговоров</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>Группа не найдена!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</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>
@@ -3196,11 +3016,6 @@
<target>Только владельцы группы могут изменять предпочтения группы.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>Только владельцы группы могут разрешить файлы и медиа.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>Только владельцы группы могут разрешить голосовые сообщения.</target>
@@ -3521,11 +3336,6 @@
<target>Запретить посылать исчезающие сообщения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>Запретить слать файлы и медиа.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>Запретить отправлять голосовые сообщений.</target>
@@ -3546,11 +3356,6 @@
<target>Таймаут протокола</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<target>Таймаут протокола на KB</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>Доставка уведомлений</target>
@@ -3561,9 +3366,9 @@
<target>Оценить приложение</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<target>Реакция</target>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>Реакция...</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3618,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3636,16 +3440,6 @@
<target>Получатели видят их в то время как Вы их набираете.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<target>Повторно подключите все серверы, чтобы принудительно доставить сообщения. Используется дополнительный трафик.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<target>Переподключить серверы?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>Запись обновлена</target>
@@ -3706,21 +3500,6 @@
<target>Удалить пароль из Keychain?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<target>Пересогласовать</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<target>Пересогласовать шифрование</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<target>Пересогласовать шифрование?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>Ответить</target>
@@ -3976,11 +3755,6 @@
<target>Отправить живое сообщение — оно будет обновляться для получателей по мере того, как Вы его вводите</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<target>Отправка отчётов о доставке</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>Отправить сообщение</target>
@@ -4016,11 +3790,6 @@
<target>Отправьте вопросы и идеи</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<target>Отправлять отчёты о доставке</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>Отправьте из галереи или из дополнительных клавиатур.</target>
@@ -4036,31 +3805,11 @@
<target>Отправитель мог удалить запрос на соединение.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<target>Отправка отчётов о доставке будет включена для всех контактов во всех видимых профилях чата.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<target>Отправка отчётов о доставке будет включена для всех контактов.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>Отправка файла будет остановлена.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<target>Отправка отчётов о доставке выключена для %lld контактов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<target>Отправка отчётов о доставке включена для %lld контактов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>Отправка через</target>
@@ -4283,7 +4032,6 @@
</trans-unit>
<trans-unit id="Some non-fatal errors occurred during import - you may see Chat console for more details." xml:space="preserve">
<source>Some non-fatal errors occurred during import - you may see Chat console for more details.</source>
<target>Во время импорта произошли некоторые ошибки - для получения более подробной информации вы можете обратиться к консоли.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Somebody" xml:space="preserve">
@@ -4498,11 +4246,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Созданный архив доступен через Настройки приложения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<target>Шифрование работает, и новое соглашение не требуется. Это может привести к ошибкам соединения!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>Группа полностью децентрализована — она видна только членам.</target>
@@ -4538,11 +4281,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Профиль отправляется только Вашим контактам.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<target>Вторая галочка - знать, что доставлено! ✅</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>Отправитель не будет уведомлён</target>
@@ -4568,16 +4306,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Должен быть хотя бы один открытый профиль пользователя.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<target>Установки для Вашего активного профиля **%@**.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<target>Они могут быть переопределены в настройках контактов</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>Это действие нельзя отменить — все полученные и отправленные файлы будут удалены. Изображения останутся в низком разрешении.</target>
@@ -4593,6 +4321,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>Эта ошибка постоянная для этого соединения, пожалуйста, соединитесь снова.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>Эта группа больше не существует.</target>
@@ -4707,7 +4440,6 @@ You will be prompted to complete authentication before this feature is enabled.<
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>Не избр.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5057,16 +4789,6 @@ 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="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<target>Вы можете включить их позже в Настройках</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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<target>Вы можете включить их позже в настройках Конфиденциальности.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>Вы можете скрыть профиль или выключить уведомления - потяните его вправо.</target>
@@ -5403,16 +5125,6 @@ SimpleX серверы не могут получить доступ к Ваше
<target>админ</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<target>шифрование согласовывается для %@…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<target>шифрование согласовывается…</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>всегда</target>
@@ -5473,14 +5185,14 @@ SimpleX серверы не могут получить доступ к Ваше
<target>поменял(а) Вашу роль на: %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<target>смена адреса для %@</target>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>смена адреса для %@...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<target>смена адреса</target>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>смена адреса...</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5583,16 +5295,6 @@ SimpleX серверы не могут получить доступ к Ваше
<target>по умолчанию (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<target>по умолчанию (нет)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<target>по умолчанию (да)</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>удалено</target>
@@ -5638,46 +5340,6 @@ SimpleX серверы не могут получить доступ к Ваше
<target>включено для Вас</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<target>шифрование согласовано</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<target>шифрование согласовано для %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<target>шифрование работает</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<target>шифрование работает для %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<target>новое соглашение о шифровании разрешено</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<target>новое соглашение о шифровании разрешено для %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<target>требуется новое соглашение о шифровании</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<target>требуется новое соглашение о шифровании для %@</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>завершён</target>
@@ -5860,7 +5522,6 @@ SimpleX серверы не могут получить доступ к Ваше
</trans-unit>
<trans-unit id="no text" xml:space="preserve">
<source>no text</source>
<target>нет текста</target>
<note>copied message info in history</note>
</trans-unit>
<trans-unit id="observer" xml:space="preserve">
@@ -5949,11 +5610,6 @@ SimpleX серверы не могут получить доступ к Ваше
<target>секрет</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<target>код безопасности изменился</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>инициализация…</target>
@@ -6098,7 +5754,7 @@ SimpleX серверы не могут получить доступ к Ваше
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="ru" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6130,7 +5786,7 @@ SimpleX серверы не могут получить доступ к Ваше
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="ru" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "ru",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -2,7 +2,7 @@
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="urn:oasis:names:tc:xliff:document:1.2 http://docs.oasis-open.org/xliff/v1.2/os/xliff-core-1.2-strict.xsd">
<file original="en.lproj/Localizable.strings" source-language="en" target-language="zh-Hans" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="&#10;" xml:space="preserve">
@@ -72,10 +72,6 @@
<target>%@ / %@</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="%@ at %@:" xml:space="preserve">
<source>%1$@ at %2$@:</source>
<note>copied message info, &lt;sender&gt; at &lt;time&gt;</note>
</trans-unit>
<trans-unit id="%@ is connected!" xml:space="preserve">
<source>%@ is connected!</source>
<target>%@ 已连接!</target>
@@ -301,12 +297,6 @@
<target>, </target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- more stable message delivery.&#10;- a bit better groups.&#10;- and more!" xml:space="preserve">
<source>- more stable message delivery.
- a bit better groups.
- and more!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="- voice messages up to 5 minutes.&#10;- custom time to disappear.&#10;- editing history." xml:space="preserve">
<source>- voice messages up to 5 minutes.
- custom time to disappear.
@@ -383,10 +373,6 @@
&lt;p&gt;&lt;a href="%@"&gt;通过 SimpleX Chat &lt;/a&gt;&lt;/p&gt;与我联系</target>
<note>email text</note>
</trans-unit>
<trans-unit id="A few more things" xml:space="preserve">
<source>A few more things</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="A new contact" xml:space="preserve">
<source>A new contact</source>
<target>新联系人</target>
@@ -416,17 +402,14 @@
</trans-unit>
<trans-unit id="Abort" xml:space="preserve">
<source>Abort</source>
<target>中止</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address" xml:space="preserve">
<source>Abort changing address</source>
<target>中止地址更改</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Abort changing address?" xml:space="preserve">
<source>Abort changing address?</source>
<target>中止地址更改?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="About SimpleX" xml:space="preserve">
@@ -512,7 +495,6 @@
</trans-unit>
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve">
<source>Address change will be aborted. Old receiving address will be used.</source>
<target>将中止地址更改。将使用旧接收地址。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Admins can create the links to join groups." xml:space="preserve">
@@ -605,11 +587,6 @@
<target>允许不可撤回地删除已发送消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send files and media." xml:space="preserve">
<source>Allow to send files and media.</source>
<target>允许发送文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Allow to send voice messages." xml:space="preserve">
<source>Allow to send voice messages.</source>
<target>允许发送语音消息。</target>
@@ -717,7 +694,7 @@
</trans-unit>
<trans-unit id="Audio and video calls" xml:space="preserve">
<source>Audio and video calls</source>
<target>语音和视频通话</target>
<target>视频通话</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Audio/video calls" xml:space="preserve">
@@ -1146,10 +1123,6 @@
<target>联系人偏好设置</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Contacts" xml:space="preserve">
<source>Contacts</source>
<note>No comment provided by engineer.</note>
</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>联系人可以将信息标记为删除;您将可以查看这些信息。</target>
@@ -1356,7 +1329,7 @@
<trans-unit id="Decryption error" xml:space="preserve">
<source>Decryption error</source>
<target>解密错误</target>
<note>message decrypt error item</note>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delete" xml:space="preserve">
<source>Delete</source>
@@ -1543,14 +1516,6 @@
<target>已删除于:%@</target>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Delivery receipts are disabled!" xml:space="preserve">
<source>Delivery receipts are disabled!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Delivery receipts!" xml:space="preserve">
<source>Delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description" xml:space="preserve">
<source>Description</source>
<target>描述</target>
@@ -1596,19 +1561,11 @@
<target>此群中禁止成员之间私信。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable (keep overrides)" xml:space="preserve">
<source>Disable (keep overrides)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disable SimpleX Lock" xml:space="preserve">
<source>Disable SimpleX Lock</source>
<target>禁用 SimpleX 锁定</target>
<note>authentication reason</note>
</trans-unit>
<trans-unit id="Disable for all" xml:space="preserve">
<source>Disable for all</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Disappearing message" xml:space="preserve">
<source>Disappearing message</source>
<target>限时消息</target>
@@ -1669,10 +1626,6 @@
<target>不创建地址</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't enable" xml:space="preserve">
<source>Don't enable</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Don't show again" xml:space="preserve">
<source>Don't show again</source>
<target>不再显示</target>
@@ -1713,10 +1666,6 @@
<target>启用</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable (keep overrides)" xml:space="preserve">
<source>Enable (keep overrides)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable SimpleX Lock" xml:space="preserve">
<source>Enable SimpleX Lock</source>
<target>启用 SimpleX 锁定</target>
@@ -1732,10 +1681,6 @@
<target>启用自动删除消息?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable for all" xml:space="preserve">
<source>Enable for all</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Enable instant notifications?" xml:space="preserve">
<source>Enable instant notifications?</source>
<target>启用即时通知?</target>
@@ -1853,7 +1798,6 @@
</trans-unit>
<trans-unit id="Error aborting address change" xml:space="preserve">
<source>Error aborting address change</source>
<target>中止地址更改错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error accepting contact request" xml:space="preserve">
@@ -1946,10 +1890,6 @@
<target>删除用户资料错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling delivery receipts!" xml:space="preserve">
<source>Error enabling delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error enabling notifications" xml:space="preserve">
<source>Error enabling notifications</source>
<target>启用通知错误</target>
@@ -2030,10 +1970,6 @@
<target>发送消息错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error setting delivery receipts!" xml:space="preserve">
<source>Error setting delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error starting chat" xml:space="preserve">
<source>Error starting chat</source>
<target>启动聊天错误</target>
@@ -2049,10 +1985,6 @@
<target>切换资料错误!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error synchronizing connection" xml:space="preserve">
<source>Error synchronizing connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Error updating group link" xml:space="preserve">
<source>Error updating group link</source>
<target>更新群组链接错误</target>
@@ -2093,10 +2025,6 @@
<target>错误:没有数据库文件</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Even when disabled in the conversation." xml:space="preserve">
<source>Even when disabled in the conversation.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exit without saving" xml:space="preserve">
<source>Exit without saving</source>
<target>退出而不保存</target>
@@ -2117,9 +2045,9 @@
<target>导出数据库归档。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Exporting database archive" xml:space="preserve">
<source>Exporting database archive</source>
<target>导出数据库档案中…</target>
<trans-unit id="Exporting database archive..." xml:space="preserve">
<source>Exporting database archive...</source>
<target>导出数据库档案中…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Failed to remove passphrase" xml:space="preserve">
@@ -2134,7 +2062,6 @@
</trans-unit>
<trans-unit id="Favorite" xml:space="preserve">
<source>Favorite</source>
<target>最喜欢</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="File will be deleted from servers." xml:space="preserve">
@@ -2162,58 +2089,11 @@
<target>文件和媒体</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media" xml:space="preserve">
<source>Files and media</source>
<target>文件和媒体</target>
<note>chat feature</note>
</trans-unit>
<trans-unit id="Files and media are prohibited in this group." xml:space="preserve">
<source>Files and media are prohibited in this group.</source>
<target>此群组中禁止文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Files and media prohibited!" xml:space="preserve">
<source>Files and media prohibited!</source>
<target>禁止文件和媒体!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Filter unread and favorite chats." xml:space="preserve">
<source>Filter unread and favorite chats.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Finally, we have them! 🚀" xml:space="preserve">
<source>Finally, we have them! 🚀</source>
<target>终于我们有它们了! 🚀</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Find chats faster" xml:space="preserve">
<source>Find chats faster</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix" xml:space="preserve">
<source>Fix</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection" xml:space="preserve">
<source>Fix connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix connection?" xml:space="preserve">
<source>Fix connection?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix encryption after restoring backups." xml:space="preserve">
<source>Fix encryption after restoring backups.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by contact" xml:space="preserve">
<source>Fix not supported by contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Fix not supported by group member" xml:space="preserve">
<source>Fix not supported by group member</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="For console" xml:space="preserve">
<source>For console</source>
<target>用于控制台</target>
@@ -2319,11 +2199,6 @@
<target>群组成员可以发送限时消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send files and media." xml:space="preserve">
<source>Group members can send files and media.</source>
<target>群组成员可以发送文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Group members can send voice messages." xml:space="preserve">
<source>Group members can send voice messages.</source>
<target>群组成员可以发送语音消息。</target>
@@ -2519,10 +2394,6 @@
<target>改进的服务器配置</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="In reply to" xml:space="preserve">
<source>In reply to</source>
<note>copied message info</note>
</trans-unit>
<trans-unit id="Incognito" xml:space="preserve">
<source>Incognito</source>
<target>隐身聊天</target>
@@ -2703,11 +2574,7 @@
</trans-unit>
<trans-unit id="Joining group" xml:space="preserve">
<source>Joining group</source>
<target>加入群组</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Keep your connections" xml:space="preserve">
<source>Keep your connections</source>
<target>加入群组</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="KeyChain error" xml:space="preserve">
@@ -2800,10 +2667,6 @@
<target>建立私密连接</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make one message disappear" xml:space="preserve">
<source>Make one message disappear</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Make profile private!" xml:space="preserve">
<source>Make profile private!</source>
<target>将个人资料设为私密!</target>
@@ -2874,10 +2737,6 @@
<target>消息传递错误</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message delivery receipts!" xml:space="preserve">
<source>Message delivery receipts!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Message draft" xml:space="preserve">
<source>Message draft</source>
<target>消息草稿</target>
@@ -2913,9 +2772,9 @@
<target>消息</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migrating database archive" xml:space="preserve">
<source>Migrating database archive</source>
<target>迁移数据库档案中…</target>
<trans-unit id="Migrating database archive..." xml:space="preserve">
<source>Migrating database archive...</source>
<target>迁移数据库档案中…</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Migration error:" xml:space="preserve">
@@ -3068,20 +2927,11 @@
<target>无设备令牌!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No filtered chats" xml:space="preserve">
<source>No filtered chats</source>
<target>无过滤聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No group!" xml:space="preserve">
<source>Group not found!</source>
<target>未找到群组!</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="No history" xml:space="preserve">
<source>No history</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>
@@ -3166,11 +3016,6 @@
<target>只有群主可以改变群组偏好设置。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable files and media." xml:space="preserve">
<source>Only group owners can enable files and media.</source>
<target>只有组主可以启用文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Only group owners can enable voice messages." xml:space="preserve">
<source>Only group owners can enable voice messages.</source>
<target>只有群主可以启用语音信息。</target>
@@ -3491,11 +3336,6 @@
<target>禁止发送限时消息。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending files and media." xml:space="preserve">
<source>Prohibit sending files and media.</source>
<target>禁止发送文件和媒体。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Prohibit sending voice messages." xml:space="preserve">
<source>Prohibit sending voice messages.</source>
<target>禁止发送语音消息。</target>
@@ -3516,10 +3356,6 @@
<target>协议超时</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Protocol timeout per KB" xml:space="preserve">
<source>Protocol timeout per KB</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Push notifications" xml:space="preserve">
<source>Push notifications</source>
<target>推送通知</target>
@@ -3530,8 +3366,9 @@
<target>评价此应用程序</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="React" xml:space="preserve">
<source>React</source>
<trans-unit id="React..." xml:space="preserve">
<source>React...</source>
<target>回应……</target>
<note>chat item menu</note>
</trans-unit>
<trans-unit id="Read" xml:space="preserve">
@@ -3586,7 +3423,6 @@
</trans-unit>
<trans-unit id="Receiving address will be changed to a different server. Address change will complete after sender comes online." xml:space="preserve">
<source>Receiving address will be changed to a different server. Address change will complete after sender comes online.</source>
<target>接收地址将变更到不同的服务器。地址更改将在发件人上线后完成。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Receiving file will be stopped." xml:space="preserve">
@@ -3604,14 +3440,6 @@
<target>对方会在您键入时看到更新。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect all connected servers to force message delivery. It uses additional traffic." xml:space="preserve">
<source>Reconnect all connected servers to force message delivery. It uses additional traffic.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reconnect servers?" xml:space="preserve">
<source>Reconnect servers?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Record updated at" xml:space="preserve">
<source>Record updated at</source>
<target>记录更新于</target>
@@ -3672,18 +3500,6 @@
<target>从钥匙串中删除密码?</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate" xml:space="preserve">
<source>Renegotiate</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption" xml:space="preserve">
<source>Renegotiate encryption</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Renegotiate encryption?" xml:space="preserve">
<source>Renegotiate encryption?</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Reply" xml:space="preserve">
<source>Reply</source>
<target>回复</target>
@@ -3939,10 +3755,6 @@
<target>发送实时消息——它会在您键入时为收件人更新</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send delivery receipts to" xml:space="preserve">
<source>Send delivery receipts to</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send direct message" xml:space="preserve">
<source>Send direct message</source>
<target>发送私信</target>
@@ -3978,10 +3790,6 @@
<target>发送问题和想法</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send receipts" xml:space="preserve">
<source>Send receipts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Send them from gallery or custom keyboards." xml:space="preserve">
<source>Send them from gallery or custom keyboards.</source>
<target>发送它们来自图库或自定义键盘。</target>
@@ -3997,27 +3805,11 @@
<target>发送人可能已删除连接请求。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts in all visible chat profiles." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts in all visible chat profiles.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending delivery receipts will be enabled for all contacts." xml:space="preserve">
<source>Sending delivery receipts will be enabled for all contacts.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending file will be stopped." xml:space="preserve">
<source>Sending file will be stopped.</source>
<target>即将停止发送文件。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is disabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is disabled for %lld contacts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending receipts is enabled for %lld contacts" xml:space="preserve">
<source>Sending receipts is enabled for %lld contacts</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sending via" xml:space="preserve">
<source>Sending via</source>
<target>发送通过</target>
@@ -4455,10 +4247,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>创建的归档文件可以通过应用设置/数据库/旧数据库归档访问。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The encryption is working and the new encryption agreement is not required. It may result in connection errors!" xml:space="preserve">
<source>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The group is fully decentralized it is visible only to the members." xml:space="preserve">
<source>The group is fully decentralized it is visible only to the members.</source>
<target>该小组是完全分散式的——它只对成员可见。</target>
@@ -4494,10 +4282,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>该资料仅与您的联系人共享。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The second tick we missed! ✅" xml:space="preserve">
<source>The second tick we missed! ✅</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="The sender will NOT be notified" xml:space="preserve">
<source>The sender will NOT be notified</source>
<target>发送者将不会收到通知</target>
@@ -4523,14 +4307,6 @@ It can happen because of some bug or when the connection is compromised.</source
<target>应该至少有一个可见的用户资料。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="These settings are for your current profile **%@**." xml:space="preserve">
<source>These settings are for your current profile **%@**.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="They can be overridden in contact settings" xml:space="preserve">
<source>They can be overridden in contact settings</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." xml:space="preserve">
<source>This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain.</source>
<target>此操作无法撤消——所有接收和发送的文件和媒体都将被删除。 低分辨率图片将保留。</target>
@@ -4546,6 +4322,11 @@ It can happen because of some bug or when the connection is compromised.</source
<target>此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This error is permanent for this connection, please re-connect." xml:space="preserve">
<source>This error is permanent for this connection, please re-connect.</source>
<target>此错误对于此连接是永久性的,请重新连接。</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="This group no longer exists." xml:space="preserve">
<source>This group no longer exists.</source>
<target>该群组已不存在。</target>
@@ -4660,7 +4441,6 @@ You will be prompted to complete authentication before this feature is enabled.<
</trans-unit>
<trans-unit id="Unfav." xml:space="preserve">
<source>Unfav.</source>
<target>取消最喜欢</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Unhide" xml:space="preserve">
@@ -5010,14 +4790,6 @@ 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="You can enable later via Settings" xml:space="preserve">
<source>You can enable later via Settings</source>
<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">
<source>You can enable them later via app Privacy &amp; Security settings.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="You can hide or mute a user profile - swipe it to the right." xml:space="preserve">
<source>You can hide or mute a user profile - swipe it to the right.</source>
<target>您可以隐藏或静音用户个人资料——只需向右滑动。</target>
@@ -5354,14 +5126,6 @@ SimpleX 服务器无法看到您的资料。</target>
<target>管理员</target>
<note>member role</note>
</trans-unit>
<trans-unit id="agreeing encryption for %@…" xml:space="preserve">
<source>agreeing encryption for %@…</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="agreeing encryption…" xml:space="preserve">
<source>agreeing encryption…</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="always" xml:space="preserve">
<source>always</source>
<target>始终</target>
@@ -5422,12 +5186,14 @@ SimpleX 服务器无法看到您的资料。</target>
<target>更改您的角色为 %@</target>
<note>rcv group event chat item</note>
</trans-unit>
<trans-unit id="changing address for %@" xml:space="preserve">
<source>changing address for %@</source>
<trans-unit id="changing address for %@..." xml:space="preserve">
<source>changing address for %@...</source>
<target>更改 %@... 的地址中</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="changing address" xml:space="preserve">
<source>changing address</source>
<trans-unit id="changing address..." xml:space="preserve">
<source>changing address...</source>
<target>更改地址中……</target>
<note>chat item text</note>
</trans-unit>
<trans-unit id="colored" xml:space="preserve">
@@ -5530,14 +5296,6 @@ SimpleX 服务器无法看到您的资料。</target>
<target>默认 (%@)</target>
<note>pref value</note>
</trans-unit>
<trans-unit id="default (no)" xml:space="preserve">
<source>default (no)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="default (yes)" xml:space="preserve">
<source>default (yes)</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="deleted" xml:space="preserve">
<source>deleted</source>
<target>已删除</target>
@@ -5583,38 +5341,6 @@ SimpleX 服务器无法看到您的资料。</target>
<target>为您启用</target>
<note>enabled status</note>
</trans-unit>
<trans-unit id="encryption agreed" xml:space="preserve">
<source>encryption agreed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption agreed for %@" xml:space="preserve">
<source>encryption agreed for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok" xml:space="preserve">
<source>encryption ok</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption ok for %@" xml:space="preserve">
<source>encryption ok for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed" xml:space="preserve">
<source>encryption re-negotiation allowed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation allowed for %@" xml:space="preserve">
<source>encryption re-negotiation allowed for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required" xml:space="preserve">
<source>encryption re-negotiation required</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="encryption re-negotiation required for %@" xml:space="preserve">
<source>encryption re-negotiation required for %@</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="ended" xml:space="preserve">
<source>ended</source>
<target>已结束</target>
@@ -5886,10 +5612,6 @@ SimpleX 服务器无法看到您的资料。</target>
<target>秘密</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="security code changed" xml:space="preserve">
<source>security code changed</source>
<note>chat item text</note>
</trans-unit>
<trans-unit id="starting…" xml:space="preserve">
<source>starting…</source>
<target>启动中……</target>
@@ -6034,7 +5756,7 @@ SimpleX 服务器无法看到您的资料。</target>
</file>
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="zh-Hans" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleName" xml:space="preserve">
@@ -6066,7 +5788,7 @@ SimpleX 服务器无法看到您的资料。</target>
</file>
<file original="SimpleX NSE/en.lproj/InfoPlist.strings" source-language="en" target-language="zh-Hans" datatype="plaintext">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.3.1" build-num="14E300c"/>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="14.2" build-num="14C18"/>
</header>
<body>
<trans-unit id="CFBundleDisplayName" xml:space="preserve">

View File

@@ -3,10 +3,10 @@
"project" : "SimpleX.xcodeproj",
"targetLocale" : "zh-Hans",
"toolInfo" : {
"toolBuildNumber" : "14E300c",
"toolBuildNumber" : "14C18",
"toolID" : "com.apple.dt.xcode",
"toolName" : "Xcode",
"toolVersion" : "14.3.1"
"toolVersion" : "14.2"
},
"version" : "1.0"
}

View File

@@ -76,7 +76,7 @@ class NotificationService: UNNotificationServiceExtension {
var badgeCount: Int = 0
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
logger.debug("DEBUGGING: NotificationService.didReceive")
logger.debug("NotificationService.didReceive")
if let ntf = request.content.mutableCopy() as? UNMutableNotificationContent {
setBestAttemptNtf(ntf)
}
@@ -149,7 +149,7 @@ class NotificationService: UNNotificationServiceExtension {
}
override func serviceExtensionTimeWillExpire() {
logger.debug("DEBUGGING: NotificationService.serviceExtensionTimeWillExpire")
logger.debug("NotificationService.serviceExtensionTimeWillExpire")
deliverBestAttemptNtf()
}
@@ -275,7 +275,7 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? {
cItem = autoReceiveFile(file) ?? cItem
}
let ntf: NSENotification = cInfo.ntfsEnabled ? .nse(notification: createMessageReceivedNtf(user, cInfo, cItem)) : .empty
return cItem.showNotification ? (aChatItem.chatId, ntf) : nil
return cItem.showMutableNotification ? (aChatItem.chatId, ntf) : nil
case let .rcvFileSndCancelled(_, aChatItem, _):
cleanupFile(aChatItem)
return nil

View File

@@ -24,11 +24,6 @@
5C00168128C4FE760094D739 /* KeyChain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C00168028C4FE760094D739 /* KeyChain.swift */; };
5C029EA82837DBB3004A9677 /* CICallItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C029EA72837DBB3004A9677 /* CICallItemView.swift */; };
5C029EAA283942EA004A9677 /* CallController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C029EA9283942EA004A9677 /* CallController.swift */; };
5C0403922A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C04038D2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a */; };
5C0403932A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C04038E2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a */; };
5C0403942A7EAA41006ACFE8 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C04038F2A7EAA41006ACFE8 /* libffi.a */; };
5C0403952A7EAA41006ACFE8 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0403902A7EAA41006ACFE8 /* libgmp.a */; };
5C0403962A7EAA41006ACFE8 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C0403912A7EAA41006ACFE8 /* libgmpxx.a */; };
5C05DF532840AA1D00C683F9 /* CallSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C05DF522840AA1D00C683F9 /* CallSettings.swift */; };
5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C063D2627A4564100AEC577 /* ChatPreviewView.swift */; };
5C10D88828EED12E00E58BF0 /* ContactConnectionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */; };
@@ -146,8 +141,6 @@
5CE4407927ADB701007B033A /* EmojiItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CE4407827ADB701007B033A /* EmojiItemView.swift */; };
5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCE227DE9246000BD591 /* ComposeView.swift */; };
5CEACCED27DEA495000BD591 /* MsgContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEACCEC27DEA495000BD591 /* MsgContentView.swift */; };
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */; };
5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */; };
5CFA59C42860BC6200863A68 /* MigrateToAppGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */; };
5CFA59D12864782E00863A68 /* ChatArchiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59CF286477B400863A68 /* ChatArchiveView.swift */; };
5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; };
@@ -172,6 +165,11 @@
648010AB281ADD15009009B9 /* CIFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 648010AA281ADD15009009B9 /* CIFileView.swift */; };
649BCDA0280460FD00C3A862 /* ComposeImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCD9F280460FD00C3A862 /* ComposeImageView.swift */; };
649BCDA22805D6EF00C3A862 /* CIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649BCDA12805D6EF00C3A862 /* CIImageView.swift */; };
64A353102A4C84CE007CD71D /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A3530B2A4C84CE007CD71D /* libgmp.a */; };
64A353112A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A3530C2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a */; };
64A353122A4C84CE007CD71D /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A3530D2A4C84CE007CD71D /* libffi.a */; };
64A353132A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A3530E2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a */; };
64A353142A4C84CE007CD71D /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64A3530F2A4C84CE007CD71D /* libgmpxx.a */; };
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */; };
64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; };
64C06EB52A0A4A7C00792D4D /* ChatItemInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */; };
@@ -263,11 +261,6 @@
5C00168028C4FE760094D739 /* KeyChain.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyChain.swift; sourceTree = "<group>"; };
5C029EA72837DBB3004A9677 /* CICallItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CICallItemView.swift; sourceTree = "<group>"; };
5C029EA9283942EA004A9677 /* CallController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallController.swift; sourceTree = "<group>"; };
5C04038D2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a"; sourceTree = "<group>"; };
5C04038E2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a"; sourceTree = "<group>"; };
5C04038F2A7EAA41006ACFE8 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
5C0403902A7EAA41006ACFE8 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
5C0403912A7EAA41006ACFE8 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
5C05DF522840AA1D00C683F9 /* CallSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallSettings.swift; sourceTree = "<group>"; };
5C063D2627A4564100AEC577 /* ChatPreviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatPreviewView.swift; sourceTree = "<group>"; };
5C10D88728EED12E00E58BF0 /* ContactConnectionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactConnectionInfo.swift; sourceTree = "<group>"; };
@@ -424,8 +417,6 @@
5CE4407827ADB701007B033A /* EmojiItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiItemView.swift; sourceTree = "<group>"; };
5CEACCE227DE9246000BD591 /* ComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeView.swift; sourceTree = "<group>"; };
5CEACCEC27DEA495000BD591 /* MsgContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MsgContentView.swift; sourceTree = "<group>"; };
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardPadding.swift; sourceTree = "<group>"; };
5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetDeliveryReceiptsView.swift; sourceTree = "<group>"; };
5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = "<group>"; };
5CFA59CF286477B400863A68 /* ChatArchiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatArchiveView.swift; sourceTree = "<group>"; };
5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ZoomableScrollView.swift; path = Shared/Views/ZoomableScrollView.swift; sourceTree = SOURCE_ROOT; };
@@ -450,6 +441,11 @@
6493D667280ED77F007A76FB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
649BCD9F280460FD00C3A862 /* ComposeImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeImageView.swift; sourceTree = "<group>"; };
649BCDA12805D6EF00C3A862 /* CIImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIImageView.swift; sourceTree = "<group>"; };
64A3530B2A4C84CE007CD71D /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
64A3530C2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a"; sourceTree = "<group>"; };
64A3530D2A4C84CE007CD71D /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
64A3530E2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a"; sourceTree = "<group>"; };
64A3530F2A4C84CE007CD71D /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
64AA1C6827EE10C800AC7277 /* ContextItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextItemView.swift; sourceTree = "<group>"; };
64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedItemView.swift; sourceTree = "<group>"; };
64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemInfoView.swift; sourceTree = "<group>"; };
@@ -501,13 +497,13 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C0403932A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a in Frameworks */,
5C0403922A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a in Frameworks */,
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
5C0403942A7EAA41006ACFE8 /* libffi.a in Frameworks */,
5C0403952A7EAA41006ACFE8 /* libgmp.a in Frameworks */,
64A353132A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a in Frameworks */,
64A353102A4C84CE007CD71D /* libgmp.a in Frameworks */,
64A353112A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a in Frameworks */,
64A353122A4C84CE007CD71D /* libffi.a in Frameworks */,
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
5C0403962A7EAA41006ACFE8 /* libgmpxx.a in Frameworks */,
64A353142A4C84CE007CD71D /* libgmpxx.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -568,11 +564,11 @@
5C764E5C279C70B7000C6508 /* Libraries */ = {
isa = PBXGroup;
children = (
5C04038F2A7EAA41006ACFE8 /* libffi.a */,
5C0403902A7EAA41006ACFE8 /* libgmp.a */,
5C0403912A7EAA41006ACFE8 /* libgmpxx.a */,
5C04038D2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5-ghc8.10.7.a */,
5C04038E2A7EAA41006ACFE8 /* libHSsimplex-chat-5.3.0.2-57EsBXX08D1H5qwhz1zMA5.a */,
64A3530D2A4C84CE007CD71D /* libffi.a */,
64A3530B2A4C84CE007CD71D /* libgmp.a */,
64A3530F2A4C84CE007CD71D /* libgmpxx.a */,
64A3530E2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm-ghc8.10.7.a */,
64A3530C2A4C84CE007CD71D /* libHSsimplex-chat-5.2.0.0-ESKsZ4YorLH7yFQuFvHeIm.a */,
);
path = Libraries;
sourceTree = "<group>";
@@ -623,7 +619,6 @@
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */,
64466DCB29FFE3E800E3D48D /* MailView.swift */,
64C3B0202A0D359700E19930 /* CustomTimePicker.swift */,
5CEBD7452A5C0A8F00665FE2 /* KeyboardPadding.swift */,
);
path = Helpers;
sourceTree = "<group>";
@@ -746,7 +741,6 @@
5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */,
64D0C2BF29F9688300B38D5F /* UserAddressView.swift */,
64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */,
5CEBD7472A5F115D00665FE2 /* SetDeliveryReceiptsView.swift */,
);
path = UserSettings;
sourceTree = "<group>";
@@ -1148,7 +1142,6 @@
647F090E288EA27B00644C40 /* GroupMemberInfoView.swift in Sources */,
646BB38E283FDB6D001CE359 /* LocalAuthenticationUtils.swift in Sources */,
5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */,
5CEBD7462A5C0A8F00665FE2 /* KeyboardPadding.swift in Sources */,
5C35CFC827B2782E00FB6C6D /* BGManager.swift in Sources */,
5CB634B129E5EFEA0066AD6B /* PasscodeView.swift in Sources */,
5C2E260F27A30FDC00F70299 /* ChatView.swift in Sources */,
@@ -1197,7 +1190,6 @@
5C9CC7A928C532AB00BEF955 /* DatabaseErrorView.swift in Sources */,
5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */,
64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */,
5CEBD7482A5F115D00665FE2 /* SetDeliveryReceiptsView.swift in Sources */,
5C9C2DA7289957AE00CC63B1 /* AdvancedNetworkSettings.swift in Sources */,
5CADE79A29211BB900072E13 /* PreferencesView.swift in Sources */,
644EFFE42937BE9700525D5B /* MarkedDeletedItemView.swift in Sources */,
@@ -1478,7 +1470,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 151;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -1499,7 +1491,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.3;
MARKETING_VERSION = 5.2;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1520,7 +1512,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 151;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
ENABLE_PREVIEWS = YES;
@@ -1541,7 +1533,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 5.3;
MARKETING_VERSION = 5.2;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
PRODUCT_NAME = SimpleX;
SDKROOT = iphoneos;
@@ -1600,7 +1592,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 151;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
@@ -1613,7 +1605,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.3;
MARKETING_VERSION = 5.2;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1632,7 +1624,7 @@
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 151;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
ENABLE_BITCODE = NO;
GENERATE_INFOPLIST_FILE = YES;
@@ -1645,7 +1637,7 @@
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 5.3;
MARKETING_VERSION = 5.2;
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1664,7 +1656,7 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 71;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1688,7 +1680,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
MARKETING_VERSION = 5.2;
MARKETING_VERSION = 4.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;
@@ -1710,7 +1702,7 @@
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164;
CURRENT_PROJECT_VERSION = 71;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 5NN7GUYB6T;
DYLIB_COMPATIBILITY_VERSION = 1;
@@ -1734,7 +1726,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Libraries/sim",
);
MARKETING_VERSION = 5.2;
MARKETING_VERSION = 4.0;
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SDKROOT = iphoneos;

View File

@@ -41,7 +41,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"

View File

@@ -206,7 +206,7 @@ public func responseError(_ err: Error) -> String {
switch r {
case let .chatCmdError(_, chatError): return chatErrorString(chatError)
case let .chatError(_, chatError): return chatErrorString(chatError)
default: return "\(String(describing: r.responseType)), details: \(String(describing: r.details))"
default: return String(describing: r)
}
} else {
return String(describing: err)

View File

@@ -17,9 +17,6 @@ public enum ChatCommand {
case createActiveUser(profile: Profile?, sameServers: Bool, pastTimestamp: Bool)
case listUsers
case apiSetActiveUser(userId: Int64, viewPwd: String?)
case setAllContactReceipts(enable: Bool)
case apiSetUserContactReceipts(userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings)
case apiSetUserGroupReceipts(userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings)
case apiHideUser(userId: Int64, viewPwd: String)
case apiUnhideUser(userId: Int64, viewPwd: String)
case apiMuteUser(userId: Int64)
@@ -69,7 +66,6 @@ public enum ChatCommand {
case apiGetChatItemTTL(userId: Int64)
case apiSetNetworkConfig(networkConfig: NetCfg)
case apiGetNetworkConfig
case reconnectAllServers
case apiSetChatSettings(type: ChatType, id: Int64, chatSettings: ChatSettings)
case apiContactInfo(contactId: Int64)
case apiGroupMemberInfo(groupId: Int64, groupMemberId: Int64)
@@ -77,8 +73,6 @@ public enum ChatCommand {
case apiSwitchGroupMember(groupId: Int64, groupMemberId: Int64)
case apiAbortSwitchContact(contactId: Int64)
case apiAbortSwitchGroupMember(groupId: Int64, groupMemberId: Int64)
case apiSyncContactRatchet(contactId: Int64, force: Bool)
case apiSyncGroupMemberRatchet(groupId: Int64, groupMemberId: Int64, force: Bool)
case apiGetContactCode(contactId: Int64)
case apiGetGroupMemberCode(groupId: Int64, groupMemberId: Int64)
case apiVerifyContact(contactId: Int64, connectionCode: String?)
@@ -125,13 +119,6 @@ public enum ChatCommand {
return "/_create user \(encodeJSON(user))"
case .listUsers: return "/users"
case let .apiSetActiveUser(userId, viewPwd): return "/_user \(userId)\(maybePwd(viewPwd))"
case let .setAllContactReceipts(enable): return "/set receipts all \(onOff(enable))"
case let .apiSetUserContactReceipts(userId, userMsgReceiptSettings):
let umrs = userMsgReceiptSettings
return "/_set receipts contacts \(userId) \(onOff(umrs.enable)) clear_overrides=\(onOff(umrs.clearOverrides))"
case let .apiSetUserGroupReceipts(userId, userMsgReceiptSettings):
let umrs = userMsgReceiptSettings
return "/_set receipts groups \(userId) \(onOff(umrs.enable)) clear_overrides=\(onOff(umrs.clearOverrides))"
case let .apiHideUser(userId, viewPwd): return "/_hide user \(userId) \(encodeJSON(viewPwd))"
case let .apiUnhideUser(userId, viewPwd): return "/_unhide user \(userId) \(encodeJSON(viewPwd))"
case let .apiMuteUser(userId): return "/_mute user \(userId)"
@@ -189,7 +176,6 @@ public enum ChatCommand {
case let .apiGetChatItemTTL(userId): return "/_ttl \(userId)"
case let .apiSetNetworkConfig(networkConfig): return "/_network \(encodeJSON(networkConfig))"
case .apiGetNetworkConfig: return "/network"
case .reconnectAllServers: return "/reconnect"
case let .apiSetChatSettings(type, id, chatSettings): return "/_settings \(ref(type, id)) \(encodeJSON(chatSettings))"
case let .apiContactInfo(contactId): return "/_info @\(contactId)"
case let .apiGroupMemberInfo(groupId, groupMemberId): return "/_info #\(groupId) \(groupMemberId)"
@@ -197,16 +183,6 @@ public enum ChatCommand {
case let .apiSwitchGroupMember(groupId, groupMemberId): return "/_switch #\(groupId) \(groupMemberId)"
case let .apiAbortSwitchContact(contactId): return "/_abort switch @\(contactId)"
case let .apiAbortSwitchGroupMember(groupId, groupMemberId): return "/_abort switch #\(groupId) \(groupMemberId)"
case let .apiSyncContactRatchet(contactId, force): if force {
return "/_sync @\(contactId) force=on"
} else {
return "/_sync @\(contactId)"
}
case let .apiSyncGroupMemberRatchet(groupId, groupMemberId, force): if force {
return "/_sync #\(groupId) \(groupMemberId) force=on"
} else {
return "/_sync #\(groupId) \(groupMemberId)"
}
case let .apiGetContactCode(contactId): return "/_get code @\(contactId)"
case let .apiGetGroupMemberCode(groupId, groupMemberId): return "/_get code #\(groupId) \(groupMemberId)"
case let .apiVerifyContact(contactId, .some(connectionCode)): return "/_verify code @\(contactId) \(connectionCode)"
@@ -259,9 +235,6 @@ public enum ChatCommand {
case .createActiveUser: return "createActiveUser"
case .listUsers: return "listUsers"
case .apiSetActiveUser: return "apiSetActiveUser"
case .setAllContactReceipts: return "setAllContactReceipts"
case .apiSetUserContactReceipts: return "apiSetUserContactReceipts"
case .apiSetUserGroupReceipts: return "apiSetUserGroupReceipts"
case .apiHideUser: return "apiHideUser"
case .apiUnhideUser: return "apiUnhideUser"
case .apiMuteUser: return "apiMuteUser"
@@ -311,7 +284,6 @@ public enum ChatCommand {
case .apiGetChatItemTTL: return "apiGetChatItemTTL"
case .apiSetNetworkConfig: return "apiSetNetworkConfig"
case .apiGetNetworkConfig: return "apiGetNetworkConfig"
case .reconnectAllServers: return "reconnectAllServers"
case .apiSetChatSettings: return "apiSetChatSettings"
case .apiContactInfo: return "apiContactInfo"
case .apiGroupMemberInfo: return "apiGroupMemberInfo"
@@ -319,8 +291,6 @@ public enum ChatCommand {
case .apiSwitchGroupMember: return "apiSwitchGroupMember"
case .apiAbortSwitchContact: return "apiAbortSwitchContact"
case .apiAbortSwitchGroupMember: return "apiAbortSwitchGroupMember"
case .apiSyncContactRatchet: return "apiSyncContactRatchet"
case .apiSyncGroupMemberRatchet: return "apiSyncGroupMemberRatchet"
case .apiGetContactCode: return "apiGetContactCode"
case .apiGetGroupMemberCode: return "apiGetGroupMemberCode"
case .apiVerifyContact: return "apiVerifyContact"
@@ -437,14 +407,6 @@ public enum ChatResponse: Decodable, Error {
case groupMemberSwitchStarted(user: User, groupInfo: GroupInfo, member: GroupMember, connectionStats: ConnectionStats)
case contactSwitchAborted(user: User, contact: Contact, connectionStats: ConnectionStats)
case groupMemberSwitchAborted(user: User, groupInfo: GroupInfo, member: GroupMember, connectionStats: ConnectionStats)
case contactSwitch(user: User, contact: Contact, switchProgress: SwitchProgress)
case groupMemberSwitch(user: User, groupInfo: GroupInfo, member: GroupMember, switchProgress: SwitchProgress)
case contactRatchetSyncStarted(user: User, contact: Contact, connectionStats: ConnectionStats)
case groupMemberRatchetSyncStarted(user: User, groupInfo: GroupInfo, member: GroupMember, connectionStats: ConnectionStats)
case contactRatchetSync(user: User, contact: Contact, ratchetSyncProgress: RatchetSyncProgress)
case groupMemberRatchetSync(user: User, groupInfo: GroupInfo, member: GroupMember, ratchetSyncProgress: RatchetSyncProgress)
case contactVerificationReset(user: User, contact: Contact)
case groupMemberVerificationReset(user: User, groupInfo: GroupInfo, member: GroupMember)
case contactCode(user: User, contact: Contact, connectionCode: String)
case groupMemberCode(user: User, groupInfo: GroupInfo, member: GroupMember, connectionCode: String)
case connectionVerified(user: User, verified: Bool, expectedCode: String)
@@ -452,7 +414,6 @@ public enum ChatResponse: Decodable, Error {
case sentConfirmation(user: User)
case sentInvitation(user: User)
case contactAlreadyExists(user: User, contact: Contact)
case contactRequestAlreadyAccepted(user: User, contact: Contact)
case contactDeleted(user: User, contact: Contact)
case chatCleared(user: User, chatInfo: ChatInfo)
case userProfileNoChange(user: User)
@@ -482,7 +443,6 @@ public enum ChatResponse: Decodable, Error {
case newChatItem(user: User, chatItem: AChatItem)
case chatItemStatusUpdated(user: User, chatItem: AChatItem)
case chatItemUpdated(user: User, chatItem: AChatItem)
case chatItemNotChanged(user: User, chatItem: AChatItem)
case chatItemReaction(user: User, added: Bool, reaction: ACIReaction)
case chatItemDeleted(user: User, deletedChatItem: AChatItem, toChatItem: AChatItem?, byUser: Bool)
case contactsList(user: User, contacts: [Contact])
@@ -570,14 +530,6 @@ public enum ChatResponse: Decodable, Error {
case .groupMemberSwitchStarted: return "groupMemberSwitchStarted"
case .contactSwitchAborted: return "contactSwitchAborted"
case .groupMemberSwitchAborted: return "groupMemberSwitchAborted"
case .contactSwitch: return "contactSwitch"
case .groupMemberSwitch: return "groupMemberSwitch"
case .contactRatchetSyncStarted: return "contactRatchetSyncStarted"
case .groupMemberRatchetSyncStarted: return "groupMemberRatchetSyncStarted"
case .contactRatchetSync: return "contactRatchetSync"
case .groupMemberRatchetSync: return "groupMemberRatchetSync"
case .contactVerificationReset: return "contactVerificationReset"
case .groupMemberVerificationReset: return "groupMemberVerificationReset"
case .contactCode: return "contactCode"
case .groupMemberCode: return "groupMemberCode"
case .connectionVerified: return "connectionVerified"
@@ -585,7 +537,6 @@ public enum ChatResponse: Decodable, Error {
case .sentConfirmation: return "sentConfirmation"
case .sentInvitation: return "sentInvitation"
case .contactAlreadyExists: return "contactAlreadyExists"
case .contactRequestAlreadyAccepted: return "contactRequestAlreadyAccepted"
case .contactDeleted: return "contactDeleted"
case .chatCleared: return "chatCleared"
case .userProfileNoChange: return "userProfileNoChange"
@@ -615,7 +566,6 @@ public enum ChatResponse: Decodable, Error {
case .newChatItem: return "newChatItem"
case .chatItemStatusUpdated: return "chatItemStatusUpdated"
case .chatItemUpdated: return "chatItemUpdated"
case .chatItemNotChanged: return "chatItemNotChanged"
case .chatItemReaction: return "chatItemReaction"
case .chatItemDeleted: return "chatItemDeleted"
case .contactsList: return "contactsList"
@@ -702,14 +652,6 @@ public enum ChatResponse: Decodable, Error {
case let .groupMemberSwitchStarted(u, groupInfo, member, connectionStats): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats: \(String(describing: connectionStats))")
case let .contactSwitchAborted(u, contact, connectionStats): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))")
case let .groupMemberSwitchAborted(u, groupInfo, member, connectionStats): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats: \(String(describing: connectionStats))")
case let .contactSwitch(u, contact, switchProgress): return withUser(u, "contact: \(String(describing: contact))\nswitchProgress: \(String(describing: switchProgress))")
case let .groupMemberSwitch(u, groupInfo, member, switchProgress): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nswitchProgress: \(String(describing: switchProgress))")
case let .contactRatchetSyncStarted(u, contact, connectionStats): return withUser(u, "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))")
case let .groupMemberRatchetSyncStarted(u, groupInfo, member, connectionStats): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats: \(String(describing: connectionStats))")
case let .contactRatchetSync(u, contact, ratchetSyncProgress): return withUser(u, "contact: \(String(describing: contact))\nratchetSyncProgress: \(String(describing: ratchetSyncProgress))")
case let .groupMemberRatchetSync(u, groupInfo, member, ratchetSyncProgress): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nratchetSyncProgress: \(String(describing: ratchetSyncProgress))")
case let .contactVerificationReset(u, contact): return withUser(u, "contact: \(String(describing: contact))")
case let .groupMemberVerificationReset(u, groupInfo, member): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))")
case let .contactCode(u, contact, connectionCode): return withUser(u, "contact: \(String(describing: contact))\nconnectionCode: \(connectionCode)")
case let .groupMemberCode(u, groupInfo, member, connectionCode): return withUser(u, "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionCode: \(connectionCode)")
case let .connectionVerified(u, verified, expectedCode): return withUser(u, "verified: \(verified)\nconnectionCode: \(expectedCode)")
@@ -717,7 +659,6 @@ public enum ChatResponse: Decodable, Error {
case .sentConfirmation: return noDetails
case .sentInvitation: return noDetails
case let .contactAlreadyExists(u, contact): return withUser(u, String(describing: contact))
case let .contactRequestAlreadyAccepted(u, contact): return withUser(u, String(describing: contact))
case let .contactDeleted(u, contact): return withUser(u, String(describing: contact))
case let .chatCleared(u, chatInfo): return withUser(u, String(describing: chatInfo))
case .userProfileNoChange: return noDetails
@@ -747,7 +688,6 @@ public enum ChatResponse: Decodable, Error {
case let .newChatItem(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemStatusUpdated(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemUpdated(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemNotChanged(u, chatItem): return withUser(u, String(describing: chatItem))
case let .chatItemReaction(u, added, reaction): return withUser(u, "added: \(added)\n\(String(describing: reaction))")
case let .chatItemDeleted(u, deletedChatItem, toChatItem, byUser): return withUser(u, "deletedChatItem:\n\(String(describing: deletedChatItem))\ntoChatItem:\n\(String(describing: toChatItem))\nbyUser: \(byUser)")
case let .contactsList(u, contacts): return withUser(u, String(describing: contacts))
@@ -821,14 +761,6 @@ public enum ChatResponse: Decodable, Error {
}
}
public func chatError(_ chatResponse: ChatResponse) -> ChatErrorType? {
switch chatResponse {
case let .chatCmdError(_, .error(error)): return error
case let .chatError(_, .error(error)): return error
default: return nil
}
}
struct NewUser: Encodable {
var profile: Profile?
var sameServers: Bool
@@ -1062,7 +994,6 @@ public struct NetCfg: Codable, Equatable {
public var sessionMode: TransportSessionMode
public var tcpConnectTimeout: Int // microseconds
public var tcpTimeout: Int // microseconds
public var tcpTimeoutPerKb: Int // microseconds
public var tcpKeepAlive: KeepAliveOpts?
public var smpPingInterval: Int // microseconds
public var smpPingCount: Int // times
@@ -1071,9 +1002,8 @@ public struct NetCfg: Codable, Equatable {
public static let defaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 15_000_000,
tcpTimeout: 10_000_000,
tcpTimeoutPerKb: 20_000,
tcpConnectTimeout: 10_000_000,
tcpTimeout: 7_000_000,
tcpKeepAlive: KeepAliveOpts.defaults,
smpPingInterval: 1200_000_000,
smpPingCount: 3,
@@ -1083,9 +1013,8 @@ public struct NetCfg: Codable, Equatable {
public static let proxyDefaults: NetCfg = NetCfg(
socksProxy: nil,
sessionMode: TransportSessionMode.user,
tcpConnectTimeout: 30_000_000,
tcpTimeout: 20_000_000,
tcpTimeoutPerKb: 40_000,
tcpConnectTimeout: 20_000_000,
tcpTimeout: 15_000_000,
tcpKeepAlive: KeepAliveOpts.defaults,
smpPingInterval: 1200_000_000,
smpPingCount: 3,
@@ -1161,42 +1090,19 @@ public struct KeepAliveOpts: Codable, Equatable {
public struct ChatSettings: Codable {
public var enableNtfs: Bool
public var sendRcpts: Bool?
public var favorite: Bool
public init(enableNtfs: Bool, sendRcpts: Bool?, favorite: Bool) {
public init(enableNtfs: Bool, favorite: Bool) {
self.enableNtfs = enableNtfs
self.sendRcpts = sendRcpts
self.favorite = favorite
}
public static let defaults: ChatSettings = ChatSettings(enableNtfs: true, sendRcpts: nil, favorite: false)
public static let defaults: ChatSettings = ChatSettings(enableNtfs: true, favorite: false)
}
public struct UserMsgReceiptSettings: Codable {
public var enable: Bool
public var clearOverrides: Bool
public init(enable: Bool, clearOverrides: Bool) {
self.enable = enable
self.clearOverrides = clearOverrides
}
}
public struct ConnectionStats: Decodable {
public var connAgentVersion: Int
public struct ConnectionStats: Codable {
public var rcvQueuesInfo: [RcvQueueInfo]
public var sndQueuesInfo: [SndQueueInfo]
public var ratchetSyncState: RatchetSyncState
public var ratchetSyncSupported: Bool
public var ratchetSyncAllowed: Bool {
ratchetSyncSupported && [.allowed, .required].contains(ratchetSyncState)
}
public var ratchetSyncSendProhibited: Bool {
[.required, .started, .agreed].contains(ratchetSyncState)
}
}
public struct RcvQueueInfo: Codable {
@@ -1222,30 +1128,6 @@ public enum SndSwitchStatus: String, Codable {
case sendingQTEST = "sending_qtest"
}
public enum QueueDirection: String, Decodable {
case rcv
case snd
}
public struct SwitchProgress: Decodable {
public var queueDirection: QueueDirection
public var switchPhase: SwitchPhase
public var connectionStats: ConnectionStats
}
public struct RatchetSyncProgress: Decodable {
public var ratchetSyncStatus: RatchetSyncState
public var connectionStats: ConnectionStats
}
public enum RatchetSyncState: String, Decodable {
case ok
case allowed
case required
case started
case agreed
}
public struct UserContactLink: Decodable {
public var connReqContact: String
public var autoAccept: AutoAccept?
@@ -1381,32 +1263,14 @@ public enum ChatError: Decodable {
public enum ChatErrorType: Decodable {
case noActiveUser
case noConnectionUser(agentConnId: String)
case noSndFileUser(agentSndFileId: String)
case noRcvFileUser(agentRcvFileId: String)
case userUnknown
case activeUserExists
case userExists
case differentActiveUser(commandUserId: Int64, activeUserId: Int64)
case cantDeleteActiveUser(userId: Int64)
case cantDeleteLastUser(userId: Int64)
case cantHideLastUser(userId: Int64)
case hiddenUserAlwaysMuted(userId: Int64)
case emptyUserPassword(userId: Int64)
case userAlreadyHidden(userId: Int64)
case userNotHidden(userId: Int64)
case differentActiveUser
case chatNotStarted
case chatNotStopped
case chatStoreChanged
case invalidConnReq
case invalidChatMessage(connection: Connection, message: String)
case invalidChatMessage(message: String)
case contactNotReady(contact: Contact)
case contactDisabled(contact: Contact)
case connectionDisabled(connection: Connection)
case groupUserRole(groupInfo: GroupInfo, requiredRole: GroupMemberRole)
case groupMemberInitialRole(groupInfo: GroupInfo, initialRole: GroupMemberRole)
case contactIncognitoCantInvite
case groupIncognitoCantInvite
case groupUserRole
case groupContactRole(contactName: ContactName)
case groupDuplicateMember(contactName: ContactName)
case groupDuplicateMemberId
@@ -1418,49 +1282,23 @@ public enum ChatErrorType: Decodable {
case groupCantResendInvitation(groupInfo: GroupInfo, contactName: ContactName)
case groupInternal(message: String)
case fileNotFound(message: String)
case fileSize(filePath: String)
case fileAlreadyReceiving(message: String)
case fileCancelled(message: String)
case fileCancel(fileId: Int64, message: String)
case fileAlreadyExists(filePath: String)
case fileRead(filePath: String, message: String)
case fileWrite(filePath: String, message: String)
case fileSend(fileId: Int64, agentError: String)
case fileRcvChunk(message: String)
case fileInternal(message: String)
case fileImageType(filePath: String)
case fileImageSize(filePath: String)
case fileNotReceived(fileId: Int64)
// case xFTPRcvFile
// case xFTPSndFile
case fallbackToSMPProhibited(fileId: Int64)
case inlineFileProhibited(fileId: Int64)
case invalidQuote
case invalidChatItemUpdate
case invalidChatItemDelete
case hasCurrentCall
case noCurrentCall
case callContact(contactId: Int64)
case callState
case directMessagesProhibited(contact: Contact)
case agentVersion
case agentNoSubResult(agentConnId: String)
case commandError(message: String)
case serverProtocol
case agentCommandError(message: String)
case invalidFileDescription(message: String)
case internalError(message: String)
case exception(message: String)
}
public enum StoreError: Decodable {
case duplicateName
case userNotFound(userId: Int64)
case userNotFoundByName(contactName: ContactName)
case userNotFoundByContactId(contactId: Int64)
case userNotFoundByGroupId(groupId: Int64)
case userNotFoundByFileId(fileId: Int64)
case userNotFoundByContactRequestId(contactRequestId: Int64)
case contactNotFound(contactId: Int64)
case contactNotFoundByName(contactName: ContactName)
case contactNotReady(contactName: ContactName)
@@ -1470,9 +1308,6 @@ public enum StoreError: Decodable {
case contactRequestNotFoundByName(contactName: ContactName)
case groupNotFound(groupId: Int64)
case groupNotFoundByName(groupName: GroupName)
case groupMemberNameNotFound(groupId: Int64, groupMemberName: ContactName)
case groupMemberNotFound(groupMemberId: Int64)
case groupMemberNotFoundByMemberId(memberId: String)
case groupWithoutUser
case duplicateGroupMember
case groupAlreadyJoined
@@ -1480,16 +1315,9 @@ public enum StoreError: Decodable {
case sndFileNotFound(fileId: Int64)
case sndFileInvalid(fileId: Int64)
case rcvFileNotFound(fileId: Int64)
case rcvFileDescrNotFound(fileId: Int64)
case fileNotFound(fileId: Int64)
case rcvFileInvalid(fileId: Int64)
case rcvFileInvalidDescrPart
case sharedMsgIdNotFoundByFileId(fileId: Int64)
case fileIdNotFoundBySharedMsgId(sharedMsgId: String)
case sndFileNotFoundXFTP(agentSndFileId: String)
case rcvFileNotFoundXFTP(agentRcvFileId: String)
case connectionNotFound(agentConnId: String)
case connectionNotFoundById(connId: Int64)
case pendingConnectionNotFound(connId: Int64)
case introNotFound
case uniqueID
@@ -1497,16 +1325,11 @@ public enum StoreError: Decodable {
case noMsgDelivery(connId: Int64, agentMsgId: String)
case badChatItem(itemId: Int64)
case chatItemNotFound(itemId: Int64)
case chatItemNotFoundByText(text: String)
case quotedChatItemNotFound
case chatItemSharedMsgIdNotFound(sharedMsgId: String)
case chatItemNotFoundByFileId(fileId: Int64)
case chatItemNotFoundByGroupId(groupId: Int64)
case profileNotFound(profileId: Int64)
case duplicateGroupLink(groupInfo: GroupInfo)
case groupLinkNotFound(groupInfo: GroupInfo)
case hostMemberIdNotFound(groupId: Int64)
case contactNotFoundByFileId(fileId: Int64)
case noGroupSndStatus(itemId: Int64, groupMemberId: Int64)
}
public enum DatabaseError: Decodable {
@@ -1526,12 +1349,11 @@ public enum AgentErrorType: Decodable {
case CMD(cmdErr: CommandErrorType)
case CONN(connErr: ConnectionErrorType)
case SMP(smpErr: ProtocolErrorType)
case NTF(ntfErr: ProtocolErrorType)
case XFTP(xftpErr: XFTPErrorType)
case NTF(ntfErr: ProtocolErrorType)
case BROKER(brokerAddress: String, brokerErr: BrokerErrorType)
case AGENT(agentErr: SMPAgentError)
case INTERNAL(internalErr: String)
case INACTIVE
}
public enum CommandErrorType: Decodable {
@@ -1551,10 +1373,9 @@ public enum ConnectionErrorType: Decodable {
}
public enum BrokerErrorType: Decodable {
case RESPONSE(smpErr: String)
case RESPONSE(smpErr: ProtocolErrorType)
case UNEXPECTED
case NETWORK
case HOST
case TRANSPORT(transportErr: ProtocolTransportError)
case TIMEOUT
}
@@ -1588,7 +1409,6 @@ public enum XFTPErrorType: Decodable {
public enum ProtocolCommandError: Decodable {
case UNKNOWN
case SYNTAX
case PROHIBITED
case NO_AUTH
case HAS_AUTH
case NO_ENTITY
@@ -1611,9 +1431,7 @@ public enum SMPAgentError: Decodable {
case A_MESSAGE
case A_PROHIBITED
case A_VERSION
case A_CRYPTO
case A_DUPLICATE
case A_QUEUE(queueErr: String)
case A_ENCRYPTION
}
public enum ArchiveError: Decodable {

View File

@@ -13,8 +13,6 @@ let GROUP_DEFAULT_APP_STATE = "appState"
let GROUP_DEFAULT_DB_CONTAINER = "dbContainer"
public let GROUP_DEFAULT_CHAT_LAST_START = "chatLastStart"
let GROUP_DEFAULT_NTF_PREVIEW_MODE = "ntfPreviewMode"
public let GROUP_DEFAULT_NTF_ENABLE_LOCAL = "ntfEnableLocal"
public let GROUP_DEFAULT_NTF_ENABLE_PERIODIC = "ntfEnablePeriodic"
let GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
public let GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE = "privacyTransferImagesInline" // no longer used
let GROUP_DEFAULT_NTF_BADGE_COUNT = "ntgBadgeCount"
@@ -22,7 +20,6 @@ let GROUP_DEFAULT_NETWORK_USE_ONION_HOSTS = "networkUseOnionHosts"
let GROUP_DEFAULT_NETWORK_SESSION_MODE = "networkSessionMode"
let GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT = "networkTCPConnectTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT = "networkTCPTimeout"
let GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB = "networkTCPTimeoutPerKb"
let GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL = "networkSMPPingInterval"
let GROUP_DEFAULT_NETWORK_SMP_PING_COUNT = "networkSMPPingCount"
let GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE = "networkEnableKeepAlive"
@@ -41,13 +38,10 @@ public let groupDefaults = UserDefaults(suiteName: APP_GROUP_NAME)!
public func registerGroupDefaults() {
groupDefaults.register(defaults: [
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.user.rawValue,
GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT: NetCfg.defaults.tcpConnectTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT: NetCfg.defaults.tcpTimeout,
GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB: NetCfg.defaults.tcpTimeoutPerKb,
GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL: NetCfg.defaults.smpPingInterval,
GROUP_DEFAULT_NETWORK_SMP_PING_COUNT: NetCfg.defaults.smpPingCount,
GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE: NetCfg.defaults.enableKeepAlive,
@@ -107,10 +101,6 @@ public let ntfPreviewModeGroupDefault = EnumDefault<NotificationPreviewMode>(
public let incognitoGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_INCOGNITO)
public let ntfEnableLocalGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_NTF_ENABLE_LOCAL)
public let ntfEnablePeriodicGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_NTF_ENABLE_PERIODIC)
public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES)
public let privacyTransferImagesInlineGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_TRANSFER_IMAGES_INLINE)
@@ -219,7 +209,6 @@ public func getNetCfg() -> NetCfg {
let sessionMode = networkSessionModeGroupDefault.get()
let tcpConnectTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
let tcpTimeout = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
let tcpTimeoutPerKb = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
let smpPingInterval = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL)
let smpPingCount = groupDefaults.integer(forKey: GROUP_DEFAULT_NETWORK_SMP_PING_COUNT)
let enableKeepAlive = groupDefaults.bool(forKey: GROUP_DEFAULT_NETWORK_ENABLE_KEEP_ALIVE)
@@ -238,7 +227,6 @@ public func getNetCfg() -> NetCfg {
sessionMode: sessionMode,
tcpConnectTimeout: tcpConnectTimeout,
tcpTimeout: tcpTimeout,
tcpTimeoutPerKb: tcpTimeoutPerKb,
tcpKeepAlive: tcpKeepAlive,
smpPingInterval: smpPingInterval,
smpPingCount: smpPingCount,
@@ -251,7 +239,6 @@ public func setNetCfg(_ cfg: NetCfg) {
networkSessionModeGroupDefault.set(cfg.sessionMode)
groupDefaults.set(cfg.tcpConnectTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_CONNECT_TIMEOUT)
groupDefaults.set(cfg.tcpTimeout, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT)
groupDefaults.set(cfg.tcpTimeoutPerKb, forKey: GROUP_DEFAULT_NETWORK_TCP_TIMEOUT_PER_KB)
groupDefaults.set(cfg.smpPingInterval, forKey: GROUP_DEFAULT_NETWORK_SMP_PING_INTERVAL)
groupDefaults.set(cfg.smpPingCount, forKey: GROUP_DEFAULT_NETWORK_SMP_PING_COUNT)
if let tcpKeepAlive = cfg.tcpKeepAlive {

View File

@@ -23,8 +23,6 @@ public struct User: Decodable, NamedChat, Identifiable {
public var localAlias: String { get { "" } }
public var showNtfs: Bool
public var sendRcptsContacts: Bool
public var sendRcptsSmallGroups: Bool
public var viewPwdHash: UserPwdHash?
public var id: Int64 { userId }
@@ -46,9 +44,7 @@ public struct User: Decodable, NamedChat, Identifiable {
profile: LocalProfile.sampleData,
fullPreferences: FullPreferences.sampleData,
activeUser: true,
showNtfs: true,
sendRcptsContacts: true,
sendRcptsSmallGroups: false
showNtfs: true
)
}
@@ -1200,13 +1196,6 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat {
}
}
public var groupInfo: GroupInfo? {
switch self {
case let .group(groupInfo): return groupInfo
default: return nil
}
}
// this works for features that are common for contacts and groups
public func featureEnabled(_ feature: ChatFeature) -> Bool {
switch self {
@@ -1364,7 +1353,7 @@ public struct Contact: Identifiable, Decodable, NamedChat {
public var id: ChatId { get { "@\(contactId)" } }
public var apiId: Int64 { get { contactId } }
public var ready: Bool { get { activeConn.connStatus == .ready } }
public var sendMsgEnabled: Bool { get { !(activeConn.connectionStats?.ratchetSyncSendProhibited ?? false) } }
public var sendMsgEnabled: Bool { get { true } }
public var displayName: String { localAlias == "" ? profile.displayName : localAlias }
public var fullName: String { get { profile.fullName } }
public var image: String? { get { profile.image } }
@@ -1437,12 +1426,6 @@ public struct Connection: Decodable {
public var customUserProfileId: Int64?
public var connectionCode: SecurityCode?
public var connectionStats: ConnectionStats? = nil
private enum CodingKeys: String, CodingKey {
case connId, agentConnId, connStatus, connLevel, viaGroupLink, customUserProfileId, connectionCode
}
public var id: ChatId { get { ":\(connId)" } }
static let sampleData = Connection(
@@ -2071,6 +2054,14 @@ public struct ChatItem: Identifiable, Decodable {
return nil
}
public var showMutableNotification: Bool {
switch content {
case .rcvCall: return false
case .rcvChatFeature: return false
default: return showNtfDir
}
}
public var memberDisplayName: String? {
get {
if case let .groupRcv(groupMember) = chatDir {
@@ -2270,7 +2261,13 @@ public struct CIMeta: Decodable {
}
public func statusIcon(_ metaColor: Color = .secondary) -> (String, Color)? {
itemStatus.statusIcon(metaColor)
switch itemStatus {
case .sndSent: return ("checkmark", metaColor)
case .sndErrorAuth: return ("multiply", .red)
case .sndError: return ("exclamationmark.triangle.fill", .yellow)
case .rcvNew: return ("circlebadge.fill", Color.accentColor)
default: return nil
}
}
public static func getSample(_ id: Int64, _ ts: Date, _ text: String, _ status: CIStatus = .sndNew, itemDeleted: CIDeleted? = nil, itemEdited: Bool = false, itemLive: Bool = false, editable: Bool = true) -> CIMeta {
@@ -2333,79 +2330,22 @@ private func recent(_ date: Date) -> Bool {
public enum CIStatus: Decodable {
case sndNew
case sndSent(sndProgress: SndCIStatusProgress)
case sndRcvd(msgRcptStatus: MsgReceiptStatus, sndProgress: SndCIStatusProgress)
case sndSent
case sndErrorAuth
case sndError(agentError: String)
case rcvNew
case rcvRead
case invalid(text: String)
var id: String {
switch self {
case .sndNew: return "sndNew"
case .sndSent: return "sndSent"
case .sndRcvd: return "sndRcvd"
case .sndErrorAuth: return "sndErrorAuth"
case .sndError: return "sndError"
case .rcvNew: return "rcvNew"
case .sndNew: return "sndNew"
case .sndSent: return "sndSent"
case .sndErrorAuth: return "sndErrorAuth"
case .sndError: return "sndError"
case .rcvNew: return "rcvNew"
case .rcvRead: return "rcvRead"
case .invalid: return "invalid"
}
}
public func statusIcon(_ metaColor: Color = .secondary) -> (String, Color)? {
switch self {
case .sndNew: return nil
case .sndSent: return ("checkmark", metaColor)
case let .sndRcvd(msgRcptStatus, _):
switch msgRcptStatus {
case .ok: return ("checkmark", metaColor)
case .badMsgHash: return ("checkmark", .red)
}
case .sndErrorAuth: return ("multiply", .red)
case .sndError: return ("exclamationmark.triangle.fill", .yellow)
case .rcvNew: return ("circlebadge.fill", Color.accentColor)
case .rcvRead: return nil
case .invalid: return ("questionmark", metaColor)
}
}
public var statusText: String {
switch self {
case .sndNew: return NSLocalizedString("Sending message", comment: "item status text")
case .sndSent: return NSLocalizedString("Message sent", comment: "item status text")
case .sndRcvd: return NSLocalizedString("Sent message received", comment: "item status text")
case .sndErrorAuth: return NSLocalizedString("Error sending message", comment: "item status text")
case .sndError: return NSLocalizedString("Error sending message", comment: "item status text")
case .rcvNew: return NSLocalizedString("Message received", comment: "item status text")
case .rcvRead: return NSLocalizedString("Message read", comment: "item status text")
case .invalid: return NSLocalizedString("Invalid status", comment: "item status text")
}
}
public var statusDescription: String {
switch self {
case .sndNew: return NSLocalizedString("Sending message is in progress or pending.", comment: "item status description")
case .sndSent: return NSLocalizedString("Message has been sent to the recipient's relay.", comment: "item status description")
case .sndRcvd: return NSLocalizedString("Message has been received by the recipient.", comment: "item status description")
case .sndErrorAuth: return NSLocalizedString("Message delivery error. Most likely this recipient has deleted the connection with you.", comment: "item status description")
case let .sndError(agentError): return String.localizedStringWithFormat(NSLocalizedString("Unexpected message delivery error: %@", comment: "item status description"), agentError)
case .rcvNew: return NSLocalizedString("New message from this sender.", comment: "item status description")
case .rcvRead: return NSLocalizedString("You've read this received message.", comment: "item status description")
case let .invalid(text): return text
}
}
}
public enum MsgReceiptStatus: String, Decodable {
case ok
case badMsgHash
}
public enum SndCIStatusProgress: String, Decodable {
case partial
case complete
}
public enum CIDeleted: Decodable {
@@ -2516,24 +2456,20 @@ public enum CIContent: Decodable, ItemContent {
public enum MsgDecryptError: String, Decodable {
case ratchetHeader
case tooManySkipped
case ratchetEarlier
case other
var text: String {
switch self {
case .ratchetHeader: return NSLocalizedString("Permanent decryption error", comment: "message decrypt error item")
case .tooManySkipped: return NSLocalizedString("Permanent decryption error", comment: "message decrypt error item")
case .ratchetEarlier: return NSLocalizedString("Decryption error", comment: "message decrypt error item")
case .other: return NSLocalizedString("Decryption error", comment: "message decrypt error item")
}
}
}
public struct CIQuote: Decodable, ItemContent {
public var chatDir: CIDirection?
var chatDir: CIDirection?
public var itemId: Int64?
var sharedMsgId: String? = nil
public var sentAt: Date
var sentAt: Date
public var content: MsgContent
public var formattedText: [FormattedText]?
@@ -2548,7 +2484,7 @@ public struct CIQuote: Decodable, ItemContent {
switch (chatDir) {
case .directSnd: return "you"
case .directRcv: return nil
case .groupSnd: return membership?.displayName ?? "you"
case .groupSnd: return membership?.displayName
case let .groupRcv(member): return member.displayName
case nil: return nil
}
@@ -2661,7 +2597,6 @@ public struct CIFile: Decodable {
case .rcvCancelled: return false
case .rcvComplete: return true
case .rcvError: return false
case .invalid: return false
}
}
}
@@ -2685,7 +2620,6 @@ public struct CIFile: Decodable {
case .rcvCancelled: return nil
case .rcvComplete: return nil
case .rcvError: return nil
case .invalid: return nil
}
}
}
@@ -2746,7 +2680,6 @@ public enum CIFileStatus: Decodable, Equatable {
case rcvComplete
case rcvCancelled
case rcvError
case invalid(text: String)
var id: String {
switch self {
@@ -2761,12 +2694,11 @@ public enum CIFileStatus: Decodable, Equatable {
case .rcvComplete: return "rcvComplete"
case .rcvCancelled: return "rcvCancelled"
case .rcvError: return "rcvError"
case .invalid: return "invalid"
}
}
}
public enum MsgContent: Equatable {
public enum MsgContent {
case text(String)
case link(text: String, preview: LinkPreview)
case image(text: String, image: String)
@@ -2827,19 +2759,6 @@ public enum MsgContent: Equatable {
case image
case duration
}
public static func == (lhs: MsgContent, rhs: MsgContent) -> Bool {
switch (lhs, rhs) {
case let (.text(lt), .text(rt)): return lt == rt
case let (.link(lt, lp), .link(rt, rp)): return lt == rt && lp == rp
case let (.image(lt, li), .image(rt, ri)): return lt == rt && li == ri
case let (.video(lt, li, ld), .video(rt, ri, rd)): return lt == rt && li == ri && ld == rd
case let (.voice(lt, ld), .voice(rt, rd)): return lt == rt && ld == rd
case let (.file(lf), .file(rf)): return lf == rf
case let (.unknown(lType, lt), .unknown(rType, rt)): return lType == rType && lt == rt
default: return false
}
}
}
extension MsgContent: Decodable {
@@ -3138,8 +3057,6 @@ public enum SndGroupEvent: Decodable {
public enum RcvConnEvent: Decodable {
case switchQueue(phase: SwitchPhase)
case ratchetSync(syncStatus: RatchetSyncState)
case verificationCodeReset
var text: String {
switch self {
@@ -3147,51 +3064,25 @@ public enum RcvConnEvent: Decodable {
if case .completed = phase {
return NSLocalizedString("changed address for you", comment: "chat item text")
}
return NSLocalizedString("changing address", comment: "chat item text")
case let .ratchetSync(syncStatus):
return ratchetSyncStatusToText(syncStatus)
case .verificationCodeReset:
return NSLocalizedString("security code changed", comment: "chat item text")
return NSLocalizedString("changing address...", comment: "chat item text")
}
}
}
func ratchetSyncStatusToText(_ ratchetSyncStatus: RatchetSyncState) -> String {
switch ratchetSyncStatus {
case .ok: return NSLocalizedString("encryption ok", comment: "chat item text")
case .allowed: return NSLocalizedString("encryption re-negotiation allowed", comment: "chat item text")
case .required: return NSLocalizedString("encryption re-negotiation required", comment: "chat item text")
case .started: return NSLocalizedString("agreeing encryption…", comment: "chat item text")
case .agreed: return NSLocalizedString("encryption agreed", comment: "chat item text")
}
}
public enum SndConnEvent: Decodable {
case switchQueue(phase: SwitchPhase, member: GroupMemberRef?)
case ratchetSync(syncStatus: RatchetSyncState, member: GroupMemberRef?)
var text: String {
switch self {
case let .switchQueue(phase, member):
if let name = member?.profile.profileViewName {
return phase == .completed
? String.localizedStringWithFormat(NSLocalizedString("you changed address for %@", comment: "chat item text"), name)
: String.localizedStringWithFormat(NSLocalizedString("changing address for %@", comment: "chat item text"), name)
? String.localizedStringWithFormat(NSLocalizedString("you changed address for %@", comment: "chat item text"), name)
: String.localizedStringWithFormat(NSLocalizedString("changing address for %@...", comment: "chat item text"), name)
}
return phase == .completed
? NSLocalizedString("you changed address", comment: "chat item text")
: NSLocalizedString("changing address", comment: "chat item text")
case let .ratchetSync(syncStatus, member):
if let name = member?.profile.profileViewName {
switch syncStatus {
case .ok: return String.localizedStringWithFormat(NSLocalizedString("encryption ok for %@", comment: "chat item text"), name)
case .allowed: return String.localizedStringWithFormat(NSLocalizedString("encryption re-negotiation allowed for %@", comment: "chat item text"), name)
case .required: return String.localizedStringWithFormat(NSLocalizedString("encryption re-negotiation required for %@", comment: "chat item text"), name)
case .started: return String.localizedStringWithFormat(NSLocalizedString("agreeing encryption for %@…", comment: "chat item text"), name)
case .agreed: return String.localizedStringWithFormat(NSLocalizedString("encryption agreed for %@", comment: "chat item text"), name)
}
}
return ratchetSyncStatusToText(syncStatus)
? NSLocalizedString("you changed address", comment: "chat item text")
: NSLocalizedString("changing address...", comment: "chat item text")
}
}
}
@@ -3255,7 +3146,6 @@ public enum ChatItemTTL: Hashable, Identifiable, Comparable {
public struct ChatItemInfo: Decodable {
public var itemVersions: [ChatItemVersion]
public var memberDeliveryStatuses: [MemberDeliveryStatus]?
}
public struct ChatItemVersion: Decodable {
@@ -3265,8 +3155,3 @@ public struct ChatItemVersion: Decodable {
public var itemVersionTs: Date
public var createdAt: Date
}
public struct MemberDeliveryStatus: Decodable {
public var groupMemberId: Int64
public var memberDeliveryStatus: CIStatus
}

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_kurzíva_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- více stabilní doručování zpráv.\n- o trochu lepší skupiny.\n- a více!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- 5 minutové hlasové zprávy.\n- vlastní čas mizení.\n- historie úprav.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ na %2$@:";
/* notification title */
"%@ is connected!" = "%@ je připojen!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 vteřin";
/* No comment provided by engineer. */
"A few more things" = "Ještě pár věcí";
/* notification title */
"A new contact" = "Nový kontakt";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "**pro každý kontakt a člena skupiny** bude použito samostatné připojení TCP.\n**Upozornění**: Pokud máte mnoho připojení, spotřeba baterie a provozu může být podstatně vyšší a některá připojení mohou selhat.";
/* No comment provided by engineer. */
"Abort" = "Přerušit";
/* No comment provided by engineer. */
"Abort changing address" = "Přerušit změnu adresy";
/* No comment provided by engineer. */
"Abort changing address?" = "Přerušit změnu adresy?";
/* No comment provided by engineer. */
"About SimpleX" = "O SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Adresa";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Změna adresy bude přerušena. Budou použity staré přijímací adresy.";
/* member role */
"admin" = "správce";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Pokročilá nastavení sítě";
/* chat item text */
"agreeing encryption for %@…" = "povoluji šifrování pro %@…";
/* chat item text */
"agreeing encryption…" = "povoluji šifrování…";
/* No comment provided by engineer. */
"All app data is deleted." = "Všechna data aplikace jsou smazána.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Povolit nevratné smazání odeslaných zpráv.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Povolit odesílání souborů a médii.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Povolit odesílání hlasových zpráv.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "změnil vaši roli na %@";
/* chat item text */
"changing address for %@" = "změna adresy pro %@";
"changing address for %@..." = "změna adresy pro %@...";
/* chat item text */
"changing address" = "změna adresy";
"changing address..." = "změna adresy...";
/* No comment provided by engineer. */
"Chat archive" = "Chat se archivuje";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Předvolby kontaktů";
/* No comment provided by engineer. */
"Contacts" = "Kontakty";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Kontakty mohou označit zprávy ke smazání; vy je budete moci zobrazit.";
@@ -930,7 +897,7 @@
/* No comment provided by engineer. */
"Decentralized" = "Decentralizované";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Chyba dešifrování";
/* pref value */
@@ -1053,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "odstraněna skupina";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Potvrzení o doručení jsou vypnuté!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Potvrzení o doručení!";
/* No comment provided by engineer. */
"Description" = "Popis";
@@ -1092,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Přímé zprávy mezi členy jsou v této skupině zakázány.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Vypnout (zachovat přepsání)";
/* No comment provided by engineer. */
"Disable for all" = "Vypnout pro všechny";
/* authentication reason */
"Disable SimpleX Lock" = "Vypnutí zámku SimpleX";
@@ -1137,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Nevytvářet adresu";
/* No comment provided by engineer. */
"Don't enable" = "Nepovolovat";
/* No comment provided by engineer. */
"Don't show again" = "Znovu neukazuj";
@@ -1170,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Zapnout";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Povolit (zachovat přepsání)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Povolit automatické mazání zpráv?";
/* No comment provided by engineer. */
"Enable for all" = "Povolit pro všechny";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Povolit okamžitá oznámení?";
@@ -1239,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Šifrovaná zpráva: neočekávaná chyba";
/* chat item text */
"encryption agreed" = "šifrování povoleno";
/* chat item text */
"encryption agreed for %@" = "šifrování povoleno pro %@";
/* chat item text */
"encryption ok" = "šifrování ok";
/* chat item text */
"encryption ok for %@" = "šifrování ok pro %@";
/* chat item text */
"encryption re-negotiation allowed" = "opětovné vyjednávání šifrování povoleno";
/* chat item text */
"encryption re-negotiation allowed for %@" = "opětovné vyjednávání šifrování povoleno pro %@";
/* chat item text */
"encryption re-negotiation required" = "vyžadováno opětovné vyjednávání šifrování";
/* chat item text */
"encryption re-negotiation required for %@" = "vyžadováno opětovné vyjednávání šifrování pro %@";
/* No comment provided by engineer. */
"ended" = "ukončeno";
@@ -1296,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Chyba";
/* No comment provided by engineer. */
"Error aborting address change" = "Chyba přerušení změny adresy";
/* No comment provided by engineer. */
"Error accepting contact request" = "Chyba při přijímání žádosti o kontakt";
@@ -1353,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Chyba mazání uživatelského profilu";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Chyba povolení potvrzení o doručení!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Chyba při aktivaci oznámení";
@@ -1413,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Chyba při přepínání profilu!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Chyba synchronizace připojení";
/* No comment provided by engineer. */
"Error updating group link" = "Chyba aktualizace odkazu skupiny";
@@ -1440,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Chyba: Adresa URL je neplatná";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "I při vypnutí v konverzaci.";
/* No comment provided by engineer. */
"Exit without saving" = "Ukončit bez uložení";
@@ -1456,7 +1366,7 @@
"Exported database archive." = "Exportovaný archiv databáze.";
/* No comment provided by engineer. */
"Exporting database archive" = "Exportuji archiv databáze";
"Exporting database archive..." = "Exportuji archiv databáze...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Přístupovou frázi se nepodařilo odstranit";
@@ -1464,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Rychle a bez čekání, než bude odesílatel online!";
/* No comment provided by engineer. */
"Favorite" = "Oblíbené";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Soubor bude smazán ze serverů.";
@@ -1482,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Soubory a média";
/* chat feature */
"Files and media" = "Soubory a média";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Soubory a média jsou zakázány v této skupině.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Soubory a média jsou zakázány!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtrovat nepřečtené a oblíbené chaty.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Konečně je máme! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Najděte chaty rychleji";
/* No comment provided by engineer. */
"Fix" = "Opravit";
/* No comment provided by engineer. */
"Fix connection" = "Opravit připojení";
/* No comment provided by engineer. */
"Fix connection?" = "Opravit připojení?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Opravit šifrování po obnovení zálohy.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Opravit nepodporované kontaktem";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Opravit nepodporované členem skupiny";
/* No comment provided by engineer. */
"For console" = "Pro konzoli";
@@ -1584,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Členové skupiny mohou posílat mizící zprávy.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Členové skupiny mohou posílat soubory a média.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Členové skupiny mohou posílat hlasové zprávy.";
@@ -1710,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Vylepšená konfigurace serveru";
/* copied message info */
"In reply to" = "V odpovědi na";
/* No comment provided by engineer. */
"Incognito" = "Inkognito";
@@ -1866,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Připojení ke skupině";
/* No comment provided by engineer. */
"Keep your connections" = "Zachovat vaše připojení";
/* No comment provided by engineer. */
"Keychain error" = "Chyba klíčenky";
@@ -1926,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Vytvořte si soukromé připojení";
/* No comment provided by engineer. */
"Make one message disappear" = "Nechat jednu zprávu zmizet";
/* No comment provided by engineer. */
"Make profile private!" = "Změnit profil na soukromý!";
@@ -1980,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Chyba doručení zprávy";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Potvrzení o doručení zprávy!";
/* No comment provided by engineer. */
"Message draft" = "Návrh zprávy";
@@ -2008,7 +1867,7 @@
"Messages & files" = "Zprávy";
/* No comment provided by engineer. */
"Migrating database archive" = "Přenášení archivu databáze";
"Migrating database archive..." = "Přenášení archivu databáze...";
/* No comment provided by engineer. */
"Migration error:" = "Chyba přenášení:";
@@ -2127,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "bez šifrování e2e";
/* No comment provided by engineer. */
"No filtered chats" = "Žádné filtrované chaty";
/* No comment provided by engineer. */
"No group!" = "Skupina nebyla nalezena!";
/* No comment provided by engineer. */
"No history" = "Žádná historie";
/* No comment provided by engineer. */
"No permission to record voice message" = "Nemáte oprávnění nahrávat hlasové zprávy";
@@ -2203,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Předvolby skupiny mohou měnit pouze vlastníci skupiny.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Pouze majitelé skupiny mohou povolit soubory a média.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Pouze majitelé skupin mohou povolit zasílání hlasových zpráv.";
@@ -2407,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Zakázat posílání mizících zpráv.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Zakázat odesílání souborů a médií.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Zakázat odesílání hlasových zpráv.";
@@ -2428,6 +2275,9 @@
/* No comment provided by engineer. */
"Rate the app" = "Ohodnoťte aplikaci";
/* chat item menu */
"React..." = "Reagovat...";
/* No comment provided by engineer. */
"Read" = "Číst";
@@ -2521,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "odstranil vás";
/* No comment provided by engineer. */
"Renegotiate" = "Znovu vyjednat";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Znovu vyjednat šifrování";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Znovu vyjednat šifrování?";
/* chat item action */
"Reply" = "Odpověď";
@@ -2668,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Bezpečnostní kód";
/* chat item text */
"security code changed" = "bezpečnostní kód změněn";
/* No comment provided by engineer. */
"Select" = "Vybrat";
@@ -2713,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Zasílání otázek a nápadů";
/* No comment provided by engineer. */
"Send receipts" = "Odeslat potvrzení";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Odeslat je z galerie nebo vlastní klávesnice.";
@@ -2725,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Odesílatel možná smazal požadavek připojení.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných chat profilech.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Odesílání potvrzení o doručení bude povoleno pro všechny kontakty.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Odesílání souboru bude zastaveno.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "Odesílání potvrzení o doručení je vypnuto pro %lld kontakty";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "Odesílání potvrzení o doručení je povoleno pro %lld kontakty";
/* No comment provided by engineer. */
"Sending via" = "Odesílání přes";
@@ -3007,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "Vytvořený archiv je k dispozici v aplikaci Nastavení / Databáze / Archiv staré databáze.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "Šifrování funguje a nové povolení šifrování není vyžadováno. To může vyvolat chybu v připojení!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Skupina je plně decentralizovaná - je viditelná pouze pro členy.";
@@ -3049,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Měl by tam být alespoň jeden viditelný uživatelský profil.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Toto nastavení je pro váš aktuální profil **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Mohou být přepsány v nastavení kontaktů";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Tuto akci nelze vrátit zpět - všechny přijaté a odeslané soubory a média budou smazány. Obrázky s nízkým rozlišením zůstanou zachovány.";
@@ -3067,6 +2881,9 @@
/* notification title */
"this contact" = "tento kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Tato chyba je pro toto připojení trvalá, připojte se znovu.";
/* No comment provided by engineer. */
"This group no longer exists." = "Tato skupina již neexistuje.";
@@ -3133,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Neočekávaný stav přenášení";
/* No comment provided by engineer. */
"Unfav." = "Odobl.";
/* No comment provided by engineer. */
"Unhide" = "Odkrýt";
@@ -3388,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Můžete vytvořit později";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Můžete povolit později v Nastavení";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Můžete je povolit později v nastavení Soukromí & Bezpečnosti aplikace";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Profil uživatele můžete skrýt nebo ztlumit - přejeďte prstem doprava.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_kursiv_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- stabilere Zustellung von Nachrichten.\n- ein bisschen verbesserte Gruppen.\n- und mehr!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- Bis zu 5 Minuten lange Sprachnachrichten.\n- Zeitdauer für verschwindende Nachrichten anpassen.\n- Nachrichten-Historie bearbeiten.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ an %2$@:";
/* notification title */
"%@ is connected!" = "%@ ist mit Ihnen verbunden!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 Sekunden";
/* No comment provided by engineer. */
"A few more things" = "Ein paar weitere Dinge";
/* notification title */
"A new contact" = "Ein neuer Kontakt";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "**Für jeden Kontakt und jedes Gruppenmitglied** wird eine separate TCP-Verbindung genutzt.\n**Bitte beachten Sie**: Wenn Sie viele Verbindungen haben, kann der Batterieverbrauch und die Datennutzung wesentlich höher sein und einige Verbindungen können scheitern.";
/* No comment provided by engineer. */
"Abort" = "Abbrechen";
/* No comment provided by engineer. */
"Abort changing address" = "Wechsel der Adresse abbrechen";
/* No comment provided by engineer. */
"Abort changing address?" = "Wechsel der Adresse abbrechen?";
/* No comment provided by engineer. */
"About SimpleX" = "Über SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Adresse";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Der Wechsel der Adresse wird abgebrochen. Die bisherige Adresse wird weiter verwendet.";
/* member role */
"admin" = "Admin";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Erweiterte Netzwerkeinstellungen";
/* chat item text */
"agreeing encryption for %@…" = "Verschlüsselung von %@ zustimmen…";
/* chat item text */
"agreeing encryption…" = "Verschlüsselung zustimmen…";
/* No comment provided by engineer. */
"All app data is deleted." = "Werden die App-Daten komplett gelöscht.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Unwiederbringliches löschen von gesendeten Nachrichten erlauben.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Das Senden von Dateien und Medien erlauben.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Das Senden von Sprachnachrichten erlauben.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "änderte Ihre Rolle auf %@";
/* chat item text */
"changing address for %@" = "Adresse von %@ wechseln…";
"changing address for %@..." = "Wechseln der Adresse für %@ ...";
/* chat item text */
"changing address" = "Wechsel der Adresse";
"changing address..." = "Wechseln der Adresse ...";
/* No comment provided by engineer. */
"Chat archive" = "Datenbank Archiv";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Kontakt Präferenzen";
/* No comment provided by engineer. */
"Contacts" = "Kontakte";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Ihre Kontakte können Nachrichten zum Löschen markieren. Sie können diese Nachrichten trotzdem anschauen.";
@@ -874,7 +841,7 @@
"Database encrypted!" = "Datenbank verschlüsselt!";
/* No comment provided by engineer. */
"Database encryption passphrase will be updated and stored in the keychain.\n" = "Das Passwort für die Datenbankverschlüsselung wird aktualisiert und im Schlüsselbund gespeichert.\n";
"Database encryption passphrase will be updated and stored in the keychain.\n" = "Das Passwort für die Datenbankverschlüsselung wird aktualisiert und im Keychain gespeichert.\n";
/* No comment provided by engineer. */
"Database encryption passphrase will be updated.\n" = "Das Passwort für die Datenbankverschlüsselung wird aktualisiert.\n";
@@ -904,7 +871,7 @@
"Database passphrase & export" = "Datenbank-Passwort & -Export";
/* No comment provided by engineer. */
"Database passphrase is different from saved in the keychain." = "Das Datenbank-Passwort unterscheidet sich von dem im Schlüsselbund gespeicherten.";
"Database passphrase is different from saved in the keychain." = "Das Datenbank-Passwort unterscheidet sich von dem im Keychain gespeicherten.";
/* No comment provided by engineer. */
"Database passphrase is required to open chat." = "Das Datenbank-Passwort ist erforderlich, um den Chat zu öffnen.";
@@ -916,7 +883,7 @@
"database version is newer than the app, but no down migration for: %@" = "Die Datenbank-Version ist neuer als die App, keine Abwärts-Migration für: %@";
/* No comment provided by engineer. */
"Database will be encrypted and the passphrase stored in the keychain.\n" = "Die Datenbank wird verschlüsselt, und das Passwort im Schlüsselbund gespeichert.\n";
"Database will be encrypted and the passphrase stored in the keychain.\n" = "Die Datenbank wird verschlüsselt, und das Passwort im Keychain gespeichert.\n";
/* No comment provided by engineer. */
"Database will be encrypted.\n" = "Die Datenbank wird verschlüsselt.\n";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Dezentral";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Entschlüsselungsfehler";
/* pref value */
"default (%@)" = "Voreinstellung (%@)";
/* No comment provided by engineer. */
"default (no)" = "Voreinstellung (Nein)";
/* No comment provided by engineer. */
"default (yes)" = "Voreinstellung (Ja)";
/* chat item action */
"Delete" = "Löschen";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "Gruppe gelöscht";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Zustellungs-Quittierungen sind deaktiviert!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Zustellungs-Quittierungen!";
/* No comment provided by engineer. */
"Description" = "Beschreibung";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "In dieser Gruppe sind Direktnachrichten zwischen Mitgliedern nicht erlaubt.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Deaktivieren (vorgenommene Einstellungen bleiben erhalten)";
/* No comment provided by engineer. */
"Disable for all" = "Für Alle deaktivieren";
/* authentication reason */
"Disable SimpleX Lock" = "SimpleX Sperre deaktivieren";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Keine Adresse erstellt";
/* No comment provided by engineer. */
"Don't enable" = "Nicht aktivieren";
/* No comment provided by engineer. */
"Don't show again" = "Nicht nochmals anzeigen";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Aktivieren";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Aktivieren (vorgenommene Einstellungen bleiben erhalten)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Automatisches Löschen von Nachrichten aktivieren?";
/* No comment provided by engineer. */
"Enable for all" = "Für Alle aktivieren";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Sofortige Benachrichtigungen aktivieren?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Verschlüsselte Nachricht: Unerwarteter Fehler";
/* chat item text */
"encryption agreed" = "Verschlüsselung wurde zugestimmt";
/* chat item text */
"encryption agreed for %@" = "Verschlüsselung von %@ wurde zugestimmt";
/* chat item text */
"encryption ok" = "Verschlüsselung ist in Ordnung";
/* chat item text */
"encryption ok for %@" = "Verschlüsselung für %@ ist in Ordnung";
/* chat item text */
"encryption re-negotiation allowed" = "Neuaushandlung der Verschlüsselung erlaubt";
/* chat item text */
"encryption re-negotiation allowed for %@" = "Neuaushandlung der Verschlüsselung von %@ erlaubt";
/* chat item text */
"encryption re-negotiation required" = "Neuaushandlung der Verschlüsselung notwendig";
/* chat item text */
"encryption re-negotiation required for %@" = "Neuaushandlung der Verschlüsselung von %@ notwendig";
/* No comment provided by engineer. */
"ended" = "beendet";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Fehler";
/* No comment provided by engineer. */
"Error aborting address change" = "Fehler beim Abbrechen des Adresswechsels";
/* No comment provided by engineer. */
"Error accepting contact request" = "Fehler beim Annehmen der Kontaktanfrage";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Fehler beim Löschen des Benutzerprofils";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Fehler beim Aktivieren der Empfangsbestätigungen!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Fehler beim Aktivieren der Benachrichtigungen";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Fehler beim Senden der Nachricht";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Fehler beim Setzen der Empfangsbestätigungen!";
/* No comment provided by engineer. */
"Error starting chat" = "Fehler beim Starten des Chats";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Fehler beim Umschalten des Profils!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Fehler beim Synchronisieren der Verbindung";
/* No comment provided by engineer. */
"Error updating group link" = "Fehler beim Aktualisieren des Gruppen-Links";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Fehler: URL ist ungültig";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Auch wenn sie im Chat deaktiviert sind.";
/* No comment provided by engineer. */
"Exit without saving" = "Beenden ohne Speichern";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Exportiertes Datenbankarchiv.";
/* No comment provided by engineer. */
"Exporting database archive" = "Exportieren des Datenbank-Archivs";
"Exporting database archive..." = "Export des Datenbankarchivs...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Das Entfernen des Passworts ist fehlgeschlagen";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Schnell und ohne warten auf den Absender, bis er online ist!";
/* No comment provided by engineer. */
"Favorite" = "Favorit";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Die Datei wird von den Servern gelöscht.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Dateien & Medien";
/* chat feature */
"Files and media" = "Dateien und Medien";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "In dieser Gruppe sind Dateien und Medien nicht erlaubt.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Dateien und Medien sind nicht erlaubt!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Nach ungelesenen und favorisierten Chats filtern.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Endlich haben wir sie! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Chats schneller finden";
/* No comment provided by engineer. */
"Fix" = "Reparieren";
/* No comment provided by engineer. */
"Fix connection" = "Verbindung reparieren";
/* No comment provided by engineer. */
"Fix connection?" = "Verbindung reparieren?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Reparatur der Verschlüsselung nach wiedereinspielen von Backups.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Reparatur wird vom Kontakt nicht unterstützt";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Reparatur wird vom Gruppenmitglied nicht unterstützt";
/* No comment provided by engineer. */
"For console" = "Für Konsole";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Gruppenmitglieder können verschwindende Nachrichten senden.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Gruppenmitglieder können Dateien und Medien senden.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Gruppenmitglieder können Sprachnachrichten versenden.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Verbesserte Serverkonfiguration";
/* copied message info */
"In reply to" = "Als Antwort auf";
/* No comment provided by engineer. */
"Incognito" = "Inkognito";
@@ -1876,13 +1735,10 @@
"Joining group" = "Der Gruppe beitreten";
/* No comment provided by engineer. */
"Keep your connections" = "Ihre Verbindungen beibehalten";
"Keychain error" = "Schlüsselbundfehler";
/* No comment provided by engineer. */
"Keychain error" = "KeyChain Fehler";
/* No comment provided by engineer. */
"KeyChain error" = "KeyChain Fehler";
"KeyChain error" = "Keystore Fehler";
/* No comment provided by engineer. */
"Large file!" = "Große Datei!";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Stellen Sie eine private Verbindung her";
/* No comment provided by engineer. */
"Make one message disappear" = "Eine verschwindende Nachricht verfassen";
/* No comment provided by engineer. */
"Make profile private!" = "Privates Profil erzeugen!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Fehler bei der Nachrichtenzustellung";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Empfangsbestätigungen für Nachrichten!";
/* No comment provided by engineer. */
"Message draft" = "Nachrichtenentwurf";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Nachrichten";
/* No comment provided by engineer. */
"Migrating database archive" = "Datenbank-Archiv wird migriert";
"Migrating database archive..." = "Das Datenbankarchiv wird migriert...";
/* No comment provided by engineer. */
"Migration error:" = "Fehler bei der Migration:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "Keine E2E-Verschlüsselung";
/* No comment provided by engineer. */
"No filtered chats" = "Keine gefilterten Chats";
/* No comment provided by engineer. */
"No group!" = "Die Gruppe wurde nicht gefunden!";
/* No comment provided by engineer. */
"No history" = "Keine Vergangenheit";
/* No comment provided by engineer. */
"No permission to record voice message" = "Keine Berechtigung für das Aufnehmen von Sprachnachrichten";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Gruppenpräferenzen können nur von Gruppen-Eigentümern geändert werden.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Nur Gruppenbesitzer können Dateien und Medien aktivieren.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Sprachnachrichten können nur von Gruppen-Eigentümern aktiviert werden.";
@@ -2416,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Das Senden von verschwindenden Nachrichten verbieten.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Das Senden von Dateien und Medien nicht erlauben.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Das Senden von Sprachnachrichten nicht erlauben.";
@@ -2431,9 +2269,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Protokollzeitüberschreitung";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Protokollzeitüberschreitung pro kB";
/* No comment provided by engineer. */
"Push notifications" = "Push-Benachrichtigungen";
@@ -2441,7 +2276,7 @@
"Rate the app" = "Bewerten Sie die App";
/* chat item menu */
"React" = "Reagiere…";
"React..." = "Reaktion...";
/* No comment provided by engineer. */
"Read" = "Gelesen";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Empfangene Nachricht";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Die Empfängeradresse wird auf einen anderen Server geändert. Der Adresswechsel wird abgeschlossen, wenn der Absender wieder online ist.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Der Empfang der Datei wird beendet.";
@@ -2491,12 +2323,6 @@
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Die Empfänger sehen Nachrichtenaktualisierungen, während Sie sie eingeben.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Alle verbundenen Server werden neu verbunden, um die Zustellung der Nachricht zu erzwingen. Dies verursacht zusätzlichen Datenverkehr.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Die Server neu verbinden?";
/* No comment provided by engineer. */
"Record updated at" = "Datensatz aktualisiert um";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "hat Sie aus der Gruppe entfernt";
/* No comment provided by engineer. */
"Renegotiate" = "Neu aushandeln";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Verschlüsselung neu aushandeln";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Verschlüsselung neu aushandeln?";
/* chat item action */
"Reply" = "Antwort";
@@ -2567,7 +2384,7 @@
"Reset colors" = "Farben zurücksetzen";
/* No comment provided by engineer. */
"Reset to defaults" = "Auf Voreinstellungen zurücksetzen";
"Reset to defaults" = "Auf Standardwerte zurücksetzen";
/* No comment provided by engineer. */
"Restart the app to create a new chat profile" = "Um ein neues Chat-Profil zu erstellen, starten Sie die App neu";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Sicherheitscode";
/* chat item text */
"security code changed" = "Sicherheitscode wurde geändert";
/* No comment provided by engineer. */
"Select" = "Auswählen";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Eine Live Nachricht senden - der/die Empfänger sieht/sehen Nachrichtenaktualisierungen, während Sie sie eingeben";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Zustellungs-Quittierungen versenden an";
/* No comment provided by engineer. */
"Send direct message" = "Direktnachricht senden";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Senden Sie Fragen und Ideen";
/* No comment provided by engineer. */
"Send receipts" = "Quittierungen versenden";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Senden Sie diese aus dem Fotoalbum oder von individuellen Tastaturen.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Der Absender hat möglicherweise die Verbindungsanfrage gelöscht.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Das Senden von Empfangsbestätigungen an alle Kontakte in allen sichtbaren Chat-Profilen wird aktiviert.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Das Senden von Empfangsbestätigungen an alle Kontakte wird aktiviert.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Das Senden der Datei wird beendet.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "Das Senden von Empfangsbestätigungen an %lld Kontakte ist deaktiviert";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "Das Senden von Empfangsbestätigungen an %lld Kontakte ist aktiviert";
/* No comment provided by engineer. */
"Sending via" = "Senden über";
@@ -3034,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "Das erzeugte Archiv ist über Einstellungen / Datenbank / Altes Datenbankarchiv verfügbar.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "Die Verschlüsselung funktioniert und ein neues Verschlüsselungsabkommen ist nicht erforderlich. Es kann zu Verbindungsfehlern kommen!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Die Gruppe ist vollständig dezentralisiert sie ist nur für Mitglieder sichtbar.";
@@ -3061,9 +2854,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Das Profil wird nur mit Ihren Kontakten geteilt.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Das zweite Häkchen, welches wir vermisst haben! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "Der Absender wird NICHT benachrichtigt";
@@ -3079,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Es muss mindestens ein sichtbares Benutzer-Profil vorhanden sein.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Diese Einstellungen betreffen Ihr aktuelles Profil **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Diese können in den Kontakteinstellungen überschrieben werden";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Diese Aktion kann nicht rückgängig gemacht werden! Alle empfangenen und gesendeten Dateien und Medien werden gelöscht. Bilder mit niedriger Auflösung bleiben erhalten.";
@@ -3097,6 +2881,9 @@
/* notification title */
"this contact" = "Dieser Kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Es handelt sich um einen permanenten Fehler für diese Verbindung - bitte verbinden Sie sich neu.";
/* No comment provided by engineer. */
"This group no longer exists." = "Diese Gruppe existiert nicht mehr.";
@@ -3163,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Unerwarteter Migrationsstatus";
/* No comment provided by engineer. */
"Unfav." = "Fav. entf.";
/* No comment provided by engineer. */
"Unhide" = "Verbergen aufheben";
@@ -3418,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Sie können dies später erstellen";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Sie können diese später in den Einstellungen aktivieren";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Sie können diese später in den Datenschutz & Sicherheits-Einstellungen der App aktivieren.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Sie können ein Benutzerprofil verbergen oder stummschalten - wischen Sie es nach rechts.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_italic_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- entrega de mensajes más estable.\n- grupos un poco mejores.\n- ¡y más!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- mensajes de voz de hasta 5 minutos.\n- tiempo personalizado para mensajes temporales.\n- historial de edición.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ a las %2$@:";
/* notification title */
"%@ is connected!" = "%@ ¡está conectado!";
@@ -122,7 +116,7 @@
"%@ servers" = "Servidores %@";
/* notification title */
"%@ wants to connect!" = "¡ %@ quiere contactar!";
"%@ wants to connect!" = "%@ ¡quiere conectar!";
/* copied message info */
"%@:" = "%@:";
@@ -203,7 +197,7 @@
"`a + b`" = "\\`a + b`";
/* email text */
"<p>Hi!</p>\n<p><a href=\"%@\">Connect to me via SimpleX Chat</a></p>" = "<p>¡Hola!</p>\n<p><a href=\"%@\"> Conecta conmigo a través de SimpleX Chat</a></p>";
"<p>Hi!</p>\n<p><a href=\"%@\">Connect to me via SimpleX Chat</a></p>" = "<p>Hola!</p>\n<p><a href=\"%@\"> Conecta conmigo a través de SimpleX Chat</a></p>";
/* No comment provided by engineer. */
"~strike~" = "\\~strike~";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 segundos";
/* No comment provided by engineer. */
"A few more things" = "Algunas cosas más";
/* notification title */
"A new contact" = "Contacto nuevo";
@@ -251,19 +242,10 @@
"A random profile will be sent to your contact" = "Se enviará un perfil aleatorio a tu contacto";
/* No comment provided by engineer. */
"A separate TCP connection will be used **for each chat profile you have in the app**." = "Se usará una conexión TCP independiente **por cada perfil que tengas en la aplicación**.";
"A separate TCP connection will be used **for each chat profile you have in the app**." = "Se utilizará una conexión TCP independiente **por cada perfil que tengas en la aplicación**.";
/* No comment provided by engineer. */
"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." = "Se usará una conexión TCP independiente **por cada contacto y miembro de grupo**.\n**Atención**: si tienes muchas conexiones, tu consumo de batería y tráfico pueden ser sustancialmente mayores y algunas conexiones pueden fallar.";
/* No comment provided by engineer. */
"Abort" = "Cancelar";
/* No comment provided by engineer. */
"Abort changing address" = "Cancelar cambio de dirección";
/* No comment provided by engineer. */
"Abort changing address?" = "¿Cancelar el cambio de dirección?";
"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." = "Se utilizará una conexión TCP independiente **por cada contacto y miembro de grupo**.\n**Atención**: si tienes muchas conexiones, tu consumo de batería y tráfico pueden ser sustancialmente mayores y algunas conexiones pueden fallar.";
/* No comment provided by engineer. */
"About SimpleX" = "Acerca de SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Dirección";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "El cambio de dirección se cancelará. Se usará la antigua dirección de recepción.";
/* member role */
"admin" = "administrador";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Configuración avanzada de red";
/* chat item text */
"agreeing encryption for %@…" = "acordando cifrado para %@…";
/* chat item text */
"agreeing encryption…" = "acordando cifrado…";
/* No comment provided by engineer. */
"All app data is deleted." = "Todos los datos de la aplicación se eliminarán.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Se permite la eliminación irreversible de mensajes.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Se permite enviar archivos y multimedia.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Permites enviar mensajes de voz.";
@@ -531,7 +501,7 @@
"Call already ended!" = "¡La llamada ha terminado!";
/* call status */
"call error" = "error en llamada";
"call error" = "error en la llamada";
/* call status */
"call in progress" = "llamada en curso";
@@ -604,10 +574,10 @@
"changed your role to %@" = "ha cambiado tu rol a %@";
/* chat item text */
"changing address for %@" = "cambiando dirección para %@";
"changing address for %@..." = "cambiando de servidor para %@...";
/* chat item text */
"changing address" = "cambiando dirección…";
"changing address..." = "cambiando de servidor...";
/* No comment provided by engineer. */
"Chat archive" = "Archivo del chat";
@@ -748,10 +718,10 @@
"Connection" = "Conexión";
/* No comment provided by engineer. */
"Connection error" = "Error conexión";
"Connection error" = "Error de conexión";
/* No comment provided by engineer. */
"Connection error (AUTH)" = "Error conexión (Autenticación)";
"Connection error (AUTH)" = "Error de conexión (Autenticación)";
/* chat list item title (it should not be shown */
"connection established" = "conexión establecida";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Preferencias de contacto";
/* No comment provided by engineer. */
"Contacts" = "Contactos";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Tus contactos sólo pueden marcar los mensajes para eliminar. Tu podrás verlos.";
@@ -880,7 +847,7 @@
"Database encryption passphrase will be updated.\n" = "La contraseña de cifrado de la base de datos será actualizada.\n";
/* No comment provided by engineer. */
"Database error" = "Error base de datos";
"Database error" = "Error de la base de datos";
/* No comment provided by engineer. */
"Database ID" = "ID base de datos";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Descentralizado";
/* message decrypt error item */
"Decryption error" = "Error descifrado";
/* No comment provided by engineer. */
"Decryption error" = "Error de descifrado";
/* pref value */
"default (%@)" = "por defecto (%@)";
/* No comment provided by engineer. */
"default (no)" = "por defecto (no)";
/* No comment provided by engineer. */
"default (yes)" = "por defecto (sí)";
/* chat item action */
"Delete" = "Eliminar";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "grupo eliminado";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "¡Las confirmaciones de entrega están desactivadas!";
/* No comment provided by engineer. */
"Delivery receipts!" = "¡Confirmación de entrega!";
/* No comment provided by engineer. */
"Description" = "Descripción";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Los mensajes directos entre miembros del grupo no están permitidos.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Desactivar (mantener anulaciones)";
/* No comment provided by engineer. */
"Disable for all" = "Desactivar para todos";
/* authentication reason */
"Disable SimpleX Lock" = "Desactivar Bloqueo SimpleX";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "No crear dirección";
/* No comment provided by engineer. */
"Don't enable" = "No activar";
/* No comment provided by engineer. */
"Don't show again" = "No mostrar de nuevo";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Activar";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Activar (conservar anulaciones)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "¿Activar eliminación automática de mensajes?";
/* No comment provided by engineer. */
"Enable for all" = "Activar para todos";
/* No comment provided by engineer. */
"Enable instant notifications?" = "¿Activar notificación instantánea?";
@@ -1231,13 +1171,13 @@
"Encrypted message or another event" = "Mensaje cifrado u otro evento";
/* notification */
"Encrypted message: database error" = "Mensaje cifrado: error base de datos";
"Encrypted message: database error" = "Mensaje cifrado: error en base de datos";
/* notification */
"Encrypted message: database migration error" = "Mensaje cifrado: error migración base de datos";
"Encrypted message: database migration error" = "Mensaje cifrado: error de migración de base de datos";
/* notification */
"Encrypted message: keychain error" = "Mensaje cifrado: error Keychain";
"Encrypted message: keychain error" = "Mensaje cifrado: error en Keychain";
/* notification */
"Encrypted message: no passphrase" = "Mensaje cifrado: sin contraseña";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Mensaje cifrado: error inesperado";
/* chat item text */
"encryption agreed" = "cifrado acordado";
/* chat item text */
"encryption agreed for %@" = "cifrado acordado para %@";
/* chat item text */
"encryption ok" = "cifrado ok";
/* chat item text */
"encryption ok for %@" = "cifrado ok para %@";
/* chat item text */
"encryption re-negotiation allowed" = "renegociación de cifrado permitida";
/* chat item text */
"encryption re-negotiation allowed for %@" = "renegociación de cifrado permitida para %@";
/* chat item text */
"encryption re-negotiation required" = "se requiere renegociar el cifrado";
/* chat item text */
"encryption re-negotiation required for %@" = "se requiere renegociar el cifrado para %@";
/* No comment provided by engineer. */
"ended" = "finalizado";
@@ -1303,139 +1219,127 @@
"Error" = "Error";
/* No comment provided by engineer. */
"Error aborting address change" = "Error al cancelar cambio de dirección";
"Error accepting contact request" = "Error aceptando la solicitud del contacto";
/* No comment provided by engineer. */
"Error accepting contact request" = "Error al aceptar solicitud del contacto";
/* No comment provided by engineer. */
"Error accessing database file" = "Error al acceder al archivo de la base de datos";
"Error accessing database file" = "Error de acceso al archivo de base de datos";
/* No comment provided by engineer. */
"Error adding member(s)" = "Error al añadir miembro(s)";
/* No comment provided by engineer. */
"Error changing address" = "Error al cambiar dirección";
"Error changing address" = "Error cambiando la dirección";
/* No comment provided by engineer. */
"Error changing role" = "Error al cambiar rol";
"Error changing role" = "Error cambiando rol";
/* No comment provided by engineer. */
"Error changing setting" = "Error cambiando configuración";
/* No comment provided by engineer. */
"Error creating address" = "Error al crear dirección";
"Error creating address" = "Error creando dirección";
/* No comment provided by engineer. */
"Error creating group" = "Error al crear grupo";
"Error creating group" = "Error creando grupo";
/* No comment provided by engineer. */
"Error creating group link" = "Error al crear enlace de grupo";
/* No comment provided by engineer. */
"Error creating profile!" = "¡Error al crear perfil!";
"Error creating profile!" = "Error creando perfil!";
/* No comment provided by engineer. */
"Error deleting chat database" = "Error al eliminar base de datos";
"Error deleting chat database" = "Error eliminando la base de datos";
/* No comment provided by engineer. */
"Error deleting chat!" = "¡Error al eliminar chat!";
"Error deleting chat!" = "¡Error eliminando chat!";
/* No comment provided by engineer. */
"Error deleting connection" = "Error al eliminar conexión";
"Error deleting connection" = "Error eliminando conexión";
/* No comment provided by engineer. */
"Error deleting contact" = "Error al eliminar contacto";
"Error deleting contact" = "Error eliminando contacto";
/* No comment provided by engineer. */
"Error deleting database" = "Error al eliminar base de datos";
"Error deleting database" = "Error eliminando base de datos";
/* No comment provided by engineer. */
"Error deleting old database" = "Error al eliminar base de datos antigua";
"Error deleting old database" = "Error eliminando base de datos antigua";
/* No comment provided by engineer. */
"Error deleting token" = "Error al eliminar token";
"Error deleting token" = "Error eliminando token";
/* No comment provided by engineer. */
"Error deleting user profile" = "Error al eliminar perfil";
"Error deleting user profile" = "Error eliminando perfil de usuario";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "¡Error al activar confirmaciones de entrega!";
"Error enabling notifications" = "Error activando notificaciones";
/* No comment provided by engineer. */
"Error enabling notifications" = "Error al activar notificaciones";
"Error encrypting database" = "Error cifrando la base de datos";
/* No comment provided by engineer. */
"Error encrypting database" = "Error al cifrar base de datos";
"Error exporting chat database" = "Error exportando la base de datos";
/* No comment provided by engineer. */
"Error exporting chat database" = "Error al exportar base de datos";
"Error importing chat database" = "Error importando la base de datos";
/* No comment provided by engineer. */
"Error importing chat database" = "Error al importar base de datos";
/* No comment provided by engineer. */
"Error joining group" = "Error al unirse al grupo";
"Error joining group" = "Error uniéndose al grupo";
/* No comment provided by engineer. */
"Error loading %@ servers" = "Error al cargar servidores %@";
/* No comment provided by engineer. */
"Error receiving file" = "Error al recibir archivo";
"Error receiving file" = "Error recibiendo archivo";
/* No comment provided by engineer. */
"Error removing member" = "Error al eliminar miembro";
"Error removing member" = "Error eliminando miembro";
/* No comment provided by engineer. */
"Error saving %@ servers" = "Error al guardar servidores %@";
"Error saving %@ servers" = "Error guardando servidores %@";
/* No comment provided by engineer. */
"Error saving group profile" = "Error al guardar perfil de grupo";
"Error saving group profile" = "Error guardando perfil de grupo";
/* No comment provided by engineer. */
"Error saving ICE servers" = "Error al guardar servidores ICE";
"Error saving ICE servers" = "Error guardando servidores ICE";
/* No comment provided by engineer. */
"Error saving passcode" = "Error al guardar código de acceso";
"Error saving passcode" = "Error al guardar el código de acceso";
/* No comment provided by engineer. */
"Error saving passphrase to keychain" = "Error al guardar contraseña en Keychain";
"Error saving passphrase to keychain" = "Error guardando contraseña en Keychain";
/* No comment provided by engineer. */
"Error saving user password" = "Error al guardar contraseña de usuario";
"Error saving user password" = "Error guardando la contraseña de usuario";
/* No comment provided by engineer. */
"Error sending email" = "Error al enviar email";
/* No comment provided by engineer. */
"Error sending message" = "Error al enviar mensaje";
"Error sending message" = "Error enviando mensaje";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "¡Error al configurar confirmaciones de entrega!";
"Error starting chat" = "Error iniciando chat";
/* No comment provided by engineer. */
"Error starting chat" = "Error al iniciar Chat";
"Error stopping chat" = "Error deteniendo Chat";
/* No comment provided by engineer. */
"Error stopping chat" = "Error al detener Chat";
"Error switching profile!" = "¡Error cambiando perfil!";
/* No comment provided by engineer. */
"Error switching profile!" = "¡Error al cambiar perfil!";
"Error updating group link" = "Error actualizando el enlace de grupo";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Error al sincronizar conexión";
"Error updating message" = "Error actualizando mensaje";
/* No comment provided by engineer. */
"Error updating group link" = "Error al actualizar enlace de grupo";
"Error updating settings" = "Error actualizando configuración";
/* No comment provided by engineer. */
"Error updating message" = "Error al actualizar mensaje";
/* No comment provided by engineer. */
"Error updating settings" = "Error al actualizar configuración";
/* No comment provided by engineer. */
"Error updating user privacy" = "Error al actualizar privacidad de usuario";
"Error updating user privacy" = "Error actualizando la privacidad de usuario";
/* No comment provided by engineer. */
"Error: " = "Error: ";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Error: la URL no es válida";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Incluso si está desactivado para la conversación.";
/* No comment provided by engineer. */
"Exit without saving" = "Salir sin guardar";
@@ -1459,23 +1360,20 @@
"Export database" = "Exportar base de datos";
/* No comment provided by engineer. */
"Export error:" = "Error al exportar:";
"Export error:" = "Error exportando:";
/* No comment provided by engineer. */
"Exported database archive." = "Archivo de base de datos exportado.";
/* No comment provided by engineer. */
"Exporting database archive" = "Exportando base de datos";
"Exporting database archive..." = "Exportando archivo de base de datos...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Error al eliminar la contraseña";
"Failed to remove passphrase" = "Error eliminando la contraseña";
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "¡Rápido y sin necesidad de esperar a que el remitente esté en línea!";
/* No comment provided by engineer. */
"Favorite" = "Favoritos";
/* No comment provided by engineer. */
"File will be deleted from servers." = "El archivo será eliminado de los servidores.";
@@ -1483,7 +1381,7 @@
"File will be received when your contact completes uploading it." = "El archivo se recibirá cuando tu contacto termine de subirlo.";
/* No comment provided by engineer. */
"File will be received when your contact is online, please wait or check later!" = "El archivo se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
"File will be received when your contact is online, please wait or check later!" = "El archivo se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"File: %@" = "Archivo: %@";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Archivos y multimedia";
/* chat feature */
"Files and media" = "Archivos y multimedia";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "No se permiten archivos y multimedia en este grupo.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "¡Archivos y multimedia no permitidos!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtrar chats no leídos y favoritos.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "¡Por fin los tenemos! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Encontrar chats mas rápido";
/* No comment provided by engineer. */
"Fix" = "Reparar";
/* No comment provided by engineer. */
"Fix connection" = "Reparar conexión";
/* No comment provided by engineer. */
"Fix connection?" = "¿Reparar conexión?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Reparar el cifrado tras restaurar copias de seguridad.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Corrección no compatible con el contacto";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Corrección no compatible con miembro del grupo";
/* No comment provided by engineer. */
"For console" = "Para consola";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Los miembros del grupo pueden enviar mensajes temporales.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Los miembros del grupo pueden enviar archivos y multimedia.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Los miembros del grupo pueden enviar mensajes de voz.";
@@ -1696,7 +1558,7 @@
"Image will be received when your contact completes uploading it." = "La imagen se recibirá cuando tu contacto termine de subirla.";
/* No comment provided by engineer. */
"Image will be received when your contact is online, please wait or check later!" = "La imagen se recibirá cuando tu contacto esté en línea, ¡por favor espera o compruébalo más tarde!";
"Image will be received when your contact is online, please wait or check later!" = "La imagen se recibirá cuando tu contacto esté en línea, por favor espera o compruébalo más tarde.";
/* No comment provided by engineer. */
"Immediately" = "Inmediatamente";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configuración del servidor mejorada";
/* copied message info */
"In reply to" = "En respuesta a";
/* No comment provided by engineer. */
"Incognito" = "Incógnito";
@@ -1849,7 +1708,7 @@
"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." = "Esto puede suceder cuando:\n1. Los mensajes caducan en el cliente saliente tras 2 días o en el servidor tras 30 días.\n2. El descifrado ha fallado porque tu o tu contacto estáis usando una copia de seguridad antigua de la base de datos.\n3. La conexión ha sido comprometida.";
/* No comment provided by engineer. */
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Parece que ya estás conectado mediante este enlace. Si no es así ha habido un error (%@).";
"It seems like you are already connected via this link. If it is not the case, there was an error (%@)." = "Parece que ya está conectado mediante este enlace. Si no es así ha habido un error (%@).";
/* No comment provided by engineer. */
"Italian interface" = "Interfaz en italiano";
@@ -1876,13 +1735,10 @@
"Joining group" = "Entrando al grupo";
/* No comment provided by engineer. */
"Keep your connections" = "Mantén tus conexiones";
"Keychain error" = "Error en Keychain";
/* No comment provided by engineer. */
"Keychain error" = "Error Keychain";
/* No comment provided by engineer. */
"KeyChain error" = "Error Keychain";
"KeyChain error" = "Error en Keychain";
/* No comment provided by engineer. */
"Large file!" = "¡Archivo grande!";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Establecer una conexión privada";
/* No comment provided by engineer. */
"Make one message disappear" = "Escribir un mensaje temporal";
/* No comment provided by engineer. */
"Make profile private!" = "¡Hacer un perfil privado!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Error en la entrega del mensaje";
/* No comment provided by engineer. */
"Message delivery receipts!" = "¡Confirmación de entrega de mensajes!";
/* No comment provided by engineer. */
"Message draft" = "Borrador de mensaje";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Mensajes";
/* No comment provided by engineer. */
"Migrating database archive" = "Migrando base de datos";
"Migrating database archive..." = "Migrando la base de datos...";
/* No comment provided by engineer. */
"Migration error:" = "Error de migración:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "sin cifrar";
/* No comment provided by engineer. */
"No filtered chats" = "Sin chats filtrados";
/* No comment provided by engineer. */
"No group!" = "¡Grupo no encontrado!";
/* No comment provided by engineer. */
"No history" = "Sin historial";
/* No comment provided by engineer. */
"No permission to record voice message" = "Sin permiso para grabar mensajes de voz";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Sólo los propietarios pueden modificar las preferencias de grupo.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Sólo los propietarios pueden activar archivos y multimedia.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Sólo los propietarios pueden activar los mensajes de voz.";
@@ -2315,7 +2156,7 @@
"Periodically" = "Periódico";
/* message decrypt error item */
"Permanent decryption error" = "Error permanente descifrado";
"Permanent decryption error" = "Error de descifrado permanente";
/* No comment provided by engineer. */
"PING count" = "Contador PING";
@@ -2399,49 +2240,43 @@
"Profile update will be sent to your contacts." = "La actualización del perfil se enviará a tus contactos.";
/* No comment provided by engineer. */
"Prohibit audio/video calls." = "Prohibir las llamadas y videollamadas.";
"Prohibit audio/video calls." = "No se permiten llamadas y videollamadas.";
/* No comment provided by engineer. */
"Prohibit irreversible message deletion." = "Prohibir la eliminación irreversible de mensajes.";
"Prohibit irreversible message deletion." = "No se permite la eliminación irreversible de mensajes.";
/* No comment provided by engineer. */
"Prohibit message reactions." = "Prohibir reacciones a mensajes.";
"Prohibit message reactions." = "No se permiten reacciones a los mensajes.";
/* No comment provided by engineer. */
"Prohibit messages reactions." = "Prohibir reacciones a mensajes.";
"Prohibit messages reactions." = "No se permiten reacciones a los mensajes.";
/* No comment provided by engineer. */
"Prohibit sending direct messages to members." = "Prohibir mensajes directos a miembros.";
"Prohibit sending direct messages to members." = "No se permiten mensajes directos entre miembros.";
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Prohibir envío de mensajes temporales.";
"Prohibit sending disappearing messages." = "No se permiten mensajes temporales.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "No permitir el envío de archivos y multimedia.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Prohibir el envío de mensajes de voz.";
"Prohibit sending voice messages." = "No se permiten mensajes de voz.";
/* No comment provided by engineer. */
"Protect app screen" = "Proteger la pantalla de la aplicación";
/* No comment provided by engineer. */
"Protect your chat profiles with a password!" = "¡Protege tus perfiles de chat con contraseña!";
"Protect your chat profiles with a password!" = "¡Protege tus perfiles con contraseña!";
/* No comment provided by engineer. */
"Protocol timeout" = "Tiempo de espera del protocolo";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Límite de espera del protocolo por KB";
/* No comment provided by engineer. */
"Push notifications" = "Notificaciones push";
"Push notifications" = "Notificaciones automáticas";
/* No comment provided by engineer. */
"Rate the app" = "Valora la aplicación";
/* chat item menu */
"React" = "Reacciona";
"React..." = "Reaccionar...";
/* No comment provided by engineer. */
"Read" = "Leer";
@@ -2465,7 +2300,7 @@
"received answer…" = "respuesta recibida…";
/* No comment provided by engineer. */
"Received at" = "Recibido a las";
"Received at" = "Recibido";
/* copied message info */
"Received at: %@" = "Recibido: %@";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Mensaje entrante";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "La dirección de recepción se cambiará. El cambio se completará cuando el remitente esté en línea.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Se detendrá la recepción del archivo.";
@@ -2489,22 +2321,16 @@
"Receiving via" = "Recibiendo vía";
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Los destinatarios ven actualizaciones mientras les escribes.";
"Recipients see updates as you type them." = "Los destinatarios ven la actualizacion mientras escribes.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Reconectar todos los servidores conectados para forzar la entrega del mensaje. Se usa tráfico adicional.";
/* No comment provided by engineer. */
"Reconnect servers?" = "¿Reconectar servidores?";
/* No comment provided by engineer. */
"Record updated at" = "Registro actualizado a las";
"Record updated at" = "Registro actualiz.";
/* copied message info */
"Record updated at: %@" = "Registro actualizado a las: %@";
"Record updated at: %@" = "Registro actualiz: %@";
/* No comment provided by engineer. */
"Reduced battery usage" = "Uso de la batería reducido";
"Reduced battery usage" = "Reducción del uso de la batería";
/* reject incoming call via notification */
"Reject" = "Rechazar";
@@ -2519,10 +2345,10 @@
"rejected call" = "llamada rechazada";
/* No comment provided by engineer. */
"Relay server is only used if necessary. Another party can observe your IP address." = "El servidor de retransmisión sólo se usa en caso necesario. Un tercero podría ver tu dirección IP.";
"Relay server is only used if necessary. Another party can observe your IP address." = "El relay sólo se usa en caso de necesidad. Un tercero podría ver tu IP.";
/* No comment provided by engineer. */
"Relay server protects your IP address, but it can observe the duration of the call." = "El servidor de retransmisión protege tu dirección IP, pero puede observar la duración de la llamada.";
"Relay server protects your IP address, but it can observe the duration of the call." = "El servidor relay protege tu IP pero puede observar la duración de la llamada.";
/* No comment provided by engineer. */
"Remove" = "Eliminar";
@@ -2534,7 +2360,7 @@
"Remove member?" = "¿Expulsar miembro?";
/* No comment provided by engineer. */
"Remove passphrase from keychain?" = "¿Eliminar la contraseña del llavero?";
"Remove passphrase from keychain?" = "¿Eliminar contraseña de Keychain?";
/* No comment provided by engineer. */
"removed" = "expulsado";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "te ha expulsado";
/* No comment provided by engineer. */
"Renegotiate" = "Renegociar";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Renegociar cifrado";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "¿Renegociar cifrado?";
/* chat item action */
"Reply" = "Responder";
@@ -2573,7 +2390,7 @@
"Restart the app to create a new chat profile" = "Reinicia la aplicación para crear un perfil nuevo";
/* No comment provided by engineer. */
"Restart the app to use imported chat database" = "Reinicia la aplicación para usar la base de datos de chats importada";
"Restart the app to use imported chat database" = "Reinicia la aplicación para utilizar la base de datos importada";
/* No comment provided by engineer. */
"Restore" = "Restaurar";
@@ -2585,7 +2402,7 @@
"Restore database backup?" = "¿Restaurar copia de seguridad de la base de datos?";
/* No comment provided by engineer. */
"Restore database error" = "Error al restaurar base de datos";
"Restore database error" = "Error al restaurar la base de datos";
/* chat item action */
"Reveal" = "Revelar";
@@ -2606,7 +2423,7 @@
"Role" = "Rol";
/* No comment provided by engineer. */
"Run chat" = "Ejecutar chat";
"Run chat" = "Ejecutar Chat";
/* chat item action */
"Save" = "Guardar";
@@ -2627,7 +2444,7 @@
"Save archive" = "Guardar archivo";
/* No comment provided by engineer. */
"Save auto-accept settings" = "Guardar configuración de aceptación automática (auto-accept)";
"Save auto-accept settings" = "Guardar configuración de auto aceptar";
/* No comment provided by engineer. */
"Save group profile" = "Guardar perfil de grupo";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Código de seguridad";
/* chat item text */
"security code changed" = "código de seguridad cambiado";
/* No comment provided by engineer. */
"Select" = "Seleccionar";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Envía un mensaje en vivo: se actualizará para el(los) destinatario(s) a medida que se escribe";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Enviar confirmaciones de entrega a";
/* No comment provided by engineer. */
"Send direct message" = "Enviar mensaje directo";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Consultas y sugerencias";
/* No comment provided by engineer. */
"Send receipts" = "Enviar confirmaciones";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Envíalos desde la galería o desde teclados personalizados.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "El remitente puede haber eliminado la solicitud de conexión.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "El envío de confirmaciones de entrega se activará para todos los contactos en todos los perfiles visibles.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "El envío de confirmaciones de entrega se activará para todos los contactos.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Se detendrá el envío del archivo.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "El envío de confirmaciones está desactivado para %lld contactos";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "El envío de confirmaciones está activado para %lld contactos";
/* No comment provided by engineer. */
"Sending via" = "Enviando vía";
@@ -3034,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "El archivo creado está disponible a través de Configuración / Base de datos / Archivo de base de datos antigua.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "El cifrado funciona y un cifrado nuevo no es necesario. ¡Podría dar lugar a errores de conexión!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "El grupo está totalmente descentralizado y sólo es visible para los miembros.";
@@ -3061,9 +2854,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "El perfil sólo se comparte con tus contactos.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "¡El doble check que nos faltaba! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "El remitente NO será notificado";
@@ -3079,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Debe haber al menos un perfil de usuario visible.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Esta configuración afecta a tu perfil actual **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Se pueden anular en la configuración de contactos";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Esta acción no se puede deshacer. Se eliminarán todos los archivos y multimedia recibidos y enviados. Las imágenes de baja resolución permanecerán.";
@@ -3097,6 +2881,9 @@
/* notification title */
"this contact" = "este contacto";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "El error es permanente para esta conexión, por favor vuelve a conectarte.";
/* No comment provided by engineer. */
"This group no longer exists." = "Este grupo ya no existe.";
@@ -3116,7 +2903,7 @@
"To make a new connection" = "Para hacer una conexión nueva";
/* No comment provided by engineer. */
"To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts." = "Para proteger la privacidad, en lugar de los identificadores de usuario que usan el resto de plataformas, SimpleX dispone de identificadores para las colas de mensajes, independientes para cada uno de tus contactos.";
"To protect privacy, instead of user IDs used by all other platforms, SimpleX has identifiers for message queues, separate for each of your contacts." = "Para proteger la privacidad, en lugar de los identificadores de usuario que utilizan el resto de plataformas, SimpleX dispone de identificadores para las colas de mensajes, independientes para cada uno de tus contactos.";
/* No comment provided by engineer. */
"To protect timezone, image/voice files use UTC." = "Para proteger la zona horaria, los archivos de imagen/voz usan la hora UTC.";
@@ -3143,7 +2930,7 @@
"Trying to connect to the server used to receive messages from this contact (error: %@)." = "Intentando conectar con el servidor usado para recibir mensajes de este contacto (error: %@).";
/* No comment provided by engineer. */
"Trying to connect to the server used to receive messages from this contact." = "Intentando conectar con el servidor usado para recibir mensajes de este contacto.";
"Trying to connect to the server used to receive messages from this contact." = "Intentando conectar con el servidor utilizado para recibir mensajes de este contacto.";
/* No comment provided by engineer. */
"Turn off" = "Desactivar";
@@ -3163,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Estado de migración inesperado";
/* No comment provided by engineer. */
"Unfav." = "No fav.";
/* No comment provided by engineer. */
"Unhide" = "Mostrar";
@@ -3185,7 +2969,7 @@
"Unknown caller" = "Llamada desconocida";
/* No comment provided by engineer. */
"Unknown database error: %@" = "Error desconocido base de datos: %@";
"Unknown database error: %@" = "Error desconocido en base de datos: %@";
/* No comment provided by engineer. */
"Unknown error" = "Error desconocido";
@@ -3194,7 +2978,7 @@
"Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." = "A menos que utilices la interfaz de llamadas de iOS, activa el modo No molestar para evitar interrupciones.";
/* No comment provided by engineer. */
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "A menos que tu contacto haya eliminado la conexión o\nque este enlace ya se haya usado, podría ser un error. Por favor, notifícalo.\nPara conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.";
"Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection." = "A menos que tu contacto haya eliminado la conexión o\nque este enlace ya se haya utilizado, podría tratarse de un error. Por favor, notifícalo.\nPara conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.";
/* No comment provided by engineer. */
"Unlock" = "Desbloquear";
@@ -3260,7 +3044,7 @@
"User profile" = "Perfil de usuario";
/* No comment provided by engineer. */
"Using .onion hosts requires compatible VPN provider." = "Usar hosts .onion requiere un proveedor VPN compatible.";
"Using .onion hosts requires compatible VPN provider." = "Utilizar hosts .onion requiere un proveedor VPN compatible.";
/* No comment provided by engineer. */
"Using SimpleX Chat servers." = "Usar servidores SimpleX Chat.";
@@ -3398,7 +3182,7 @@
"You are already connected to %@." = "Ya estás conectado a %@.";
/* No comment provided by engineer. */
"You are connected to the server used to receive messages from this contact." = "Estás conectado al servidor usado para recibir mensajes de este contacto.";
"You are connected to the server used to receive messages from this contact." = "Estás conectado al servidor utilizado para recibir mensajes de este contacto.";
/* No comment provided by engineer. */
"you are invited to group" = "has sido invitado al grupo";
@@ -3418,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Puedes crearlo más tarde";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Puedes activar más tarde en Configuración";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Puedes activarlos más tarde en la configuración de Privacidad y Seguridad.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Puedes ocultar o silenciar un perfil de usuario: deslízalo hacia la derecha.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_italique_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- une diffusion plus stable des messages.\n- des groupes un peu plus performants.\n- et bien d'autres choses encore !";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- messages vocaux pouvant durer jusqu'à 5 minutes.\n- délai personnalisé de disparition.\n- l'historique de modification.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ à %2$@:";
/* notification title */
"%@ is connected!" = "%@ est connecté·e !";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 secondes";
/* No comment provided by engineer. */
"A few more things" = "Encore quelques points";
/* notification title */
"A new contact" = "Un nouveau contact";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "Une connexion TCP distincte sera utilisée **pour chaque contact et membre de groupe**.\n**Veuillez noter** : si vous avez de nombreuses connexions, votre consommation de batterie et de réseau peut être nettement plus élevée et certaines liaisons peuvent échouer.";
/* No comment provided by engineer. */
"Abort" = "Annuler";
/* No comment provided by engineer. */
"Abort changing address" = "Annuler le changement d'adresse";
/* No comment provided by engineer. */
"Abort changing address?" = "Abandonner le changement d'adresse ?";
/* No comment provided by engineer. */
"About SimpleX" = "À propos de SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Adresse";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Le changement d'adresse sera annulé. L'ancienne adresse de réception sera utilisée.";
/* member role */
"admin" = "admin";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Paramètres réseau avancés";
/* chat item text */
"agreeing encryption for %@…" = "acceptant le chiffrement pour %@…";
/* chat item text */
"agreeing encryption…" = "accord sur le chiffrement…";
/* No comment provided by engineer. */
"All app data is deleted." = "Toutes les données de l'application sont supprimées.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Autoriser la suppression irréversible de messages envoyés.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Permet l'envoi de fichiers et de médias.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Autoriser l'envoi de messages vocaux.";
@@ -465,7 +435,7 @@
"Audio/video calls" = "Appels audio/vidéo";
/* No comment provided by engineer. */
"Audio/video calls are prohibited." = "Les appels audio/vidéo sont interdits.";
"Audio/video calls are prohibited." = "Interdire les appels audio/vidéo.";
/* PIN entry */
"Authentication cancelled" = "Authentification interrompue";
@@ -604,10 +574,10 @@
"changed your role to %@" = "a modifié votre rôle pour %@";
/* chat item text */
"changing address for %@" = "changement d'adresse pour %@";
"changing address for %@..." = "changement d'adresse pour %@...";
/* chat item text */
"changing address" = "changement d'adresse";
"changing address..." = "changement d'adresse...";
/* No comment provided by engineer. */
"Chat archive" = "Archives du chat";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Préférences de contact";
/* No comment provided by engineer. */
"Contacts" = "Contacts";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Vos contacts peuvent marquer les messages pour les supprimer ; vous pourrez les consulter.";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Décentralisé";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Erreur de déchiffrement";
/* pref value */
"default (%@)" = "défaut (%@)";
/* No comment provided by engineer. */
"default (no)" = "par défaut (non)";
/* No comment provided by engineer. */
"default (yes)" = "par défaut (oui)";
/* chat item action */
"Delete" = "Supprimer";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "groupe supprimé";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Les accusés de réception sont désactivés !";
/* No comment provided by engineer. */
"Delivery receipts!" = "Justificatifs de réception!";
/* No comment provided by engineer. */
"Description" = "Description";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Les messages directs entre membres sont interdits dans ce groupe.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Désactiver (conserver les remplacements)";
/* No comment provided by engineer. */
"Disable for all" = "Désactiver pour tous";
/* authentication reason */
"Disable SimpleX Lock" = "Désactiver SimpleX Lock";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Ne pas créer d'adresse";
/* No comment provided by engineer. */
"Don't enable" = "Ne pas activer";
/* No comment provided by engineer. */
"Don't show again" = "Ne plus afficher";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Activer";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Activer (conserver les remplacements)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Activer la suppression automatique des messages ?";
/* No comment provided by engineer. */
"Enable for all" = "Activer pour tous";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Activer les notifications instantanées?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Message chiffrée: erreur inattendue";
/* chat item text */
"encryption agreed" = "chiffrement accepté";
/* chat item text */
"encryption agreed for %@" = "chiffrement accepté pour %@";
/* chat item text */
"encryption ok" = "chiffrement ok";
/* chat item text */
"encryption ok for %@" = "chiffrement ok pour %@";
/* chat item text */
"encryption re-negotiation allowed" = "renégociation de chiffrement autorisée";
/* chat item text */
"encryption re-negotiation allowed for %@" = "renégociation de chiffrement autorisée pour %@";
/* chat item text */
"encryption re-negotiation required" = "renégociation de chiffrement requise";
/* chat item text */
"encryption re-negotiation required for %@" = "renégociation de chiffrement requise pour %@";
/* No comment provided by engineer. */
"ended" = "terminé";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Erreur";
/* No comment provided by engineer. */
"Error aborting address change" = "Erreur lors de l'annulation du changement d'adresse";
/* No comment provided by engineer. */
"Error accepting contact request" = "Erreur de validation de la demande de contact";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Erreur lors de la suppression du profil utilisateur";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Erreur lors de l'activation des accusés de réception!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Erreur lors de l'activation des notifications";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Erreur lors de l'envoi du message";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Erreur lors de la configuration des accusés de réception !";
/* No comment provided by engineer. */
"Error starting chat" = "Erreur lors du démarrage du chat";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Erreur lors du changement de profil !";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Erreur de synchronisation de connexion";
/* No comment provided by engineer. */
"Error updating group link" = "Erreur lors de la mise à jour du lien de groupe";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Erreur: URL invalide";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Même s'il est désactivé dans la conversation.";
/* No comment provided by engineer. */
"Exit without saving" = "Quitter sans sauvegarder";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Archive de la base de données exportée.";
/* No comment provided by engineer. */
"Exporting database archive" = "Exportation de l'archive de la base de données";
"Exporting database archive..." = "Exportation de l'archive de la base de données...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Échec de la suppression de la phrase secrète";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Rapide et ne nécessitant pas d'attendre que l'expéditeur soit en ligne !";
/* No comment provided by engineer. */
"Favorite" = "Favoris";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Le fichier sera supprimé des serveurs.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Fichiers & médias";
/* chat feature */
"Files and media" = "Fichiers et médias";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Les fichiers et les médias sont interdits dans ce groupe.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Fichiers et médias interdits !";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtrer les messages non lus et favoris.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Enfin, les voilà ! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Trouver des messages plus rapidement";
/* No comment provided by engineer. */
"Fix" = "Réparer";
/* No comment provided by engineer. */
"Fix connection" = "Réparer la connexion";
/* No comment provided by engineer. */
"Fix connection?" = "Réparer la connexion?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Réparer le chiffrement après la restauration des sauvegardes.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Correction non prise en charge par le contact";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Correction non prise en charge par un membre du groupe";
/* No comment provided by engineer. */
"For console" = "Pour la console";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Les membres du groupes peuvent envoyer des messages éphémères.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Les membres du groupe peuvent envoyer des fichiers et des médias.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Les membres du groupe peuvent envoyer des messages vocaux.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configuration de serveur améliorée";
/* copied message info */
"In reply to" = "En réponse à";
/* No comment provided by engineer. */
"Incognito" = "Incognito";
@@ -1875,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Entrain de rejoindre le groupe";
/* No comment provided by engineer. */
"Keep your connections" = "Conserver vos connexions";
/* No comment provided by engineer. */
"Keychain error" = "Erreur de la keychain";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Établir une connexion privée";
/* No comment provided by engineer. */
"Make one message disappear" = "Rendre un message éphémère";
/* No comment provided by engineer. */
"Make profile private!" = "Rendre un profil privé !";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Erreur de distribution du message";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Accusés de réception des messages !";
/* No comment provided by engineer. */
"Message draft" = "Brouillon de message";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Messages";
/* No comment provided by engineer. */
"Migrating database archive" = "Migration de l'archive de la base de données";
"Migrating database archive..." = "Migration de l'archive de la base de données...";
/* No comment provided by engineer. */
"Migration error:" = "Erreur de migration:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "sans chiffrement de bout en bout";
/* No comment provided by engineer. */
"No filtered chats" = "Pas de chats filtrés";
/* No comment provided by engineer. */
"No group!" = "Groupe introuvable !";
/* No comment provided by engineer. */
"No history" = "Aucun historique";
/* No comment provided by engineer. */
"No permission to record voice message" = "Pas l'autorisation d'enregistrer un message vocal";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Seuls les propriétaires du groupe peuvent modifier les préférences du groupe.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Seuls les propriétaires du groupe peuvent activer les fichiers et les médias.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Seuls les propriétaires de groupes peuvent activer les messages vocaux.";
@@ -2416,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Interdire lenvoi de messages éphémères.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Interdire l'envoi de fichiers et de médias.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Interdire l'envoi de messages vocaux.";
@@ -2431,9 +2269,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Délai du protocole";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Délai d'attente du protocole par KB";
/* No comment provided by engineer. */
"Push notifications" = "Notifications push";
@@ -2441,7 +2276,7 @@
"Rate the app" = "Évaluer l'app";
/* chat item menu */
"React" = "Réagissez…";
"React..." = "Réagir...";
/* No comment provided by engineer. */
"Read" = "Lire";
@@ -2465,7 +2300,7 @@
"received answer…" = "réponse reçu…";
/* No comment provided by engineer. */
"Received at" = "Reçu à";
"Received at" = "Reçu le";
/* copied message info */
"Received at: %@" = "Reçu le : %@";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Message reçu";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'adresse de réception sera changée pour un autre serveur. Le changement d'adresse sera terminé lorsque l'expéditeur sera en ligne.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La réception du fichier sera interrompue.";
@@ -2489,13 +2321,7 @@
"Receiving via" = "Réception via";
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Les destinataires voient les mises à jour au fur et à mesure que vous leur écrivez.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Reconnecter tous les serveurs connectés pour forcer la livraison des messages. Cette méthode utilise du trafic supplémentaire.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Reconnecter les serveurs?";
"Recipients see updates as you type them." = "Les destinataires voient les mises à jour au fur et à mesure que vous les tapez.";
/* No comment provided by engineer. */
"Record updated at" = "Enregistrement mis à jour le";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "vous a retiré";
/* No comment provided by engineer. */
"Renegotiate" = "Renégocier";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Renégocier le chiffrement";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renégocier le chiffrement?";
/* chat item action */
"Reply" = "Répondre";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Code de sécurité";
/* chat item text */
"security code changed" = "code de sécurité modifié";
/* No comment provided by engineer. */
"Select" = "Choisir";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Envoyez un message dynamique - il sera mis à jour pour le⸱s destinataire⸱s au fur et à mesure que vous le tapez";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Envoyer les accusés de réception à";
/* No comment provided by engineer. */
"Send direct message" = "Envoi de message direct";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Envoyez vos questions et idées";
/* No comment provided by engineer. */
"Send receipts" = "Envoyer les justificatifs";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Envoyez-les depuis la phototèque ou des claviers personnalisés.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "L'expéditeur a peut-être supprimé la demande de connexion.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "L'envoi d'accusés de réception sera activé pour tous les contacts dans tous les profils de chat visibles.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "L'envoi d'accusés de réception sera activé pour tous les contacts.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "L'envoi du fichier sera interrompu.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "L'envoi d'accusés de réception est désactivé pour %lld contacts";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "L'envoi d'accusés de réception est activé pour %lld contacts";
/* No comment provided by engineer. */
"Sending via" = "Envoi via";
@@ -3034,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "L'archive créée est disponible via l'app Paramètres / Base de données / Ancienne archive de base de données.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "Le chiffrement fonctionne et le nouvel accord de chiffrement n'est pas nécessaire. Cela peut provoquer des erreurs de connexion !";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Le groupe est entièrement décentralisé il n'est visible que par ses membres.";
@@ -3061,9 +2854,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Le profil n'est partagé qu'avec vos contacts.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Le deuxième coche que nous avons manqué ! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "L'expéditeur N'en sera PAS informé";
@@ -3079,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Il doit y avoir au moins un profil d'utilisateur visible.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Ces paramètres s'appliquent à votre profil actuel **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Ils peuvent être remplacés dans les paramètres des contacts";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Cette action ne peut être annulée - tous les fichiers et médias reçus et envoyés seront supprimés. Les photos à faible résolution seront conservées.";
@@ -3097,6 +2881,9 @@
/* notification title */
"this contact" = "ce contact";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Cette erreur est persistante pour cette connexion, veuillez vous reconnecter.";
/* No comment provided by engineer. */
"This group no longer exists." = "Ce groupe n'existe plus.";
@@ -3163,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "État de la migration inattendu";
/* No comment provided by engineer. */
"Unfav." = "Unfav.";
/* No comment provided by engineer. */
"Unhide" = "Dévoiler";
@@ -3418,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Vous pouvez la créer plus tard";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Vous pouvez l'activer ultérieurement via Paramètres";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Vous pouvez les activer ultérieurement via les paramètres de Confidentialité et Sécurité de l'application.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Vous pouvez masquer ou mettre en sourdine un profil d'utilisateur - faites-le glisser vers la droite.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_corsivo_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- recapito dei messaggi più stabile.\n- gruppi un po' migliorati.\n- e altro ancora!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- messaggi vocali fino a 5 minuti.\n- tempo di scomparsa personalizzato.\n- cronologia delle modifiche.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ alle %2$@:";
/* notification title */
"%@ is connected!" = "%@ è connesso/a!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 secondi";
/* No comment provided by engineer. */
"A few more things" = "Qualche altra cosa";
/* notification title */
"A new contact" = "Un contatto nuovo";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "Verrà usata una connessione TCP separata **per ogni contatto e membro del gruppo**.\n** Nota**: se hai molte connessioni, il consumo di batteria e traffico può essere notevolmente superiore e alcune connessioni potrebbero fallire.";
/* No comment provided by engineer. */
"Abort" = "Interrompi";
/* No comment provided by engineer. */
"Abort changing address" = "Interrompi il cambio di indirizzo";
/* No comment provided by engineer. */
"Abort changing address?" = "Interrompere il cambio di indirizzo?";
/* No comment provided by engineer. */
"About SimpleX" = "Riguardo SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Indirizzo";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Il cambio di indirizzo verrà interrotto. Verrà usato il vecchio indirizzo di ricezione.";
/* member role */
"admin" = "amministratore";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Impostazioni di rete avanzate";
/* chat item text */
"agreeing encryption for %@…" = "concordando la crittografia per %@…";
/* chat item text */
"agreeing encryption…" = "concordando la crittografia…";
/* No comment provided by engineer. */
"All app data is deleted." = "Tutti i dati dell'app vengono eliminati.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Permetti di eliminare irreversibilmente i messaggi inviati.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Consenti l'invio di file e contenuti multimediali.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Permetti l'invio di messaggi vocali.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "cambiato il tuo ruolo in %@";
/* chat item text */
"changing address for %@" = "cambio indirizzo per %@";
"changing address for %@..." = "cambio indirizzo per %@...";
/* chat item text */
"changing address" = "cambio indirizzo";
"changing address..." = "cambio indirizzo...";
/* No comment provided by engineer. */
"Chat archive" = "Archivio chat";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Preferenze del contatto";
/* No comment provided by engineer. */
"Contacts" = "Contatti";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "I contatti possono contrassegnare i messaggi per l'eliminazione; potrai vederli.";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Decentralizzato";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Errore di decifrazione";
/* pref value */
"default (%@)" = "predefinito (%@)";
/* No comment provided by engineer. */
"default (no)" = "predefinito (no)";
/* No comment provided by engineer. */
"default (yes)" = "predefinito (sì)";
/* chat item action */
"Delete" = "Elimina";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "gruppo eliminato";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Le ricevute di consegna sono disattivate!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Ricevute di consegna!";
/* No comment provided by engineer. */
"Description" = "Descrizione";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "I messaggi diretti tra i membri sono vietati in questo gruppo.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Disattiva (mantieni sostituzioni)";
/* No comment provided by engineer. */
"Disable for all" = "Disattiva per tutti";
/* authentication reason */
"Disable SimpleX Lock" = "Disattiva SimpleX Lock";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Non creare un indirizzo";
/* No comment provided by engineer. */
"Don't enable" = "Non attivare";
/* No comment provided by engineer. */
"Don't show again" = "Non mostrare più";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Attiva";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Attiva (mantieni sostituzioni)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Attivare l'eliminazione automatica dei messaggi?";
/* No comment provided by engineer. */
"Enable for all" = "Attiva per tutti";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Attivare le notifiche istantanee?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Messaggio crittografato: errore imprevisto";
/* chat item text */
"encryption agreed" = "crittografia concordata";
/* chat item text */
"encryption agreed for %@" = "crittografia concordata per %@";
/* chat item text */
"encryption ok" = "crittografia ok";
/* chat item text */
"encryption ok for %@" = "crittografia ok per %@";
/* chat item text */
"encryption re-negotiation allowed" = "rinegoziazione della crittografia consentita";
/* chat item text */
"encryption re-negotiation allowed for %@" = "rinegoziazione della crittografia consentita per %@";
/* chat item text */
"encryption re-negotiation required" = "richiesta rinegoziazione della crittografia";
/* chat item text */
"encryption re-negotiation required for %@" = "richiesta rinegoziazione della crittografia per %@";
/* No comment provided by engineer. */
"ended" = "terminata";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Errore";
/* No comment provided by engineer. */
"Error aborting address change" = "Errore nell'interruzione del cambio di indirizzo";
/* No comment provided by engineer. */
"Error accepting contact request" = "Errore nell'accettazione della richiesta di contatto";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Errore nell'eliminazione del profilo utente";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Errore nell'attivazione delle ricevute di consegna!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Errore nell'attivazione delle notifiche";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Errore nell'invio del messaggio";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Errore nell'impostazione delle ricevute di consegna!";
/* No comment provided by engineer. */
"Error starting chat" = "Errore di avvio della chat";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Errore nel cambio di profilo!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Errore nella sincronizzazione della connessione";
/* No comment provided by engineer. */
"Error updating group link" = "Errore nell'aggiornamento del link del gruppo";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Errore: l'URL non è valido";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Anche quando disattivato nella conversazione.";
/* No comment provided by engineer. */
"Exit without saving" = "Esci senza salvare";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Archivio database esportato.";
/* No comment provided by engineer. */
"Exporting database archive" = "Esportazione archivio database";
"Exporting database archive..." = "Esportazione archivio database...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Rimozione della password fallita";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Veloce e senza aspettare che il mittente sia in linea!";
/* No comment provided by engineer. */
"Favorite" = "Preferito";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Il file verrà eliminato dai server.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "File e multimediali";
/* chat feature */
"Files and media" = "File e multimediali";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "File e contenuti multimediali sono vietati in questo gruppo.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "File e contenuti multimediali vietati!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtra le chat non lette e preferite.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Finalmente le abbiamo! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Trova le chat più velocemente";
/* No comment provided by engineer. */
"Fix" = "Correggi";
/* No comment provided by engineer. */
"Fix connection" = "Correggi connessione";
/* No comment provided by engineer. */
"Fix connection?" = "Correggere la connessione?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Correggi la crittografia dopo il ripristino dei backup.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Correzione non supportata dal contatto";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Correzione non supportata dal membro del gruppo";
/* No comment provided by engineer. */
"For console" = "Per console";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "I membri del gruppo possono inviare messaggi a tempo.";
/* No comment provided by engineer. */
"Group members can send files and media." = "I membri del gruppo possono inviare file e contenuti multimediali.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "I membri del gruppo possono inviare messaggi vocali.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Configurazione del server migliorata";
/* copied message info */
"In reply to" = "In risposta a";
/* No comment provided by engineer. */
"Incognito" = "Incognito";
@@ -1875,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Ingresso nel gruppo";
/* No comment provided by engineer. */
"Keep your connections" = "Mantieni le tue connessioni";
/* No comment provided by engineer. */
"Keychain error" = "Errore del portachiavi";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Crea una connessione privata";
/* No comment provided by engineer. */
"Make one message disappear" = "Fai sparire un messaggio";
/* No comment provided by engineer. */
"Make profile private!" = "Rendi privato il profilo!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Errore di recapito del messaggio";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Ricevute di consegna dei messaggi!";
/* No comment provided by engineer. */
"Message draft" = "Bozza dei messaggi";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Messaggi";
/* No comment provided by engineer. */
"Migrating database archive" = "Migrazione archivio del database";
"Migrating database archive..." = "Migrazione archivio del database...";
/* No comment provided by engineer. */
"Migration error:" = "Errore di migrazione:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "nessuna crittografia e2e";
/* No comment provided by engineer. */
"No filtered chats" = "Nessuna chat filtrata";
/* No comment provided by engineer. */
"No group!" = "Gruppo non trovato!";
/* No comment provided by engineer. */
"No history" = "Nessuna cronologia";
/* No comment provided by engineer. */
"No permission to record voice message" = "Nessuna autorizzazione per registrare messaggi vocali";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Solo i proprietari del gruppo possono modificarne le preferenze.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Solo i proprietari del gruppo possono attivare file e contenuti multimediali.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Solo i proprietari del gruppo possono attivare i messaggi vocali.";
@@ -2416,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Proibisci l'invio di messaggi a tempo.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Proibisci l'invio di file e contenuti multimediali.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Proibisci l'invio di messaggi vocali.";
@@ -2431,9 +2269,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Scadenza del protocollo";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Scadenza del protocollo per KB";
/* No comment provided by engineer. */
"Push notifications" = "Notifiche push";
@@ -2441,7 +2276,7 @@
"Rate the app" = "Valuta l'app";
/* chat item menu */
"React" = "Reagisci";
"React..." = "Reagisci...";
/* No comment provided by engineer. */
"Read" = "Leggi";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Messaggio ricevuto";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "L'indirizzo di ricezione verrà cambiato in un server diverso. La modifica dell'indirizzo verrà completata dopo che il mittente sarà in linea.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "La ricezione del file verrà interrotta.";
@@ -2491,12 +2323,6 @@
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "I destinatari vedono gli aggiornamenti mentre li digiti.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Riconnetti tutti i server connessi per imporre il recapito dei messaggi. Utilizza traffico aggiuntivo.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Riconnettere i server?";
/* No comment provided by engineer. */
"Record updated at" = "Registro aggiornato il";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "sei stato/a rimosso/a";
/* No comment provided by engineer. */
"Renegotiate" = "Rinegoziare";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Rinegoziare crittografia";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Rinegoziare la crittografia?";
/* chat item action */
"Reply" = "Rispondi";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Codice di sicurezza";
/* chat item text */
"security code changed" = "codice di sicurezza modificato";
/* No comment provided by engineer. */
"Select" = "Seleziona";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Invia un messaggio in diretta: si aggiornerà per i destinatari mentre lo digiti";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Invia ricevute di consegna a";
/* No comment provided by engineer. */
"Send direct message" = "Invia messaggio diretto";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Invia domande e idee";
/* No comment provided by engineer. */
"Send receipts" = "Invia ricevute";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Inviali dalla galleria o dalle tastiere personalizzate.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Il mittente potrebbe aver eliminato la richiesta di connessione.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "L'invio delle ricevute di consegna sarà attivo per tutti i contatti in tutti i profili di chat visibili.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "L'invio delle ricevute di consegna sarà attivo per tutti i contatti.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "L'invio del file verrà interrotto.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "L'invio di ricevute è disattivato per %lld contatti";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "L'invio di ricevute è attivo per %lld contatti";
/* No comment provided by engineer. */
"Sending via" = "Invio tramite";
@@ -3034,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "L'archivio creato è disponibile via Impostazioni / Database / Archivio database vecchio.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "La crittografia funziona e il nuovo accordo sulla crittografia non è richiesto. Potrebbero verificarsi errori di connessione!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Il gruppo è completamente decentralizzato: è visibile solo ai membri.";
@@ -3061,9 +2854,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Il profilo è condiviso solo con i tuoi contatti.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Il secondo segno di spunta che ci mancava! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "Il mittente NON verrà avvisato";
@@ -3079,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Deve esserci almeno un profilo utente visibile.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Queste impostazioni sono per il tuo profilo attuale **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Possono essere sovrascritte nelle impostazioni dei contatti";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Questa azione non può essere annullata: tutti i file e i media ricevuti e inviati verranno eliminati. Rimarranno le immagini a bassa risoluzione.";
@@ -3097,6 +2881,9 @@
/* notification title */
"this contact" = "questo contatto";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "L'errore è permanente per questa connessione, riconnettiti.";
/* No comment provided by engineer. */
"This group no longer exists." = "Questo gruppo non esiste più.";
@@ -3163,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Stato di migrazione imprevisto";
/* No comment provided by engineer. */
"Unfav." = "Non pref.";
/* No comment provided by engineer. */
"Unhide" = "Svela";
@@ -3418,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Puoi crearlo più tardi";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Puoi attivarle più tardi nelle impostazioni";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Puoi attivarle più tardi nelle impostazioni di privacy e sicurezza dell'app.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Puoi nascondere o silenziare un profilo utente - scorrilo verso destra.";

View File

@@ -570,6 +570,12 @@
/* rcv group event chat item */
"changed your role to %@" = "あなたの役割を %@ に変更しました";
/* chat item text */
"changing address for %@..." = "%@ のアドレスを変更しています...";
/* chat item text */
"changing address..." = "アドレスを変更しています…";
/* No comment provided by engineer. */
"Chat archive" = "チャットのアーカイブ";
@@ -888,7 +894,7 @@
/* No comment provided by engineer. */
"Decentralized" = "分散型";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "復号化エラー";
/* pref value */
@@ -1357,7 +1363,7 @@
"Exported database archive." = "データベースのアーカイブをエクスポートします。";
/* No comment provided by engineer. */
"Exporting database archive" = "データベース アーカイブをエクスポートしています";
"Exporting database archive..." = "データベース アーカイブをエクスポートしています...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "パスフレーズの削除に失敗";
@@ -1855,7 +1861,7 @@
"Messages & files" = "メッセージ & ファイル";
/* No comment provided by engineer. */
"Migrating database archive" = "データベースのアーカイブを移行しています";
"Migrating database archive..." = "データベースのアーカイブを移行しています...";
/* No comment provided by engineer. */
"Migration error:" = "移行エラー:";
@@ -2260,6 +2266,9 @@
/* No comment provided by engineer. */
"Rate the app" = "アプリを評価";
/* chat item menu */
"React..." = "リアクション...";
/* No comment provided by engineer. */
"Read" = "読む";
@@ -2860,6 +2869,9 @@
/* notification title */
"this contact" = "この連絡先";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "このエラーはこの接続では永続的なものです。再接続してください。";
/* No comment provided by engineer. */
"This group no longer exists." = "このグループはもう存在しません。";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_cursief_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- stabielere berichtbezorging.\n- een beetje betere groepen.\n- en meer!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- spraakberichten tot 5 minuten.\n- aangepaste tijd om te verdwijnen.\n- bewerkingsgeschiedenis.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ bij %2$@:";
/* notification title */
"%@ is connected!" = "%@ is verbonden!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 seconden";
/* No comment provided by engineer. */
"A few more things" = "Nog een paar dingen";
/* notification title */
"A new contact" = "Een nieuw contact";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "Er wordt een aparte TCP-verbinding gebruikt **voor elk contact en groepslid**.\n**Let op**: als u veel verbindingen heeft, kan uw batterij- en verkeersverbruik aanzienlijk hoger zijn en kunnen sommige verbindingen uitvallen.";
/* No comment provided by engineer. */
"Abort" = "Afbreken";
/* No comment provided by engineer. */
"Abort changing address" = "Annuleer het wijzigen van het adres";
/* No comment provided by engineer. */
"Abort changing address?" = "Adres wijziging afbreken?";
/* No comment provided by engineer. */
"About SimpleX" = "Over SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Adres";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Adres wijziging wordt afgebroken. Het oude ontvangstadres wordt gebruikt.";
/* member role */
"admin" = "Beheerder";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Geavanceerde netwerk instellingen";
/* chat item text */
"agreeing encryption for %@…" = "versleuteling overeenkomen voor %@…";
/* chat item text */
"agreeing encryption…" = "versleuteling overeenkomen…";
/* No comment provided by engineer. */
"All app data is deleted." = "Alle app-gegevens worden verwijderd.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Sta toe om verzonden berichten onomkeerbaar te verwijderen.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Sta toe om bestanden en media te verzenden.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Sta toe om spraak berichten te verzenden.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "veranderde je rol in %@";
/* chat item text */
"changing address for %@" = "adres wijzigen voor %@";
"changing address for %@..." = "adres wijzigen voor %@...";
/* chat item text */
"changing address" = "adres wijzigen";
"changing address..." = "adres wijzigen...";
/* No comment provided by engineer. */
"Chat archive" = "Gesprek archief";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Contact voorkeuren";
/* No comment provided by engineer. */
"Contacts" = "Contacten";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Contact personen kunnen berichten markeren voor verwijdering; u kunt ze wel bekijken.";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Gedecentraliseerd";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Decodering fout";
/* pref value */
"default (%@)" = "standaard (%@)";
/* No comment provided by engineer. */
"default (no)" = "standaard (nee)";
/* No comment provided by engineer. */
"default (yes)" = "standaard (ja)";
/* chat item action */
"Delete" = "Verwijderen";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "verwijderde groep";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Ontvangstbewijzen zijn uitgeschakeld!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Ontvangstbewijzen!";
/* No comment provided by engineer. */
"Description" = "Beschrijving";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Directe berichten tussen leden zijn verboden in deze groep.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Uitschakelen (overschrijvingen behouden)";
/* No comment provided by engineer. */
"Disable for all" = "Uitschakelen voor iedereen";
/* authentication reason */
"Disable SimpleX Lock" = "SimpleX Vergrendelen uitschakelen";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Maak geen adres aan";
/* No comment provided by engineer. */
"Don't enable" = "Niet inschakelen";
/* No comment provided by engineer. */
"Don't show again" = "Niet meer weergeven";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Inschakelen";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Inschakelen (overschrijvingen behouden)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Automatisch verwijderen van berichten aanzetten?";
/* No comment provided by engineer. */
"Enable for all" = "Inschakelen voor iedereen";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Onmiddellijke meldingen inschakelen?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Versleuteld bericht: onverwachte fout";
/* chat item text */
"encryption agreed" = "versleuteling overeengekomen";
/* chat item text */
"encryption agreed for %@" = "versleuteling overeengekomen voor % @";
/* chat item text */
"encryption ok" = "versleuteling ok";
/* chat item text */
"encryption ok for %@" = "versleuteling ok voor % @";
/* chat item text */
"encryption re-negotiation allowed" = "versleuteling heronderhandeling toegestaan";
/* chat item text */
"encryption re-negotiation allowed for %@" = "versleuteling heronderhandeling toegestaan voor % @";
/* chat item text */
"encryption re-negotiation required" = "heronderhandeling van versleuteling vereist";
/* chat item text */
"encryption re-negotiation required for %@" = "heronderhandeling van versleuteling vereist voor % @";
/* No comment provided by engineer. */
"ended" = "geëindigd";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Fout";
/* No comment provided by engineer. */
"Error aborting address change" = "Fout bij het afbreken van adres wijziging";
/* No comment provided by engineer. */
"Error accepting contact request" = "Fout bij het accepteren van een contactverzoek";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Fout bij het verwijderen van gebruikers profiel";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Fout bij het inschakelen van ontvangstbevestiging!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Fout bij inschakelen van meldingen";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Fout bij verzenden van bericht";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Fout bij het instellen van ontvangstbevestiging!";
/* No comment provided by engineer. */
"Error starting chat" = "Fout bij het starten van de chat";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Fout bij wisselen van profiel!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Fout bij het synchroniseren van de verbinding";
/* No comment provided by engineer. */
"Error updating group link" = "Fout bij bijwerken van groep link";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Fout: URL is ongeldig";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Zelfs wanneer uitgeschakeld in het gesprek.";
/* No comment provided by engineer. */
"Exit without saving" = "Afsluiten zonder opslaan";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Geëxporteerd database archief.";
/* No comment provided by engineer. */
"Exporting database archive" = "Database archief exporteren";
"Exporting database archive..." = "Database archief exporteren...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Kan wachtwoord niet verwijderen";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Snel en niet wachten tot de afzender online is!";
/* No comment provided by engineer. */
"Favorite" = "Favoriet";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Het bestand wordt van de servers verwijderd.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Bestanden en media";
/* chat feature */
"Files and media" = "Bestanden en media";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Bestanden en media zijn verboden in deze groep.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Bestanden en media verboden!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filter ongelezen en favoriete chats.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Eindelijk, we hebben ze! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Vind gesprekken sneller";
/* No comment provided by engineer. */
"Fix" = "Herstel";
/* No comment provided by engineer. */
"Fix connection" = "Verbinding herstellen";
/* No comment provided by engineer. */
"Fix connection?" = "Verbinding herstellen?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Repareer versleuteling na het herstellen van back-ups.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Herstel wordt niet ondersteund door contact";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Herstel wordt niet ondersteund door groepslid";
/* No comment provided by engineer. */
"For console" = "Voor console";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Groepsleden kunnen verdwijnende berichten sturen.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Groepsleden kunnen bestanden en media verzenden.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Groepsleden kunnen spraak berichten verzenden.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Verbeterde serverconfiguratie";
/* copied message info */
"In reply to" = "In antwoord op";
/* No comment provided by engineer. */
"Incognito" = "Incognito";
@@ -1875,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Deel nemen aan groep";
/* No comment provided by engineer. */
"Keep your connections" = "Behoud uw verbindingen";
/* No comment provided by engineer. */
"Keychain error" = "Keychain fout";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Maak een privéverbinding";
/* No comment provided by engineer. */
"Make one message disappear" = "Eén bericht laten verdwijnen";
/* No comment provided by engineer. */
"Make profile private!" = "Profiel privé maken!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Fout bij bezorging van bericht";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Ontvangstbevestiging voor berichten!";
/* No comment provided by engineer. */
"Message draft" = "Concept bericht";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Berichten";
/* No comment provided by engineer. */
"Migrating database archive" = "Database archief migreren";
"Migrating database archive..." = "Database archief migreren...";
/* No comment provided by engineer. */
"Migration error:" = "Migratiefout:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "geen e2e versleuteling";
/* No comment provided by engineer. */
"No filtered chats" = "Geen gefilterde gesprekken";
/* No comment provided by engineer. */
"No group!" = "Groep niet gevonden!";
/* No comment provided by engineer. */
"No history" = "Geen geschiedenis";
/* No comment provided by engineer. */
"No permission to record voice message" = "Geen toestemming om spraakbericht op te nemen";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Alleen groep eigenaren kunnen groep voorkeuren wijzigen.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Alleen groepseigenaren kunnen bestanden en media inschakelen.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Alleen groep eigenaren kunnen spraak berichten inschakelen.";
@@ -2416,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Verbied het verzenden van verdwijnende berichten.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Verbied het verzenden van bestanden en media.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Verbieden het verzenden van spraak berichten.";
@@ -2431,9 +2269,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Protocol timeout";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Protocol timeout per KB";
/* No comment provided by engineer. */
"Push notifications" = "Push meldingen";
@@ -2441,7 +2276,7 @@
"Rate the app" = "Beoordeel de app";
/* chat item menu */
"React" = "Reageer";
"React..." = "Reageer...";
/* No comment provided by engineer. */
"Read" = "Lees";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Ontvangen bericht";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Het ontvangstadres wordt gewijzigd naar een andere server. Adres wijziging wordt voltooid nadat de afzender online is.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Het ontvangen van het bestand wordt gestopt.";
@@ -2491,12 +2323,6 @@
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Ontvangers zien updates terwijl u ze typt.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Verbind alle verbonden servers opnieuw om de bezorging van berichten af te dwingen. Het maakt gebruik van extra data.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Servers opnieuw verbinden?";
/* No comment provided by engineer. */
"Record updated at" = "Record bijgewerkt op";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "heeft je verwijderd";
/* No comment provided by engineer. */
"Renegotiate" = "Opnieuw onderhandelen";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Heronderhandel over versleuteling";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Heronderhandelen over versleuteling?";
/* chat item action */
"Reply" = "Antwoord";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Beveiligingscode";
/* chat item text */
"security code changed" = "beveiligingscode gewijzigd";
/* No comment provided by engineer. */
"Select" = "Selecteer";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Stuur een live bericht, het wordt bijgewerkt voor de ontvanger(s) terwijl u het typt";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Stuur ontvangstbewijzen naar";
/* No comment provided by engineer. */
"Send direct message" = "Direct bericht sturen";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Stuur vragen en ideeën";
/* No comment provided by engineer. */
"Send receipts" = "Ontvangstbewijzen verzenden";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Stuur ze vanuit de galerij of aangepaste toetsenborden.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "De afzender heeft mogelijk het verbindingsverzoek verwijderd.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Het verzenden van ontvangstbevestiging wordt ingeschakeld voor alle contacten in alle zichtbare chatprofielen.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Het verzenden van ontvangstbevestiging wordt ingeschakeld voor alle contactpersonen.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Het verzenden van het bestand wordt gestopt.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "Het verzenden van ontvangstbevestiging is uitgeschakeld voor %lld-contactpersonen";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "Het verzenden van ontvangstbevestiging is ingeschakeld voor %lld-contactpersonen";
/* No comment provided by engineer. */
"Sending via" = "Verzenden via";
@@ -3034,9 +2830,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "Het aangemaakte archief is beschikbaar via app Instellingen / Database / Oud database archief.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "De versleuteling werkt en de nieuwe versleutelingsovereenkomst is niet vereist. Dit kan leiden tot verbindingsfouten!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "De groep is volledig gedecentraliseerd het is alleen zichtbaar voor de leden.";
@@ -3061,9 +2854,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Het profiel wordt alleen gedeeld met uw contacten.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "De tweede vink die we gemist hebben! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "De afzender wordt NIET op de hoogte gebracht";
@@ -3079,12 +2869,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Er moet ten minste één zichtbaar gebruikers profiel zijn.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Deze instellingen zijn voor uw huidige profiel **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Ze kunnen worden overschreven in contactinstellingen";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Deze actie kan niet ongedaan worden gemaakt, alle ontvangen en verzonden bestanden en media worden verwijderd. Foto's met een lage resolutie blijven behouden.";
@@ -3097,6 +2881,9 @@
/* notification title */
"this contact" = "dit contact";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Deze fout is permanent voor deze verbinding, maak opnieuw verbinding.";
/* No comment provided by engineer. */
"This group no longer exists." = "Deze groep bestaat niet meer.";
@@ -3163,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Onverwachte migratiestatus";
/* No comment provided by engineer. */
"Unfav." = "Niet fav.";
/* No comment provided by engineer. */
"Unhide" = "zichtbaar maken";
@@ -3418,12 +3202,6 @@
/* No comment provided by engineer. */
"You can create it later" = "U kan het later maken";
/* No comment provided by engineer. */
"You can enable later via Settings" = "U kunt later inschakelen via Instellingen";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "U kunt ze later inschakelen via de privacy- en beveiligingsinstellingen van de app.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "U kunt een gebruikers profiel verbergen of dempen - veeg het naar rechts.";
@@ -3491,7 +3269,7 @@
"you left" = "jij bent vertrokken";
/* No comment provided by engineer. */
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "U mag ALLEEN de meest recente versie van uw chat database op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten.";
"You must use the most recent version of your chat database on one device ONLY, otherwise you may stop receiving the messages from some contacts." = "U mag de meest recente versie van uw chat database ALLEEN op één apparaat gebruiken, anders ontvangt u mogelijk geen berichten meer van sommige contacten.";
/* No comment provided by engineer. */
"You need to allow your contact to send voice messages to be able to send them." = "U moet uw contact toestemming geven om spraak berichten te verzenden om ze te kunnen verzenden.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_kursywa_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- bardziej stabilne dostarczanie wiadomości.\n- nieco lepsze grupy.\n- i więcej!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- wiadomości głosowe do 5 minut.\n- niestandardowy czas zniknięcia.\n- historia edycji.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ o %2$@:";
/* notification title */
"%@ is connected!" = "%@ jest połączony!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 sekund";
/* No comment provided by engineer. */
"A few more things" = "Jeszcze kilka rzeczy";
/* notification title */
"A new contact" = "Nowy kontakt";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "Oddzielne połączenie TCP będzie używane **dla każdego kontaktu i członka grupy**.\n**Uwaga**: jeśli masz wiele połączeń, zużycie baterii i ruchu może być znacznie wyższe, a niektóre połączenia mogą się nie udać.";
/* No comment provided by engineer. */
"Abort" = "Przerwij";
/* No comment provided by engineer. */
"Abort changing address" = "Przerwij zmianę adresu";
/* No comment provided by engineer. */
"Abort changing address?" = "Przerwać zmianę adresu?";
/* No comment provided by engineer. */
"About SimpleX" = "O SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Adres";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Zmiana adresu zostanie przerwana. Użyty zostanie stary adres odbiorczy.";
/* member role */
"admin" = "administrator";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Zaawansowane ustawienia sieci";
/* chat item text */
"agreeing encryption for %@…" = "uzgadnianie szyfrowania dla %@…";
/* chat item text */
"agreeing encryption…" = "uzgadnianie szyfrowania…";
/* No comment provided by engineer. */
"All app data is deleted." = "Wszystkie dane aplikacji są usunięte.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Zezwól na nieodwracalne usunięcie wysłanych wiadomości.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Pozwól na wysyłanie plików i mediów.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Zezwól na wysyłanie wiadomości głosowych.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "zmieniono Twoją rolę na %@";
/* chat item text */
"changing address for %@" = "zmienienie adresu dla %@";
"changing address for %@..." = "zmienienie adresu dla %@...";
/* chat item text */
"changing address" = "zmiana adresu";
"changing address..." = "zmienienie adresu...";
/* No comment provided by engineer. */
"Chat archive" = "Archiwum czatu";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Preferencje kontaktu";
/* No comment provided by engineer. */
"Contacts" = "Kontakty";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Kontakty mogą oznaczać wiadomości do usunięcia; będziesz mógł je zobaczyć.";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Zdecentralizowane";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Błąd odszyfrowania";
/* pref value */
"default (%@)" = "domyślne (%@)";
/* No comment provided by engineer. */
"default (no)" = "domyślnie (nie)";
/* No comment provided by engineer. */
"default (yes)" = "domyślnie (tak)";
/* chat item action */
"Delete" = "Usuń";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "usunięta grupa";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Potwierdzenia dostawy są wyłączone!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Potwierdzenia dostawy!";
/* No comment provided by engineer. */
"Description" = "Opis";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Bezpośrednie wiadomości między członkami są zabronione w tej grupie.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Wyłącz (zachowaj nadpisania)";
/* No comment provided by engineer. */
"Disable for all" = "Wyłącz dla wszystkich";
/* authentication reason */
"Disable SimpleX Lock" = "Wyłącz blokadę SimpleX";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Nie twórz adresu";
/* No comment provided by engineer. */
"Don't enable" = "Nie włączaj";
/* No comment provided by engineer. */
"Don't show again" = "Nie pokazuj ponownie";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Włącz";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Włącz (zachowaj nadpisania)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Czy włączyć automatyczne usuwanie wiadomości?";
/* No comment provided by engineer. */
"Enable for all" = "Włącz dla wszystkich";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Włączyć natychmiastowe powiadomienia?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Zaszyfrowana wiadomość: nieoczekiwany błąd";
/* chat item text */
"encryption agreed" = "uzgodniono szyfrowanie";
/* chat item text */
"encryption agreed for %@" = "uzgodniono szyfrowanie dla %@";
/* chat item text */
"encryption ok" = "szyfrowanie ok";
/* chat item text */
"encryption ok for %@" = "szyfrowanie ok dla %@";
/* chat item text */
"encryption re-negotiation allowed" = "renegocjacja szyfrowania dozwolona";
/* chat item text */
"encryption re-negotiation allowed for %@" = "renegocjacja szyfrowania dozwolona dla %@";
/* chat item text */
"encryption re-negotiation required" = "renegocjacja szyfrowania wymagana";
/* chat item text */
"encryption re-negotiation required for %@" = "renegocjacja szyfrowania wymagana dla %@";
/* No comment provided by engineer. */
"ended" = "zakończona";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Błąd";
/* No comment provided by engineer. */
"Error aborting address change" = "Błąd przerwania zmiany adresu";
/* No comment provided by engineer. */
"Error accepting contact request" = "Błąd przyjmowania prośby o kontakt";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Błąd usuwania profilu użytkownika";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Błąd włączania potwierdzeń dostawy!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Błąd włączania powiadomień";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Błąd wysyłania wiadomości";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Błąd ustawiania potwierdzeń dostawy!";
/* No comment provided by engineer. */
"Error starting chat" = "Błąd uruchamiania czatu";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Błąd przełączania profilu!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Błąd synchronizacji połączenia";
/* No comment provided by engineer. */
"Error updating group link" = "Błąd aktualizacji linku grupy";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Błąd: URL jest nieprawidłowy";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Nawet po wyłączeniu w rozmowie.";
/* No comment provided by engineer. */
"Exit without saving" = "Wyjdź bez zapisywania";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Wyeksportowane archiwum bazy danych.";
/* No comment provided by engineer. */
"Exporting database archive" = "Eksportowanie archiwum bazy danych";
"Exporting database archive..." = "Eksportowanie archiwum bazy danych...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Nie udało się usunąć hasła";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Szybko i bez czekania aż nadawca będzie online!";
/* No comment provided by engineer. */
"Favorite" = "Ulubione";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Plik zostanie usunięty z serwerów.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Pliki i media";
/* chat feature */
"Files and media" = "Pliki i media";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Pliki i media są zabronione w tej grupie.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Pliki i media zabronione!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Filtruj nieprzeczytane i ulubione czaty.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "W końcu je mamy! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Szybciej znajduj czaty";
/* No comment provided by engineer. */
"Fix" = "Napraw";
/* No comment provided by engineer. */
"Fix connection" = "Napraw połączenie";
/* No comment provided by engineer. */
"Fix connection?" = "Naprawić połączenie?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Napraw szyfrowanie po przywróceniu kopii zapasowych.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Naprawa nie jest obsługiwana przez kontakt";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Naprawa nie jest obsługiwana przez członka grupy";
/* No comment provided by engineer. */
"For console" = "Dla konsoli";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Członkowie grupy mogą wysyłać znikające wiadomości.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Członkowie grupy mogą wysyłać pliki i media.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Członkowie grupy mogą wysyłać wiadomości głosowe.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Ulepszona konfiguracja serwera";
/* copied message info */
"In reply to" = "W odpowiedzi na";
/* No comment provided by engineer. */
"Incognito" = "Incognito";
@@ -1875,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Dołączanie do grupy";
/* No comment provided by engineer. */
"Keep your connections" = "Zachowaj swoje połączenia";
/* No comment provided by engineer. */
"Keychain error" = "Błąd pęku kluczy";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Nawiąż prywatne połączenie";
/* No comment provided by engineer. */
"Make one message disappear" = "Spraw, aby jedna wiadomość zniknęła";
/* No comment provided by engineer. */
"Make profile private!" = "Ustaw profil jako prywatny!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Błąd dostarczenia wiadomości";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Potwierdzenia dostarczenia wiadomości!";
/* No comment provided by engineer. */
"Message draft" = "Wersja robocza wiadomości";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Wiadomości i pliki";
/* No comment provided by engineer. */
"Migrating database archive" = "Migrowanie archiwum bazy danych";
"Migrating database archive..." = "Migrowanie archiwum bazy danych...";
/* No comment provided by engineer. */
"Migration error:" = "Błąd migracji:";
@@ -2136,15 +1986,9 @@
/* No comment provided by engineer. */
"no e2e encryption" = "brak szyfrowania e2e";
/* No comment provided by engineer. */
"No filtered chats" = "Brak filtrowanych czatów";
/* No comment provided by engineer. */
"No group!" = "Nie znaleziono grupy!";
/* No comment provided by engineer. */
"No history" = "Brak historii";
/* No comment provided by engineer. */
"No permission to record voice message" = "Brak uprawnień do nagrywania wiadomości głosowej";
@@ -2212,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Tylko właściciele grup mogą zmieniać preferencje grupy.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Tylko właściciele grup mogą włączać pliki i media.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Tylko właściciele grup mogą włączyć wiadomości głosowe.";
@@ -2416,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Zabroń wysyłania znikających wiadomości.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Zakaz wysyłania plików i mediów.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Zabroń wysyłania wiadomości głosowych.";
@@ -2431,9 +2269,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Limit czasu protokołu";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Limit czasu protokołu na KB";
/* No comment provided by engineer. */
"Push notifications" = "Powiadomienia push";
@@ -2441,7 +2276,7 @@
"Rate the app" = "Oceń aplikację";
/* chat item menu */
"React" = "Reaguj";
"React..." = "Zareaguj...";
/* No comment provided by engineer. */
"Read" = "Czytaj";
@@ -2479,9 +2314,6 @@
/* message info title */
"Received message" = "Otrzymano wiadomość";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Adres odbiorczy zostanie zmieniony na inny serwer. Zmiana adresu zostanie zakończona gdy nadawca będzie online.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Odbieranie pliku zostanie przerwane.";
@@ -2491,12 +2323,6 @@
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Odbiorcy widzą aktualizacje podczas ich wpisywania.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Połącz ponownie wszystkie połączone serwery, aby wymusić dostarczanie wiadomości. Wykorzystuje dodatkowy ruch.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Ponownie połączyć serwery?";
/* No comment provided by engineer. */
"Record updated at" = "Rekord zaktualizowany o";
@@ -2545,15 +2371,6 @@
/* rcv group event chat item */
"removed you" = "usunął cię";
/* No comment provided by engineer. */
"Renegotiate" = "Renegocjuj";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Renegocjuj szyfrowanie";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Renegocjować szyfrowanie?";
/* chat item action */
"Reply" = "Odpowiedz";
@@ -2692,9 +2509,6 @@
/* No comment provided by engineer. */
"Security code" = "Kod bezpieczeństwa";
/* chat item text */
"security code changed" = "kod bezpieczeństwa zmieniony";
/* No comment provided by engineer. */
"Select" = "Wybierz";
@@ -2716,9 +2530,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Wysyłaj wiadomości na żywo - będą one aktualizowane dla odbiorcy(ów) w trakcie ich wpisywania";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Wyślij potwierdzenia dostawy do";
/* No comment provided by engineer. */
"Send direct message" = "Wyślij wiadomość bezpośrednią";
@@ -2740,9 +2551,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Wyślij pytania i pomysły";
/* No comment provided by engineer. */
"Send receipts" = "Wyślij potwierdzenia";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Wyślij je z galerii lub niestandardowych klawiatur.";
@@ -2752,21 +2560,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Nadawca mógł usunąć prośbę o połączenie.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Wysyłanie potwierdzeń dostawy zostanie włączone dla wszystkich kontaktów we wszystkich widocznych profilach czatu.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Wysyłanie potwierdzeń dostawy zostanie włączone dla wszystkich kontaktów.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Wysyłanie pliku zostanie przerwane.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "Wysyłanie potwierdzeń jest wyłączone dla %lld kontaktów";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "Wysyłanie potwierdzeń jest włączone dla %lld kontaktów";
/* No comment provided by engineer. */
"Sending via" = "Wysyłanie przez";
@@ -2902,9 +2698,6 @@
/* No comment provided by engineer. */
"SMP servers" = "Serwery SMP";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Podczas importu wystąpiły niekrytyczne błędy - więcej szczegółów można znaleźć w konsoli czatu.";
/* notification title */
"Somebody" = "Ktoś";
@@ -3034,9 +2827,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "Utworzone archiwum jest dostępne poprzez aplikację Ustawienia / Baza danych / Stare archiwum bazy danych.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "Szyfrowanie działa, a nowe uzgodnienie szyfrowania nie jest wymagane. Może to spowodować błędy w połączeniu!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Grupa jest w pełni zdecentralizowana jest widoczna tylko dla członków.";
@@ -3061,9 +2851,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Profil jest udostępniany tylko Twoim kontaktom.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Drugi tik, który przegapiliśmy! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "Nadawca NIE zostanie powiadomiony";
@@ -3079,12 +2866,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Powinien istnieć co najmniej jeden widoczny profil użytkownika.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Te ustawienia dotyczą Twojego bieżącego profilu **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Można je nadpisać w ustawieniach kontaktu";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Tego działania nie można cofnąć - wszystkie odebrane i wysłane pliki oraz media zostaną usunięte. Obrazy o niskiej rozdzielczości pozostaną.";
@@ -3097,6 +2878,9 @@
/* notification title */
"this contact" = "ten kontakt";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Ten błąd jest trwały dla tego połączenia, proszę o ponowne połączenie.";
/* No comment provided by engineer. */
"This group no longer exists." = "Ta grupa już nie istnieje.";
@@ -3163,9 +2947,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Nieoczekiwany stan migracji";
/* No comment provided by engineer. */
"Unfav." = "Nie ulub.";
/* No comment provided by engineer. */
"Unhide" = "Odkryj";
@@ -3418,12 +3199,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Możesz go utworzyć później";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Możesz włączyć później w Ustawieniach";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Możesz je włączyć później w ustawieniach Prywatności i Bezpieczeństwa aplikacji.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Możesz ukryć lub wyciszyć profil użytkownika - przesuń palcem w prawo.";

View File

@@ -19,9 +19,6 @@
/* No comment provided by engineer. */
"_italic_" = "\\_курсив_";
/* No comment provided by engineer. */
"- more stable message delivery.\n- a bit better groups.\n- and more!" = "- более стабильная доставка сообщений.\n- немного улучшенные группы.\n- и прочее!";
/* No comment provided by engineer. */
"- voice messages up to 5 minutes.\n- custom time to disappear.\n- editing history." = "- голосовые сообщения до 5 минут.\n- настройка времени исчезающих сообщений.\n- история редактирования.";
@@ -106,9 +103,6 @@
/* No comment provided by engineer. */
"%@ %@" = "%@ %@";
/* copied message info, <sender> at <time> */
"%@ at %@:" = "%1$@ в %2$@:";
/* notification title */
"%@ is connected!" = "Установлено соединение с %@!";
@@ -238,9 +232,6 @@
/* No comment provided by engineer. */
"30 seconds" = "30 секунд";
/* No comment provided by engineer. */
"A few more things" = "Еще несколько изменений";
/* notification title */
"A new contact" = "Новый контакт";
@@ -256,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "Отдельное TCP-соединение (и авторизация SOCKS) будет использоваться **для каждого контакта и члена группы**.\n**Обратите внимание**: если у Вас много контактов, потребление батареи и трафика может быть значительно выше, и некоторые соединения могут не работать.";
/* No comment provided by engineer. */
"Abort" = "Прекратить";
/* No comment provided by engineer. */
"Abort changing address" = "Прекратить изменение адреса";
/* No comment provided by engineer. */
"Abort changing address?" = "Прекратить изменение адреса?";
/* No comment provided by engineer. */
"About SimpleX" = "О SimpleX";
@@ -320,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "Адрес";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "Изменение адреса будет прекращено. Будет использоваться старый адрес.";
/* member role */
"admin" = "админ";
@@ -332,12 +311,6 @@
/* No comment provided by engineer. */
"Advanced network settings" = "Настройки сети";
/* chat item text */
"agreeing encryption for %@…" = "шифрование согласовывается для %@…";
/* chat item text */
"agreeing encryption…" = "шифрование согласовывается…";
/* No comment provided by engineer. */
"All app data is deleted." = "Все данные приложения будут удалены.";
@@ -386,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "Разрешить необратимо удалять отправленные сообщения.";
/* No comment provided by engineer. */
"Allow to send files and media." = "Разрешить посылать файлы и медиа.";
/* No comment provided by engineer. */
"Allow to send voice messages." = "Разрешить отправлять голосовые сообщения.";
@@ -604,10 +574,10 @@
"changed your role to %@" = "поменял(а) Вашу роль на: %@";
/* chat item text */
"changing address for %@" = "смена адреса для %@";
"changing address for %@..." = "смена адреса для %@...";
/* chat item text */
"changing address" = "смена адреса";
"changing address..." = "смена адреса...";
/* No comment provided by engineer. */
"Chat archive" = "Архив чата";
@@ -798,9 +768,6 @@
/* No comment provided by engineer. */
"Contact preferences" = "Предпочтения контакта";
/* No comment provided by engineer. */
"Contacts" = "Контакты";
/* No comment provided by engineer. */
"Contacts can mark messages for deletion; you will be able to view them." = "Контакты могут помечать сообщения для удаления; Вы сможете просмотреть их.";
@@ -930,18 +897,12 @@
/* No comment provided by engineer. */
"Decentralized" = "Децентрализованный";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "Ошибка расшифровки";
/* pref value */
"default (%@)" = "по умолчанию (%@)";
/* No comment provided by engineer. */
"default (no)" = "по умолчанию (нет)";
/* No comment provided by engineer. */
"default (yes)" = "по умолчанию (да)";
/* chat item action */
"Delete" = "Удалить";
@@ -1059,12 +1020,6 @@
/* rcv group event chat item */
"deleted group" = "удалил(а) группу";
/* No comment provided by engineer. */
"Delivery receipts are disabled!" = "Отчёты о доставке выключены!";
/* No comment provided by engineer. */
"Delivery receipts!" = "Отчёты о доставке!";
/* No comment provided by engineer. */
"Description" = "Описание";
@@ -1098,12 +1053,6 @@
/* No comment provided by engineer. */
"Direct messages between members are prohibited in this group." = "Прямые сообщения между членами группы запрещены.";
/* No comment provided by engineer. */
"Disable (keep overrides)" = "Выключить (кроме исключений)";
/* No comment provided by engineer. */
"Disable for all" = "Выключить для всех";
/* authentication reason */
"Disable SimpleX Lock" = "Отключить блокировку SimpleX";
@@ -1143,9 +1092,6 @@
/* No comment provided by engineer. */
"Don't create address" = "Не создавать адрес";
/* No comment provided by engineer. */
"Don't enable" = "Не включать";
/* No comment provided by engineer. */
"Don't show again" = "Не показывать";
@@ -1176,15 +1122,9 @@
/* No comment provided by engineer. */
"Enable" = "Включить";
/* No comment provided by engineer. */
"Enable (keep overrides)" = "Включить (кроме исключений)";
/* No comment provided by engineer. */
"Enable automatic message deletion?" = "Включить автоматическое удаление сообщений?";
/* No comment provided by engineer. */
"Enable for all" = "Включить для всех";
/* No comment provided by engineer. */
"Enable instant notifications?" = "Включить мгновенные уведомления?";
@@ -1245,30 +1185,6 @@
/* notification */
"Encrypted message: unexpected error" = "Зашифрованное сообщение: неожиданная ошибка";
/* chat item text */
"encryption agreed" = "шифрование согласовано";
/* chat item text */
"encryption agreed for %@" = "шифрование согласовано для %@";
/* chat item text */
"encryption ok" = "шифрование работает";
/* chat item text */
"encryption ok for %@" = "шифрование работает для %@";
/* chat item text */
"encryption re-negotiation allowed" = "новое соглашение о шифровании разрешено";
/* chat item text */
"encryption re-negotiation allowed for %@" = "новое соглашение о шифровании разрешено для %@";
/* chat item text */
"encryption re-negotiation required" = "требуется новое соглашение о шифровании";
/* chat item text */
"encryption re-negotiation required for %@" = "требуется новое соглашение о шифровании для %@";
/* No comment provided by engineer. */
"ended" = "завершён";
@@ -1302,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "Ошибка";
/* No comment provided by engineer. */
"Error aborting address change" = "Ошибка при прекращении изменения адреса";
/* No comment provided by engineer. */
"Error accepting contact request" = "Ошибка при принятии запроса на соединение";
@@ -1359,9 +1272,6 @@
/* No comment provided by engineer. */
"Error deleting user profile" = "Ошибка удаления профиля пользователя";
/* No comment provided by engineer. */
"Error enabling delivery receipts!" = "Ошибка при включении отчётов о доставке!";
/* No comment provided by engineer. */
"Error enabling notifications" = "Ошибка при включении уведомлений";
@@ -1410,9 +1320,6 @@
/* No comment provided by engineer. */
"Error sending message" = "Ошибка при отправке сообщения";
/* No comment provided by engineer. */
"Error setting delivery receipts!" = "Ошибка настроек отчётов о доставке!";
/* No comment provided by engineer. */
"Error starting chat" = "Ошибка при запуске чата";
@@ -1422,9 +1329,6 @@
/* No comment provided by engineer. */
"Error switching profile!" = "Ошибка выбора профиля!";
/* No comment provided by engineer. */
"Error synchronizing connection" = "Ошибка синхронизации соединения";
/* No comment provided by engineer. */
"Error updating group link" = "Ошибка обновления ссылки группы";
@@ -1449,9 +1353,6 @@
/* No comment provided by engineer. */
"Error: URL is invalid" = "Ошибка: неверная ссылка";
/* No comment provided by engineer. */
"Even when disabled in the conversation." = "Даже когда они выключены в разговоре.";
/* No comment provided by engineer. */
"Exit without saving" = "Выйти без сохранения";
@@ -1465,7 +1366,7 @@
"Exported database archive." = "Архив чата экспортирован.";
/* No comment provided by engineer. */
"Exporting database archive" = "Архив чата экспортируется";
"Exporting database archive..." = "Архив чата экспортируется...";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "Ошибка удаления пароля";
@@ -1473,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "Быстрые и не нужно ждать, когда отправитель онлайн!";
/* No comment provided by engineer. */
"Favorite" = "Избранный";
/* No comment provided by engineer. */
"File will be deleted from servers." = "Файл будет удалён с серверов.";
@@ -1491,42 +1389,9 @@
/* No comment provided by engineer. */
"Files & media" = "Файлы и медиа";
/* chat feature */
"Files and media" = "Файлы и медиа";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "Файлы и медиа запрещены в этой группе.";
/* No comment provided by engineer. */
"Files and media prohibited!" = "Файлы и медиа запрещены!";
/* No comment provided by engineer. */
"Filter unread and favorite chats." = "Фильтровать непрочитанные и избранные чаты.";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "Наконец-то, мы их добавили! 🚀";
/* No comment provided by engineer. */
"Find chats faster" = "Быстро найти чаты";
/* No comment provided by engineer. */
"Fix" = "Починить";
/* No comment provided by engineer. */
"Fix connection" = "Починить соединение";
/* No comment provided by engineer. */
"Fix connection?" = "Починить соединение?";
/* No comment provided by engineer. */
"Fix encryption after restoring backups." = "Починить шифрование после восстановления из бэкапа.";
/* No comment provided by engineer. */
"Fix not supported by contact" = "Починка не поддерживается контактом";
/* No comment provided by engineer. */
"Fix not supported by group member" = "Починка не поддерживается членом группы";
/* No comment provided by engineer. */
"For console" = "Для консоли";
@@ -1593,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "Члены группы могут посылать исчезающие сообщения.";
/* No comment provided by engineer. */
"Group members can send files and media." = "Члены группы могут слать файлы и медиа.";
/* No comment provided by engineer. */
"Group members can send voice messages." = "Члены группы могут отправлять голосовые сообщения.";
@@ -1719,9 +1581,6 @@
/* No comment provided by engineer. */
"Improved server configuration" = "Улучшенная конфигурация серверов";
/* copied message info */
"In reply to" = "В ответ на";
/* No comment provided by engineer. */
"Incognito" = "Инкогнито";
@@ -1875,9 +1734,6 @@
/* No comment provided by engineer. */
"Joining group" = "Вступление в группу";
/* No comment provided by engineer. */
"Keep your connections" = "Сохраните Ваши соединения";
/* No comment provided by engineer. */
"Keychain error" = "Ошибка Keychain";
@@ -1935,9 +1791,6 @@
/* No comment provided by engineer. */
"Make a private connection" = "Добавьте контакт";
/* No comment provided by engineer. */
"Make one message disappear" = "Одно исчезающее сообщение";
/* No comment provided by engineer. */
"Make profile private!" = "Сделайте профиль скрытым!";
@@ -1989,9 +1842,6 @@
/* No comment provided by engineer. */
"Message delivery error" = "Ошибка доставки сообщения";
/* No comment provided by engineer. */
"Message delivery receipts!" = "Отчеты о доставке сообщений!";
/* No comment provided by engineer. */
"Message draft" = "Черновик сообщения";
@@ -2017,7 +1867,7 @@
"Messages & files" = "Сообщения";
/* No comment provided by engineer. */
"Migrating database archive" = "Данные чата перемещаются";
"Migrating database archive..." = "Данные чата перемещаются...";
/* No comment provided by engineer. */
"Migration error:" = "Ошибка при перемещении данных:";
@@ -2136,24 +1986,15 @@
/* No comment provided by engineer. */
"no e2e encryption" = "нет e2e шифрования";
/* No comment provided by engineer. */
"No filtered chats" = "Нет отфильтрованных разговоров";
/* No comment provided by engineer. */
"No group!" = "Группа не найдена!";
/* No comment provided by engineer. */
"No history" = "Нет истории";
/* No comment provided by engineer. */
"No permission to record voice message" = "Нет разрешения для записи голосового сообщения";
/* No comment provided by engineer. */
"No received or sent files" = "Нет полученных или отправленных файлов";
/* copied message info in history */
"no text" = "нет текста";
/* No comment provided by engineer. */
"Notifications" = "Уведомления";
@@ -2212,9 +2053,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "Только владельцы группы могут изменять предпочтения группы.";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "Только владельцы группы могут разрешить файлы и медиа.";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "Только владельцы группы могут разрешить голосовые сообщения.";
@@ -2416,9 +2254,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "Запретить посылать исчезающие сообщения.";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "Запретить слать файлы и медиа.";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "Запретить отправлять голосовые сообщений.";
@@ -2431,9 +2266,6 @@
/* No comment provided by engineer. */
"Protocol timeout" = "Таймаут протокола";
/* No comment provided by engineer. */
"Protocol timeout per KB" = "Таймаут протокола на KB";
/* No comment provided by engineer. */
"Push notifications" = "Доставка уведомлений";
@@ -2441,7 +2273,7 @@
"Rate the app" = "Оценить приложение";
/* chat item menu */
"React" = "Реакция";
"React..." = "Реакция...";
/* No comment provided by engineer. */
"Read" = "Прочитано";
@@ -2479,9 +2311,6 @@
/* message info title */
"Received message" = "Полученное сообщение";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "Адрес получения сообщений будет перемещён на другой сервер. Изменение адреса завершится после того как отправитель будет онлайн.";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "Приём файла будет прекращён.";
@@ -2491,12 +2320,6 @@
/* No comment provided by engineer. */
"Recipients see updates as you type them." = "Получатели видят их в то время как Вы их набираете.";
/* No comment provided by engineer. */
"Reconnect all connected servers to force message delivery. It uses additional traffic." = "Повторно подключите все серверы, чтобы принудительно доставить сообщения. Используется дополнительный трафик.";
/* No comment provided by engineer. */
"Reconnect servers?" = "Переподключить серверы?";
/* No comment provided by engineer. */
"Record updated at" = "Запись обновлена";
@@ -2545,15 +2368,6 @@
/* rcv group event chat item */
"removed you" = "удалил(а) Вас из группы";
/* No comment provided by engineer. */
"Renegotiate" = "Пересогласовать";
/* No comment provided by engineer. */
"Renegotiate encryption" = "Пересогласовать шифрование";
/* No comment provided by engineer. */
"Renegotiate encryption?" = "Пересогласовать шифрование?";
/* chat item action */
"Reply" = "Ответить";
@@ -2692,9 +2506,6 @@
/* No comment provided by engineer. */
"Security code" = "Код безопасности";
/* chat item text */
"security code changed" = "код безопасности изменился";
/* No comment provided by engineer. */
"Select" = "Выбрать";
@@ -2716,9 +2527,6 @@
/* No comment provided by engineer. */
"Send a live message - it will update for the recipient(s) as you type it" = "Отправить живое сообщение — оно будет обновляться для получателей по мере того, как Вы его вводите";
/* No comment provided by engineer. */
"Send delivery receipts to" = "Отправка отчётов о доставке";
/* No comment provided by engineer. */
"Send direct message" = "Отправить сообщение";
@@ -2740,9 +2548,6 @@
/* No comment provided by engineer. */
"Send questions and ideas" = "Отправьте вопросы и идеи";
/* No comment provided by engineer. */
"Send receipts" = "Отправлять отчёты о доставке";
/* No comment provided by engineer. */
"Send them from gallery or custom keyboards." = "Отправьте из галереи или из дополнительных клавиатур.";
@@ -2752,21 +2557,9 @@
/* No comment provided by engineer. */
"Sender may have deleted the connection request." = "Отправитель мог удалить запрос на соединение.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Отправка отчётов о доставке будет включена для всех контактов во всех видимых профилях чата.";
/* No comment provided by engineer. */
"Sending delivery receipts will be enabled for all contacts." = "Отправка отчётов о доставке будет включена для всех контактов.";
/* No comment provided by engineer. */
"Sending file will be stopped." = "Отправка файла будет остановлена.";
/* No comment provided by engineer. */
"Sending receipts is disabled for %lld contacts" = "Отправка отчётов о доставке выключена для %lld контактов";
/* No comment provided by engineer. */
"Sending receipts is enabled for %lld contacts" = "Отправка отчётов о доставке включена для %lld контактов";
/* No comment provided by engineer. */
"Sending via" = "Отправка через";
@@ -2902,9 +2695,6 @@
/* No comment provided by engineer. */
"SMP servers" = "SMP серверы";
/* No comment provided by engineer. */
"Some non-fatal errors occurred during import - you may see Chat console for more details." = "Во время импорта произошли некоторые ошибки - для получения более подробной информации вы можете обратиться к консоли.";
/* notification title */
"Somebody" = "Контакт";
@@ -3034,9 +2824,6 @@
/* No comment provided by engineer. */
"The created archive is available via app Settings / Database / Old database archive." = "Созданный архив доступен через Настройки приложения.";
/* No comment provided by engineer. */
"The encryption is working and the new encryption agreement is not required. It may result in connection errors!" = "Шифрование работает, и новое соглашение не требуется. Это может привести к ошибкам соединения!";
/* No comment provided by engineer. */
"The group is fully decentralized it is visible only to the members." = "Группа полностью децентрализована — она видна только членам.";
@@ -3061,9 +2848,6 @@
/* No comment provided by engineer. */
"The profile is only shared with your contacts." = "Профиль отправляется только Вашим контактам.";
/* No comment provided by engineer. */
"The second tick we missed! ✅" = "Вторая галочка - знать, что доставлено! ✅";
/* No comment provided by engineer. */
"The sender will NOT be notified" = "Отправитель не будет уведомлён";
@@ -3079,12 +2863,6 @@
/* No comment provided by engineer. */
"There should be at least one visible user profile." = "Должен быть хотя бы один открытый профиль пользователя.";
/* No comment provided by engineer. */
"These settings are for your current profile **%@**." = "Установки для Вашего активного профиля **%@**.";
/* No comment provided by engineer. */
"They can be overridden in contact settings" = "Они могут быть переопределены в настройках контактов";
/* No comment provided by engineer. */
"This action cannot be undone - all received and sent files and media will be deleted. Low resolution pictures will remain." = "Это действие нельзя отменить — все полученные и отправленные файлы будут удалены. Изображения останутся в низком разрешении.";
@@ -3097,6 +2875,9 @@
/* notification title */
"this contact" = "этот контакт";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "Эта ошибка постоянная для этого соединения, пожалуйста, соединитесь снова.";
/* No comment provided by engineer. */
"This group no longer exists." = "Эта группа больше не существует.";
@@ -3163,9 +2944,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "Неожиданная ошибка при перемещении данных чата";
/* No comment provided by engineer. */
"Unfav." = "Не избр.";
/* No comment provided by engineer. */
"Unhide" = "Раскрыть";
@@ -3418,12 +3196,6 @@
/* No comment provided by engineer. */
"You can create it later" = "Вы можете создать его позже";
/* No comment provided by engineer. */
"You can enable later via Settings" = "Вы можете включить их позже в Настройках";
/* No comment provided by engineer. */
"You can enable them later via app Privacy & Security settings." = "Вы можете включить их позже в настройках Конфиденциальности.";
/* No comment provided by engineer. */
"You can hide or mute a user profile - swipe it to the right." = "Вы можете скрыть профиль или выключить уведомления - потяните его вправо.";

View File

@@ -247,15 +247,6 @@
/* No comment provided by engineer. */
"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." = "每个联系人和群成员将使用一个独立的 TCP 连接。\n请注意如果您有许多连接将会消耗更多的电量和流量并且某些连接可能会失败。";
/* No comment provided by engineer. */
"Abort" = "中止";
/* No comment provided by engineer. */
"Abort changing address" = "中止地址更改";
/* No comment provided by engineer. */
"Abort changing address?" = "中止地址更改?";
/* No comment provided by engineer. */
"About SimpleX" = "关于SimpleX";
@@ -311,9 +302,6 @@
/* No comment provided by engineer. */
"Address" = "地址";
/* No comment provided by engineer. */
"Address change will be aborted. Old receiving address will be used." = "将中止地址更改。将使用旧接收地址。";
/* member role */
"admin" = "管理员";
@@ -371,9 +359,6 @@
/* No comment provided by engineer. */
"Allow to irreversibly delete sent messages." = "允许不可撤回地删除已发送消息。";
/* No comment provided by engineer. */
"Allow to send files and media." = "允许发送文件和媒体。";
/* No comment provided by engineer. */
"Allow to send voice messages." = "允许发送语音消息。";
@@ -441,7 +426,7 @@
"Audio & video calls" = "语音和视频通话";
/* No comment provided by engineer. */
"Audio and video calls" = "语音和视频通话";
"Audio and video calls" = "视频通话";
/* No comment provided by engineer. */
"audio call (not e2e encrypted)" = "语音通话(非端到端加密)";
@@ -588,6 +573,12 @@
/* rcv group event chat item */
"changed your role to %@" = "更改您的角色为 %@";
/* chat item text */
"changing address for %@..." = "更改 %@... 的地址中";
/* chat item text */
"changing address..." = "更改地址中……";
/* No comment provided by engineer. */
"Chat archive" = "聊天档案";
@@ -906,7 +897,7 @@
/* No comment provided by engineer. */
"Decentralized" = "分散式";
/* message decrypt error item */
/* No comment provided by engineer. */
"Decryption error" = "解密错误";
/* pref value */
@@ -1227,9 +1218,6 @@
/* No comment provided by engineer. */
"Error" = "错误";
/* No comment provided by engineer. */
"Error aborting address change" = "中止地址更改错误";
/* No comment provided by engineer. */
"Error accepting contact request" = "接受联系人请求错误";
@@ -1378,7 +1366,7 @@
"Exported database archive." = "导出数据库归档。";
/* No comment provided by engineer. */
"Exporting database archive" = "导出数据库档案中…";
"Exporting database archive..." = "导出数据库档案中…";
/* No comment provided by engineer. */
"Failed to remove passphrase" = "移除密码失败";
@@ -1386,9 +1374,6 @@
/* No comment provided by engineer. */
"Fast and no wait until the sender is online!" = "快速且无需等待发件人在线!";
/* No comment provided by engineer. */
"Favorite" = "最喜欢";
/* No comment provided by engineer. */
"File will be deleted from servers." = "文件将从服务器中删除。";
@@ -1404,15 +1389,6 @@
/* No comment provided by engineer. */
"Files & media" = "文件和媒体";
/* chat feature */
"Files and media" = "文件和媒体";
/* No comment provided by engineer. */
"Files and media are prohibited in this group." = "此群组中禁止文件和媒体。";
/* No comment provided by engineer. */
"Files and media prohibited!" = "禁止文件和媒体!";
/* No comment provided by engineer. */
"Finally, we have them! 🚀" = "终于我们有它们了! 🚀";
@@ -1482,9 +1458,6 @@
/* No comment provided by engineer. */
"Group members can send disappearing messages." = "群组成员可以发送限时消息。";
/* No comment provided by engineer. */
"Group members can send files and media." = "群组成员可以发送文件和媒体。";
/* No comment provided by engineer. */
"Group members can send voice messages." = "群组成员可以发送语音消息。";
@@ -1759,7 +1732,7 @@
"Join incognito" = "加入隐身聊天";
/* No comment provided by engineer. */
"Joining group" = "加入群组";
"Joining group" = "加入群组";
/* No comment provided by engineer. */
"Keychain error" = "钥匙串错误";
@@ -1894,7 +1867,7 @@
"Messages & files" = "消息";
/* No comment provided by engineer. */
"Migrating database archive" = "迁移数据库档案中…";
"Migrating database archive..." = "迁移数据库档案中…";
/* No comment provided by engineer. */
"Migration error:" = "迁移错误:";
@@ -2013,9 +1986,6 @@
/* No comment provided by engineer. */
"no e2e encryption" = "无端到端加密";
/* No comment provided by engineer. */
"No filtered chats" = "无过滤聊天";
/* No comment provided by engineer. */
"No group!" = "未找到群组!";
@@ -2086,9 +2056,6 @@
/* No comment provided by engineer. */
"Only group owners can change group preferences." = "只有群主可以改变群组偏好设置。";
/* No comment provided by engineer. */
"Only group owners can enable files and media." = "只有组主可以启用文件和媒体。";
/* No comment provided by engineer. */
"Only group owners can enable voice messages." = "只有群主可以启用语音信息。";
@@ -2290,9 +2257,6 @@
/* No comment provided by engineer. */
"Prohibit sending disappearing messages." = "禁止发送限时消息。";
/* No comment provided by engineer. */
"Prohibit sending files and media." = "禁止发送文件和媒体。";
/* No comment provided by engineer. */
"Prohibit sending voice messages." = "禁止发送语音消息。";
@@ -2311,6 +2275,9 @@
/* No comment provided by engineer. */
"Rate the app" = "评价此应用程序";
/* chat item menu */
"React..." = "回应……";
/* No comment provided by engineer. */
"Read" = "已读";
@@ -2347,9 +2314,6 @@
/* message info title */
"Received message" = "收到的信息";
/* No comment provided by engineer. */
"Receiving address will be changed to a different server. Address change will complete after sender comes online." = "接收地址将变更到不同的服务器。地址更改将在发件人上线后完成。";
/* No comment provided by engineer. */
"Receiving file will be stopped." = "即将停止接收文件。";
@@ -2917,6 +2881,9 @@
/* notification title */
"this contact" = "这个联系人";
/* No comment provided by engineer. */
"This error is permanent for this connection, please re-connect." = "此错误对于此连接是永久性的,请重新连接。";
/* No comment provided by engineer. */
"This group no longer exists." = "该群组已不存在。";
@@ -2983,9 +2950,6 @@
/* No comment provided by engineer. */
"Unexpected migration state" = "未预料的迁移状态";
/* No comment provided by engineer. */
"Unfav." = "取消最喜欢";
/* No comment provided by engineer. */
"Unhide" = "取消隐藏";

View File

@@ -11,7 +11,8 @@
local.properties
common/src/commonMain/cpp/android/libs/
common/src/commonMain/cpp/desktop/libs/
desktop/src/jvmMain/resources/libs/
common/src/commonMain/resources/libs/
android/src/main/cpp/libs/
android/build
android/release
common/build

View File

@@ -0,0 +1,243 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.serialization'
}
android {
compileSdk 33
defaultConfig {
applicationId "chat.simplex.app"
minSdk 26
targetSdk 33
// !!!
// skip version code after release to F-Droid, as it uses two version codes
versionCode 129
versionName "5.2-beta.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
externalNativeBuild {
cmake {
cppFlags ''
}
}
manifestPlaceholders.app_name = "@string/app_name"
manifestPlaceholders.provider_authorities = "chat.simplex.app.provider"
manifestPlaceholders.extract_native_libs = compression_level != "0"
}
buildTypes {
debug {
applicationIdSuffix "$application_id_suffix"
debuggable new Boolean("$enable_debuggable")
manifestPlaceholders.app_name = "$app_name"
// Provider can't be the same for different apps on the same device
manifestPlaceholders.provider_authorities = "chat.simplex.app${application_id_suffix}.provider"
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
freeCompilerArgs += "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi"
freeCompilerArgs += "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi"
freeCompilerArgs += "-opt-in=androidx.compose.ui.text.ExperimentalTextApi"
freeCompilerArgs += "-opt-in=androidx.compose.material.ExperimentalMaterialApi"
freeCompilerArgs += "-opt-in=com.google.accompanist.insets.ExperimentalAnimatedInsets"
freeCompilerArgs += "-opt-in=com.google.accompanist.permissions.ExperimentalPermissionsApi"
freeCompilerArgs += "-opt-in=kotlinx.serialization.InternalSerializationApi"
freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi"
}
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
}
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion compose_version
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
jniLibs.useLegacyPackaging = compression_level != "0"
}
def isRelease = gradle.getStartParameter().taskNames.find({ it.toLowerCase().contains("release") }) != null
def isBundle = gradle.getStartParameter().taskNames.find({ it.toLowerCase().contains("bundle") }) != null
// if (isRelease) {
// Comma separated list of languages that will be included in the apk
android.defaultConfig.resConfigs(
"en",
"cs",
"de",
"es",
"fr",
"it",
"ja",
"nl",
"pl",
"pt-rBR",
"ru",
"zh-rCN"
)
// }
if (isBundle) {
defaultConfig.ndk.abiFilters 'arm64-v8a', 'armeabi-v7a'
} else {
splits {
abi {
enable true
reset()
if (isRelease) {
include 'arm64-v8a', 'armeabi-v7a'
} else {
include 'arm64-v8a', 'armeabi-v7a'
universalApk false
}
}
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-process:2.4.1'
implementation 'androidx.activity:activity-compose:1.4.0'
implementation 'androidx.fragment:fragment:1.4.1'
implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.3.2'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'
implementation 'com.charleskorn.kaml:kaml:0.43.0'
//implementation "androidx.compose.material:material-icons-extended:$compose_version"
implementation "androidx.compose.ui:ui-util:$compose_version"
implementation "androidx.navigation:navigation-compose:2.4.1"
implementation "com.google.accompanist:accompanist-insets:0.23.0"
implementation 'androidx.webkit:webkit:1.4.0'
implementation "com.godaddy.android.colorpicker:compose-color-picker:0.4.2"
def work_version = "2.7.1"
implementation "androidx.work:work-runtime-ktx:$work_version"
implementation "androidx.work:work-multiprocess:$work_version"
def camerax_version = "1.1.0-beta01"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
//Barcode
implementation 'org.boofcv:boofcv-android:0.40.1'
implementation 'org.boofcv:boofcv-core:0.40.1'
//Camera Permission
implementation "com.google.accompanist:accompanist-permissions:0.23.0"
implementation "com.google.accompanist:accompanist-pager:0.25.1"
// Link Previews
implementation 'org.jsoup:jsoup:1.13.1'
// Biometric authentication
implementation 'androidx.biometric:biometric:1.2.0-alpha04'
// GIFs support
implementation "io.coil-kt:coil-compose:2.1.0"
implementation "io.coil-kt:coil-gif:2.1.0"
// Video support
implementation "com.google.android.exoplayer:exoplayer:2.17.1"
// Wheel picker
implementation 'com.github.zj565061763:compose-wheel-picker:1.0.0-alpha10'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
implementation "com.jakewharton:process-phoenix:2.1.2"
}
// Don't do anything if no compression is needed
if (compression_level != "0") {
tasks.whenTaskAdded { task ->
if (task.name == 'packageDebug') {
task.finalizedBy compressApk
} else if (task.name == 'packageRelease') {
task.finalizedBy compressApk
}
}
}
tasks.register("compressApk") {
doLast {
def isRelease = gradle.getStartParameter().taskNames.find({ it.toLowerCase().contains("release") }) != null
def buildType
if (isRelease) {
buildType = "release"
} else {
buildType = "debug"
}
def javaHome = System.properties['java.home'] ?: org.gradle.internal.jvm.Jvm.current().getJavaHome()
def sdkDir = android.getSdkDirectory().getAbsolutePath()
def keyAlias = ""
def keyPassword = ""
def storeFile = ""
def storePassword = ""
if (project.properties['android.injected.signing.key.alias'] != null) {
keyAlias = project.properties['android.injected.signing.key.alias']
keyPassword = project.properties['android.injected.signing.key.password']
storeFile = project.properties['android.injected.signing.store.file']
storePassword = project.properties['android.injected.signing.store.password']
} else if (android.signingConfigs.hasProperty(buildType)) {
def gradleConfig = android.signingConfigs[buildType]
keyAlias = gradleConfig.keyAlias
keyPassword = gradleConfig.keyPassword
storeFile = gradleConfig.storeFile
storePassword = gradleConfig.storePassword
} else {
// There is no signing config for current build type, can't sign the apk
println("No signing configs for this build type: $buildType")
return
}
def outputDir = tasks["package${buildType.capitalize()}"].outputs.files.last()
exec {
workingDir '../../../scripts/android'
setEnvironment(['JAVA_HOME': "$javaHome"])
commandLine './compress-and-sign-apk.sh', \
"$compression_level", \
"$outputDir", \
"$sdkDir", \
"$storeFile", \
"$storePassword", \
"$keyAlias", \
"$keyPassword"
}
if (project.properties['android.injected.signing.key.alias'] != null && buildType == 'release') {
new File(outputDir, "android-release.apk").renameTo(new File(outputDir, "simplex.apk"))
new File(outputDir, "android-armeabi-v7a-release.apk").renameTo(new File(outputDir, "simplex-armv7a.apk"))
new File(outputDir, "android-arm64-v8a-release.apk").renameTo(new File(outputDir, "simplex.apk"))
}
// View all gradle properties set
// project.properties.each { k, v -> println "$k -> $v" }
}
}

View File

@@ -1,213 +0,0 @@
@file:Suppress("UnstableApiUsage")
plugins {
id("com.android.application")
id("org.jetbrains.compose")
kotlin("android")
id("org.jetbrains.kotlin.plugin.serialization")
}
android {
compileSdkVersion(33)
defaultConfig {
applicationId = "chat.simplex.app"
minSdkVersion(26)
targetSdkVersion(33)
// !!!
// skip version code after release to F-Droid, as it uses two version codes
versionCode = (extra["android.version_code"] as String).toInt()
versionName = extra["android.version_name"] as String
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
externalNativeBuild {
cmake {
cppFlags("")
}
}
manifestPlaceholders["app_name"] = "@string/app_name"
manifestPlaceholders["provider_authorities"] = "chat.simplex.app.provider"
manifestPlaceholders["extract_native_libs"] = rootProject.extra["compression.level"] as Int != 0
}
buildTypes {
debug {
applicationIdSuffix = rootProject.extra["application_id.suffix"] as String
isDebuggable = rootProject.extra["enable_debuggable"] as Boolean
manifestPlaceholders["app_name"] = rootProject.extra["app.name"] as String
// Provider can"t be the same for different apps on the same device
manifestPlaceholders["provider_authorities"] = "chat.simplex.app${rootProject.extra["application_id.suffix"]}.provider"
}
release {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi"
freeCompilerArgs += "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi"
freeCompilerArgs += "-opt-in=androidx.compose.ui.text.ExperimentalTextApi"
freeCompilerArgs += "-opt-in=androidx.compose.material.ExperimentalMaterialApi"
freeCompilerArgs += "-opt-in=com.google.accompanist.insets.ExperimentalAnimatedInsets"
freeCompilerArgs += "-opt-in=com.google.accompanist.permissions.ExperimentalPermissionsApi"
freeCompilerArgs += "-opt-in=kotlinx.serialization.InternalSerializationApi"
freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi"
}
externalNativeBuild {
cmake {
path(File("../common/src/commonMain/cpp/android/CMakeLists.txt"))
}
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
packagingOptions {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
jniLibs.useLegacyPackaging = rootProject.extra["compression.level"] as Int != 0
}
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
val isBundle = gradle.startParameter.taskNames.find { it.toLowerCase().contains("bundle") } != null
// if (isRelease) {
// Comma separated list of languages that will be included in the apk
android.defaultConfig.resConfigs(
"en",
"cs",
"de",
"es",
"fr",
"it",
"ja",
"nl",
"pl",
"pt-rBR",
"ru",
"zh-rCN"
)
// }
if (isBundle) {
defaultConfig.ndk.abiFilters("arm64-v8a", "armeabi-v7a")
} else {
splits {
abi {
isEnable = true
reset()
if (isRelease) {
include("arm64-v8a", "armeabi-v7a")
} else {
include("arm64-v8a", "armeabi-v7a")
isUniversalApk = false
}
}
}
}
}
dependencies {
implementation(project(":common"))
implementation("androidx.core:core-ktx:1.7.0")
//implementation("androidx.compose.ui:ui:${rootProject.extra["compose.version"] as String}")
//implementation("androidx.compose.material:material:$compose_version")
//implementation("androidx.compose.ui:ui-tooling-preview:$compose_version")
implementation("androidx.appcompat:appcompat:1.5.1")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1")
implementation("androidx.lifecycle:lifecycle-process:2.4.1")
implementation("androidx.activity:activity-compose:1.5.0")
val work_version = "2.7.1"
implementation("androidx.work:work-runtime-ktx:$work_version")
implementation("androidx.work:work-multiprocess:$work_version")
implementation("com.jakewharton:process-phoenix:2.1.2")
//implementation("androidx.compose.material:material-icons-extended:$compose_version")
//implementation("androidx.compose.ui:ui-util:$compose_version")
implementation("com.google.accompanist:accompanist-pager:0.25.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
//androidTestImplementation("androidx.compose.ui:ui-test-junit4:$compose_version")
debugImplementation("androidx.compose.ui:ui-tooling:${rootProject.extra["compose.version"] as String}")
}
tasks {
val compressApk by creating {
doLast {
val isRelease = gradle.startParameter.taskNames.find { it.toLowerCase().contains("release") } != null
val buildType: String = if (isRelease) "release" else "debug"
val javaHome = System.getProperties()["java.home"] ?: org.gradle.internal.jvm.Jvm.current().javaHome
val sdkDir = android.sdkDirectory.absolutePath
var keyAlias = ""
var keyPassword = ""
var storeFile = ""
var storePassword = ""
if (project.properties["android.injected.signing.key.alias"] != null) {
keyAlias = project.properties["android.injected.signing.key.alias"] as String
keyPassword = project.properties["android.injected.signing.key.password"] as String
storeFile = project.properties["android.injected.signing.store.file"] as String
storePassword = project.properties["android.injected.signing.store.password"] as String
} else {
try {
val gradleConfig = android.signingConfigs.getByName(buildType)
keyAlias = gradleConfig.keyAlias!!
keyPassword = gradleConfig.keyPassword!!
storeFile = gradleConfig.storeFile!!.absolutePath
storePassword = gradleConfig.storePassword!!
} catch (e: UnknownDomainObjectException) {
// There is no signing config for current build type, can"t sign the apk
println("No signing configs for this build type: $buildType")
return@doLast
}
}
lateinit var outputDir: File
named(if (isRelease) "packageRelease" else "packageDebug") {
outputDir = outputs.files.files.last()
}
exec {
workingDir("../../../scripts/android")
setEnvironment(mapOf("JAVA_HOME" to "$javaHome"))
commandLine = listOf(
"./compress-and-sign-apk.sh",
"${rootProject.extra["compression.level"]}",
"$outputDir",
"$sdkDir",
"$storeFile",
"$storePassword",
"$keyAlias",
"$keyPassword"
)
}
if (project.properties["android.injected.signing.key.alias"] != null && buildType == "release") {
File(outputDir, "android-release.apk").renameTo(File(outputDir, "simplex.apk"))
File(outputDir, "android-armeabi-v7a-release.apk").renameTo(File(outputDir, "simplex-armv7a.apk"))
File(outputDir, "android-arm64-v8a-release.apk").renameTo(File(outputDir, "simplex.apk"))
}
// View all gradle properties set
// project.properties.each { k, v -> println "$k -> $v" }
}
}
// Don"t do anything if no compression is needed
if (rootProject.extra["compression.level"] as Int != 0) {
whenTaskAdded {
if (name == "packageDebug") {
finalizedBy(compressApk)
} else if (name == "packageRelease") {
finalizedBy(compressApk)
}
}
}
}

View File

@@ -64,4 +64,4 @@ target_link_libraries( # Specifies the target library.
# Links the target library to the log library
# included in the NDK.
${log-lib})
${log-lib})

View File

@@ -1,7 +1,4 @@
#include <jni.h>
//#include <string.h>
//#include <stdlib.h>
//#include <android/log.h>
// from the RTS
void hs_init(int * argc, char **argv[]);
@@ -22,7 +19,7 @@ extern void __rel_iplt_start(void){};
extern void reallocarray(void){};
JNIEXPORT jint JNICALL
Java_chat_simplex_common_platform_CoreKt_pipeStdOutToSocket(JNIEnv *env, __unused jclass clazz, jstring socket_name) {
Java_chat_simplex_app_SimplexAppKt_pipeStdOutToSocket(JNIEnv *env, __unused jclass clazz, jstring socket_name) {
const char *name = (*env)->GetStringUTFChars(env, socket_name, JNI_FALSE);
int ret = pipe_std_to_socket(name);
(*env)->ReleaseStringUTFChars(env, socket_name, name);
@@ -30,7 +27,7 @@ Java_chat_simplex_common_platform_CoreKt_pipeStdOutToSocket(JNIEnv *env, __unuse
}
JNIEXPORT void JNICALL
Java_chat_simplex_common_platform_CoreKt_initHS(__unused JNIEnv *env, __unused jclass clazz) {
Java_chat_simplex_app_SimplexAppKt_initHS(__unused JNIEnv *env, __unused jclass clazz) {
hs_init(NULL, NULL);
setLineBuffering();
}
@@ -47,7 +44,7 @@ extern char *chat_parse_server(const char *str);
extern char *chat_password_hash(const char *pwd, const char *salt);
JNIEXPORT jobjectArray JNICALL
Java_chat_simplex_common_platform_CoreKt_chatMigrateInit(JNIEnv *env, __unused jclass clazz, jstring dbPath, jstring dbKey, jstring confirm) {
Java_chat_simplex_app_SimplexAppKt_chatMigrateInit(JNIEnv *env, __unused jclass clazz, jstring dbPath, jstring dbKey, jstring confirm) {
const char *_dbPath = (*env)->GetStringUTFChars(env, dbPath, JNI_FALSE);
const char *_dbKey = (*env)->GetStringUTFChars(env, dbKey, JNI_FALSE);
const char *_confirm = (*env)->GetStringUTFChars(env, confirm, JNI_FALSE);
@@ -70,28 +67,25 @@ Java_chat_simplex_common_platform_CoreKt_chatMigrateInit(JNIEnv *env, __unused j
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatSendCmd(JNIEnv *env, __unused jclass clazz, jlong controller, jstring msg) {
Java_chat_simplex_app_SimplexAppKt_chatSendCmd(JNIEnv *env, __unused jclass clazz, jlong controller, jstring msg) {
const char *_msg = (*env)->GetStringUTFChars(env, msg, JNI_FALSE);
//jint length = (jint) (*env)->GetStringUTFLength(env, msg);
//for (int i = 0; i < length; ++i)
// __android_log_print(ANDROID_LOG_ERROR, "simplex", "%d: %02x\n", i, _msg[i]);
jstring res = (*env)->NewStringUTF(env, chat_send_cmd((void*)controller, _msg));
(*env)->ReleaseStringUTFChars(env, msg, _msg);
return res;
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatRecvMsg(JNIEnv *env, __unused jclass clazz, jlong controller) {
Java_chat_simplex_app_SimplexAppKt_chatRecvMsg(JNIEnv *env, __unused jclass clazz, jlong controller) {
return (*env)->NewStringUTF(env, chat_recv_msg((void*)controller));
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatRecvMsgWait(JNIEnv *env, __unused jclass clazz, jlong controller, jint wait) {
Java_chat_simplex_app_SimplexAppKt_chatRecvMsgWait(JNIEnv *env, __unused jclass clazz, jlong controller, jint wait) {
return (*env)->NewStringUTF(env, chat_recv_msg_wait((void*)controller, wait));
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatParseMarkdown(JNIEnv *env, __unused jclass clazz, jstring str) {
Java_chat_simplex_app_SimplexAppKt_chatParseMarkdown(JNIEnv *env, __unused jclass clazz, jstring str) {
const char *_str = (*env)->GetStringUTFChars(env, str, JNI_FALSE);
jstring res = (*env)->NewStringUTF(env, chat_parse_markdown(_str));
(*env)->ReleaseStringUTFChars(env, str, _str);
@@ -99,7 +93,7 @@ Java_chat_simplex_common_platform_CoreKt_chatParseMarkdown(JNIEnv *env, __unused
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatParseServer(JNIEnv *env, __unused jclass clazz, jstring str) {
Java_chat_simplex_app_SimplexAppKt_chatParseServer(JNIEnv *env, __unused jclass clazz, jstring str) {
const char *_str = (*env)->GetStringUTFChars(env, str, JNI_FALSE);
jstring res = (*env)->NewStringUTF(env, chat_parse_server(_str));
(*env)->ReleaseStringUTFChars(env, str, _str);
@@ -107,7 +101,7 @@ Java_chat_simplex_common_platform_CoreKt_chatParseServer(JNIEnv *env, __unused j
}
JNIEXPORT jstring JNICALL
Java_chat_simplex_common_platform_CoreKt_chatPasswordHash(JNIEnv *env, __unused jclass clazz, jstring pwd, jstring salt) {
Java_chat_simplex_app_SimplexAppKt_chatPasswordHash(JNIEnv *env, __unused jclass clazz, jstring pwd, jstring salt) {
const char *_pwd = (*env)->GetStringUTFChars(env, pwd, JNI_FALSE);
const char *_salt = (*env)->GetStringUTFChars(env, salt, JNI_FALSE);
jstring res = (*env)->NewStringUTF(env, chat_password_hash(_pwd, _salt));

View File

@@ -3,8 +3,8 @@ package chat.simplex.app
import android.app.backup.BackupAgentHelper
import android.app.backup.FullBackupDataOutput
import android.content.Context
import chat.simplex.common.model.AppPreferences
import chat.simplex.common.model.AppPreferences.Companion.SHARED_PREFS_PRIVACY_FULL_BACKUP
import chat.simplex.app.model.AppPreferences
import chat.simplex.app.model.AppPreferences.Companion.SHARED_PREFS_PRIVACY_FULL_BACKUP
class BackupAgent: BackupAgentHelper() {
override fun onFullBackup(data: FullBackupDataOutput?) {

View File

@@ -1,40 +1,81 @@
package chat.simplex.app
import android.app.Application
import android.content.Intent
import android.net.Uri
import android.os.*
import android.os.SystemClock.elapsedRealtime
import android.util.Log
import android.view.WindowManager
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.animation.core.*
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.fragment.app.FragmentActivity
import chat.simplex.app.model.NtfManager
import chat.simplex.app.model.NtfManager.getUserIdFromIntent
import chat.simplex.common.*
import chat.simplex.common.helpers.*
import chat.simplex.common.model.*
import chat.simplex.common.ui.theme.*
import chat.simplex.common.views.chatlist.*
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.*
import chat.simplex.common.platform.*
import chat.simplex.res.MR
import androidx.lifecycle.*
import chat.simplex.app.MainActivity.Companion.enteredBackground
import chat.simplex.app.model.*
import chat.simplex.app.model.NtfManager.Companion.getUserIdFromIntent
import chat.simplex.app.ui.theme.*
import chat.simplex.app.views.SplashView
import chat.simplex.app.views.call.ActiveCallView
import chat.simplex.app.views.call.IncomingCallAlertView
import chat.simplex.app.views.chat.ChatView
import chat.simplex.app.views.chat.group.ProgressIndicator
import chat.simplex.app.views.chatlist.*
import chat.simplex.app.views.database.DatabaseErrorView
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.helpers.DatabaseUtils.ksAppPassword
import chat.simplex.app.views.helpers.DatabaseUtils.ksSelfDestructPassword
import chat.simplex.app.views.localauth.SetAppPasscodeView
import chat.simplex.app.views.newchat.*
import chat.simplex.app.views.onboarding.*
import chat.simplex.app.views.usersettings.LAMode
import kotlinx.coroutines.*
import java.lang.ref.WeakReference
import kotlinx.coroutines.flow.distinctUntilChanged
class MainActivity: FragmentActivity() {
companion object {
/**
* We don't want these values to be bound to Activity lifecycle since activities are changed often, for example, when a user
* clicks on new message in notification. In this case savedInstanceState will be null (this prevents restoring the values)
* See [SimplexService.onTaskRemoved] for another part of the logic which nullifies the values when app closed by the user
* */
val userAuthorized = mutableStateOf<Boolean?>(null)
val enteredBackground = mutableStateOf<Long?>(null)
// Remember result and show it after orientation change
private val laFailed = mutableStateOf(false)
fun clearAuthState() {
userAuthorized.value = null
enteredBackground.value = null
}
}
private val vm by viewModels<SimplexViewModel>()
private val destroyedAfterBackPress = mutableStateOf(false)
override fun onCreate(savedInstanceState: Bundle?) {
applyAppLocale(ChatModel.controller.appPrefs.appLanguage)
super.onCreate(savedInstanceState)
// testJson()
mainActivity = WeakReference(this)
val m = vm.chatModel
applyAppLocale(m.controller.appPrefs.appLanguage)
// When call ended and orientation changes, it re-process old intent, it's unneeded.
// Only needed to be processed on first creation of activity
if (savedInstanceState == null) {
processNotificationIntent(intent)
processIntent(intent)
processExternalIntent(intent)
processNotificationIntent(intent, m)
processIntent(intent, m)
processExternalIntent(intent, m)
}
if (ChatController.appPrefs.privacyProtectScreen.get()) {
if (m.controller.appPrefs.privacyProtectScreen.get()) {
Log.d(TAG, "onCreate: set FLAG_SECURE")
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
@@ -43,7 +84,17 @@ class MainActivity: FragmentActivity() {
}
setContent {
SimpleXTheme {
AppScreen()
Surface(color = MaterialTheme.colors.background) {
MainPage(
m,
userAuthorized,
laFailed,
destroyedAfterBackPress,
::runAuthenticate,
::setPerformLA,
showLANotice = { showLANotice(m.controller.appPrefs.laNoticeShown, this) }
)
}
}
}
SimplexApp.context.schedulePeriodicServiceRestartWorker()
@@ -52,29 +103,38 @@ class MainActivity: FragmentActivity() {
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
processIntent(intent)
processExternalIntent(intent)
processIntent(intent, vm.chatModel)
processExternalIntent(intent, vm.chatModel)
}
override fun onResume() {
super.onResume()
AppLock.recheckAuthState()
val enteredBackgroundVal = enteredBackground.value
val delay = vm.chatModel.controller.appPrefs.laLockDelay.get()
if (enteredBackgroundVal == null || elapsedRealtime() - enteredBackgroundVal >= delay * 1000) {
if (userAuthorized.value != false) {
/** [runAuthenticate] will be called in [MainPage] if needed. Making like this prevents double showing of passcode on start */
setAuthState()
} else if (!vm.chatModel.activeCallViewIsVisible.value) {
runAuthenticate()
}
}
}
override fun onPause() {
super.onPause()
/**
* When new activity is created after a click on notification, the old one receives onPause before
* recreation but receives onStop after recreation. So using both (onPause and onStop) to prevent
* unwanted multiple auth dialogs from [runAuthenticate]
* */
AppLock.appWasHidden()
* When new activity is created after a click on notification, the old one receives onPause before
* recreation but receives onStop after recreation. So using both (onPause and onStop) to prevent
* unwanted multiple auth dialogs from [runAuthenticate]
* */
enteredBackground.value = elapsedRealtime()
}
override fun onStop() {
super.onStop()
VideoPlayer.stopAll()
AppLock.appWasHidden()
enteredBackground.value = elapsedRealtime()
}
override fun onBackPressed() {
@@ -87,52 +147,481 @@ class MainActivity: FragmentActivity() {
super.onBackPressed()
}
if (!onBackPressedDispatcher.hasEnabledCallbacks() && ChatController.appPrefs.performLA.get()) {
if (!onBackPressedDispatcher.hasEnabledCallbacks() && vm.chatModel.controller.appPrefs.performLA.get()) {
// When pressed Back and there is no one wants to process the back event, clear auth state to force re-auth on launch
AppLock.clearAuthState()
AppLock.laFailed.value = true
AppLock.destroyedAfterBackPress.value = true
clearAuthState()
laFailed.value = true
destroyedAfterBackPress.value = true
}
if (!onBackPressedDispatcher.hasEnabledCallbacks()) {
// Drop shared content
SimplexApp.context.chatModel.sharedContent.value = null
}
}
private fun setAuthState() {
userAuthorized.value = !vm.chatModel.controller.appPrefs.performLA.get()
}
private fun runAuthenticate() {
val m = vm.chatModel
setAuthState()
if (userAuthorized.value == false) {
// To make Main thread free in order to allow to Compose to show blank view that hiding content underneath of it faster on slow devices
CoroutineScope(Dispatchers.Default).launch {
delay(50)
withContext(Dispatchers.Main) {
authenticate(
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_unlock)
else
generalGetString(R.string.la_enter_app_passcode),
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_log_in_using_credential)
else
generalGetString(R.string.auth_unlock),
selfDestruct = true,
this@MainActivity,
completed = { laResult ->
when (laResult) {
LAResult.Success ->
userAuthorized.value = true
is LAResult.Failed -> { /* Can be called multiple times on every failure */ }
is LAResult.Error -> {
laFailed.value = true
if (m.controller.appPrefs.laMode.get() == LAMode.PASSCODE) {
laFailedAlert()
}
}
is LAResult.Unavailable -> {
userAuthorized.value = true
m.performLA.value = false
m.controller.appPrefs.performLA.set(false)
laUnavailableTurningOffAlert()
}
}
}
)
}
}
}
}
private fun showLANotice(laNoticeShown: SharedPreference<Boolean>, activity: FragmentActivity) {
Log.d(TAG, "showLANotice")
if (!laNoticeShown.get()) {
laNoticeShown.set(true)
AlertManager.shared.showAlertDialog(
title = generalGetString(R.string.la_notice_title_simplex_lock),
text = generalGetString(R.string.la_notice_to_protect_your_information_turn_on_simplex_lock_you_will_be_prompted_to_complete_authentication_before_this_feature_is_enabled),
confirmText = generalGetString(R.string.la_notice_turn_on),
onConfirm = {
withBGApi { // to remove this call, change ordering of onConfirm call in AlertManager
showChooseLAMode(laNoticeShown, activity)
}
}
)
}
}
private fun showChooseLAMode(laNoticeShown: SharedPreference<Boolean>, activity: FragmentActivity) {
Log.d(TAG, "showLANotice")
laNoticeShown.set(true)
AlertManager.shared.showAlertDialogStacked(
title = generalGetString(R.string.la_lock_mode),
text = null,
confirmText = generalGetString(R.string.la_lock_mode_passcode),
dismissText = generalGetString(R.string.la_lock_mode_system),
onConfirm = {
AlertManager.shared.hideAlert()
setPasscode()
},
onDismiss = {
AlertManager.shared.hideAlert()
initialEnableLA(activity)
}
)
}
private fun initialEnableLA(activity: FragmentActivity) {
val m = vm.chatModel
val appPrefs = m.controller.appPrefs
m.controller.appPrefs.laMode.set(LAMode.SYSTEM)
authenticate(
generalGetString(R.string.auth_enable_simplex_lock),
generalGetString(R.string.auth_confirm_credential),
activity = activity,
completed = { laResult ->
when (laResult) {
LAResult.Success -> {
m.performLA.value = true
appPrefs.performLA.set(true)
laTurnedOnAlert()
}
is LAResult.Failed -> { /* Can be called multiple times on every failure */ }
is LAResult.Error -> {
m.performLA.value = false
appPrefs.performLA.set(false)
laFailedAlert()
}
is LAResult.Unavailable -> {
m.performLA.value = false
appPrefs.performLA.set(false)
m.showAdvertiseLAUnavailableAlert.value = true
}
}
}
)
}
private fun setPasscode() {
val chatModel = vm.chatModel
val appPrefs = chatModel.controller.appPrefs
ModalManager.shared.showCustomModal { close ->
Surface(Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
SetAppPasscodeView(
submit = {
chatModel.performLA.value = true
appPrefs.performLA.set(true)
appPrefs.laMode.set(LAMode.PASSCODE)
laTurnedOnAlert()
},
cancel = {
chatModel.performLA.value = false
appPrefs.performLA.set(false)
laPasscodeNotSetAlert()
},
close = close
)
}
}
}
private fun setPerformLA(on: Boolean, activity: FragmentActivity) {
vm.chatModel.controller.appPrefs.laNoticeShown.set(true)
if (on) {
enableLA(activity)
} else {
disableLA(activity)
}
}
private fun enableLA(activity: FragmentActivity) {
val m = vm.chatModel
authenticate(
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_enable_simplex_lock)
else
generalGetString(R.string.new_passcode),
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_confirm_credential)
else
"",
activity = activity,
completed = { laResult ->
val prefPerformLA = m.controller.appPrefs.performLA
when (laResult) {
LAResult.Success -> {
m.performLA.value = true
prefPerformLA.set(true)
laTurnedOnAlert()
}
is LAResult.Failed -> { /* Can be called multiple times on every failure */ }
is LAResult.Error -> {
m.performLA.value = false
prefPerformLA.set(false)
laFailedAlert()
}
is LAResult.Unavailable -> {
m.performLA.value = false
prefPerformLA.set(false)
laUnavailableInstructionAlert()
}
}
}
)
}
private fun disableLA(activity: FragmentActivity) {
val m = vm.chatModel
authenticate(
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_disable_simplex_lock)
else
generalGetString(R.string.la_enter_app_passcode),
if (m.controller.appPrefs.laMode.get() == LAMode.SYSTEM)
generalGetString(R.string.auth_confirm_credential)
else
generalGetString(R.string.auth_disable_simplex_lock),
activity = activity,
completed = { laResult ->
val prefPerformLA = m.controller.appPrefs.performLA
val selfDestructPref = m.controller.appPrefs.selfDestruct
when (laResult) {
LAResult.Success -> {
m.performLA.value = false
prefPerformLA.set(false)
ksAppPassword.remove()
selfDestructPref.set(false)
ksSelfDestructPassword.remove()
}
is LAResult.Failed -> { /* Can be called multiple times on every failure */ }
is LAResult.Error -> {
m.performLA.value = true
prefPerformLA.set(true)
laFailedAlert()
}
is LAResult.Unavailable -> {
m.performLA.value = false
prefPerformLA.set(false)
laUnavailableTurningOffAlert()
}
}
}
)
}
}
fun processNotificationIntent(intent: Intent?) {
class SimplexViewModel(application: Application): AndroidViewModel(application) {
val app = getApplication<SimplexApp>()
val chatModel = app.chatModel
}
@Composable
fun MainPage(
chatModel: ChatModel,
userAuthorized: MutableState<Boolean?>,
laFailed: MutableState<Boolean>,
destroyedAfterBackPress: MutableState<Boolean>,
runAuthenticate: () -> Unit,
setPerformLA: (Boolean, FragmentActivity) -> Unit,
showLANotice: () -> Unit
) {
var showChatDatabaseError by rememberSaveable {
mutableStateOf(chatModel.chatDbStatus.value != DBMigrationResult.OK && chatModel.chatDbStatus.value != null)
}
LaunchedEffect(chatModel.chatDbStatus.value) {
showChatDatabaseError = chatModel.chatDbStatus.value != DBMigrationResult.OK && chatModel.chatDbStatus.value != null
}
var showAdvertiseLAAlert by remember { mutableStateOf(false) }
LaunchedEffect(showAdvertiseLAAlert) {
if (
!chatModel.controller.appPrefs.laNoticeShown.get()
&& showAdvertiseLAAlert
&& chatModel.onboardingStage.value == OnboardingStage.OnboardingComplete
&& chatModel.chats.isNotEmpty()
&& chatModel.activeCallInvitation.value == null
) {
showLANotice()
}
}
LaunchedEffect(chatModel.showAdvertiseLAUnavailableAlert.value) {
if (chatModel.showAdvertiseLAUnavailableAlert.value) {
laUnavailableInstructionAlert()
}
}
LaunchedEffect(chatModel.clearOverlays.value) {
if (chatModel.clearOverlays.value) {
ModalManager.shared.closeModals()
chatModel.clearOverlays.value = false
}
}
@Composable
fun AuthView() {
Surface(color = MaterialTheme.colors.background) {
Box(
Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
SimpleButton(
stringResource(R.string.auth_unlock),
icon = painterResource(R.drawable.ic_lock),
click = {
laFailed.value = false
runAuthenticate()
}
)
}
}
}
Box {
val onboarding = chatModel.onboardingStage.value
val userCreated = chatModel.userCreated.value
var showInitializationView by remember { mutableStateOf(false) }
when {
chatModel.chatDbStatus.value == null && showInitializationView -> InitializationView()
showChatDatabaseError -> {
chatModel.chatDbStatus.value?.let {
DatabaseErrorView(chatModel.chatDbStatus, chatModel.controller.appPrefs)
}
}
onboarding == null || userCreated == null -> SplashView()
onboarding == OnboardingStage.OnboardingComplete && userCreated -> {
Box {
showAdvertiseLAAlert = true
BoxWithConstraints {
var currentChatId by rememberSaveable { mutableStateOf(chatModel.chatId.value) }
val offset = remember { Animatable(if (chatModel.chatId.value == null) 0f else maxWidth.value) }
Box(
Modifier
.graphicsLayer {
translationX = -offset.value.dp.toPx()
}
) {
val stopped = chatModel.chatRunning.value == false
if (chatModel.sharedContent.value == null)
ChatListView(chatModel, setPerformLA, stopped)
else
ShareListView(chatModel, stopped)
}
val scope = rememberCoroutineScope()
val onComposed: () -> Unit = {
scope.launch {
offset.animateTo(
if (chatModel.chatId.value == null) 0f else maxWidth.value,
chatListAnimationSpec()
)
if (offset.value == 0f) {
currentChatId = null
}
}
}
LaunchedEffect(Unit) {
launch {
snapshotFlow { chatModel.chatId.value }
.distinctUntilChanged()
.collect {
if (it != null) currentChatId = it
else onComposed()
}
}
}
Box (Modifier.graphicsLayer { translationX = maxWidth.toPx() - offset.value.dp.toPx() }) Box2@ {
currentChatId?.let {
ChatView(it, chatModel, onComposed)
}
}
}
}
}
onboarding == OnboardingStage.Step1_SimpleXInfo -> SimpleXInfo(chatModel, onboarding = true)
onboarding == OnboardingStage.Step2_CreateProfile -> CreateProfile(chatModel) {}
onboarding == OnboardingStage.Step3_CreateSimpleXAddress -> CreateSimpleXAddress(chatModel)
onboarding == OnboardingStage.Step4_SetNotificationsMode -> SetNotificationsMode(chatModel)
}
ModalManager.shared.showInView()
val unauthorized = remember { derivedStateOf { userAuthorized.value != true } }
if (unauthorized.value && !(chatModel.activeCallViewIsVisible.value && chatModel.showCallView.value)) {
LaunchedEffect(Unit) {
// With these constrains when user presses back button while on ChatList, activity destroys and shows auth request
// while the screen moves to a launcher. Detect it and prevent showing the auth
if (!(destroyedAfterBackPress.value && chatModel.controller.appPrefs.laMode.get() == LAMode.SYSTEM)) {
runAuthenticate()
}
}
if (chatModel.controller.appPrefs.performLA.get() && laFailed.value) {
AuthView()
} else {
SplashView()
}
} else if (chatModel.showCallView.value) {
ActiveCallView(chatModel)
}
ModalManager.shared.showPasscodeInView()
val invitation = chatModel.activeCallInvitation.value
if (invitation != null) IncomingCallAlertView(invitation, chatModel)
AlertManager.shared.showInView()
LaunchedEffect(Unit) {
delay(1000)
if (chatModel.chatDbStatus.value == null) {
showInitializationView = true
}
}
}
DisposableEffectOnRotate {
// When using lock delay = 0 and screen rotates, the app will be locked which is not useful.
// Let's prolong the unlocked period to 3 sec for screen rotation to take place
if (chatModel.controller.appPrefs.laLockDelay.get() == 0) {
enteredBackground.value = elapsedRealtime() + 3000
}
}
}
@Composable
private fun InitializationView() {
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
CircularProgressIndicator(
Modifier
.padding(bottom = DEFAULT_PADDING)
.size(30.dp),
color = MaterialTheme.colors.secondary,
strokeWidth = 2.5.dp
)
Text(stringResource(R.string.opening_database))
}
}
}
fun processNotificationIntent(intent: Intent?, chatModel: ChatModel) {
val userId = getUserIdFromIntent(intent)
when (intent?.action) {
NtfManager.OpenChatAction -> {
val chatId = intent.getStringExtra("chatId")
Log.d(TAG, "processNotificationIntent: OpenChatAction $chatId")
if (chatId != null) {
ntfManager.openChatAction(userId, chatId)
withBGApi {
awaitChatStartedIfNeeded(chatModel)
if (userId != null && userId != chatModel.currentUser.value?.userId && chatModel.currentUser.value != null) {
chatModel.controller.changeActiveUser(userId, null)
}
val cInfo = chatModel.getChat(chatId)?.chatInfo
chatModel.clearOverlays.value = true
if (cInfo != null && (cInfo is ChatInfo.Direct || cInfo is ChatInfo.Group)) openChat(cInfo, chatModel)
}
}
}
NtfManager.ShowChatsAction -> {
Log.d(TAG, "processNotificationIntent: ShowChatsAction")
ntfManager.showChatsAction(userId)
withBGApi {
awaitChatStartedIfNeeded(chatModel)
if (userId != null && userId != chatModel.currentUser.value?.userId && chatModel.currentUser.value != null) {
chatModel.controller.changeActiveUser(userId, null)
}
chatModel.chatId.value = null
chatModel.clearOverlays.value = true
}
}
NtfManager.AcceptCallAction -> {
val chatId = intent.getStringExtra("chatId")
if (chatId == null || chatId == "") return
Log.d(TAG, "processNotificationIntent: AcceptCallAction $chatId")
ntfManager.acceptCallAction(chatId)
chatModel.clearOverlays.value = true
val invitation = chatModel.callInvitations[chatId]
if (invitation == null) {
AlertManager.shared.showAlertMsg(generalGetString(R.string.call_already_ended))
} else {
chatModel.callManager.acceptIncomingCall(invitation = invitation)
}
}
}
}
fun processIntent(intent: Intent?) {
fun processIntent(intent: Intent?, chatModel: ChatModel) {
when (intent?.action) {
"android.intent.action.VIEW" -> {
val uri = intent.data
if (uri != null) connectIfOpenedViaUri(uri.toURI(), ChatModel)
if (uri != null) connectIfOpenedViaUri(uri, chatModel)
}
}
}
fun processExternalIntent(intent: Intent?) {
fun processExternalIntent(intent: Intent?, chatModel: ChatModel) {
when (intent?.action) {
Intent.ACTION_SEND -> {
// Close active chat and show a list of chats
@@ -148,13 +637,13 @@ fun processExternalIntent(intent: Intent?) {
isMediaIntent(intent) -> {
val uri = intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri
if (uri != null) {
chatModel.sharedContent.value = SharedContent.Media(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", listOf(uri.toURI()))
chatModel.sharedContent.value = SharedContent.Media(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", listOf(uri))
} // All other mime types
}
else -> {
val uri = intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri
if (uri != null) {
chatModel.sharedContent.value = SharedContent.File(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", uri.toURI())
chatModel.sharedContent.value = SharedContent.File(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", uri)
}
}
}
@@ -168,7 +657,7 @@ fun processExternalIntent(intent: Intent?) {
isMediaIntent(intent) -> {
val uris = intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM) as? List<Uri>
if (uris != null) {
chatModel.sharedContent.value = SharedContent.Media(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", uris.map { it.toURI() })
chatModel.sharedContent.value = SharedContent.Media(intent.getStringExtra(Intent.EXTRA_TEXT) ?: "", uris)
} // All other mime types
}
else -> {}
@@ -180,6 +669,48 @@ fun processExternalIntent(intent: Intent?) {
fun isMediaIntent(intent: Intent): Boolean =
intent.type?.startsWith("image/") == true || intent.type?.startsWith("video/") == true
fun connectIfOpenedViaUri(uri: Uri, chatModel: ChatModel) {
Log.d(TAG, "connectIfOpenedViaUri: opened via link")
if (chatModel.currentUser.value == null) {
chatModel.appOpenUrl.value = uri
} else {
withUriAction(uri) { linkType ->
val title = when (linkType) {
ConnectionLinkType.CONTACT -> generalGetString(R.string.connect_via_contact_link)
ConnectionLinkType.INVITATION -> generalGetString(R.string.connect_via_invitation_link)
ConnectionLinkType.GROUP -> generalGetString(R.string.connect_via_group_link)
}
AlertManager.shared.showAlertDialog(
title = title,
text = if (linkType == ConnectionLinkType.GROUP)
generalGetString(R.string.you_will_join_group)
else
generalGetString(R.string.profile_will_be_sent_to_contact_sending_link),
confirmText = generalGetString(R.string.connect_via_link_verb),
onConfirm = {
withApi {
Log.d(TAG, "connectIfOpenedViaUri: connecting")
connectViaUri(chatModel, linkType, uri)
}
}
)
}
}
}
suspend fun awaitChatStartedIfNeeded(chatModel: ChatModel, timeout: Long = 30_000) {
// Still decrypting database
if (chatModel.chatRunning.value == null) {
val step = 50L
for (i in 0..(timeout / step)) {
if (chatModel.chatRunning.value == true || chatModel.onboardingStage.value == OnboardingStage.Step1_SimpleXInfo) {
break
}
delay(step)
}
}
}
//fun testJson() {
// val str: String = """
// """.trimIndent()

View File

@@ -1,31 +1,104 @@
package chat.simplex.app
import android.app.Application
import chat.simplex.common.platform.Log
import android.net.LocalServerSocket
import android.util.Log
import androidx.lifecycle.*
import androidx.work.*
import chat.simplex.app.model.NtfManager
import chat.simplex.common.helpers.APPLICATION_ID
import chat.simplex.common.helpers.requiresIgnoringBattery
import chat.simplex.common.model.*
import chat.simplex.common.model.ChatController.appPrefs
import chat.simplex.common.views.helpers.*
import chat.simplex.common.views.onboarding.OnboardingStage
import chat.simplex.common.platform.*
import chat.simplex.common.views.call.RcvCallInvitation
import chat.simplex.app.model.*
import chat.simplex.app.ui.theme.DefaultTheme
import chat.simplex.app.views.helpers.*
import chat.simplex.app.views.onboarding.OnboardingStage
import chat.simplex.app.views.usersettings.NotificationsMode
import com.jakewharton.processphoenix.ProcessPhoenix
import kotlinx.coroutines.*
import kotlinx.serialization.decodeFromString
import java.io.*
import java.util.*
import java.util.concurrent.Semaphore
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
const val TAG = "SIMPLEX"
// ghc's rts
external fun initHS()
// android-support
external fun pipeStdOutToSocket(socketName: String) : Int
// SimpleX API
typealias ChatCtrl = Long
external fun chatMigrateInit(dbPath: String, dbKey: String, confirm: String): Array<Any>
external fun chatSendCmd(ctrl: ChatCtrl, msg: String): String
external fun chatRecvMsg(ctrl: ChatCtrl): String
external fun chatRecvMsgWait(ctrl: ChatCtrl, timeout: Int): String
external fun chatParseMarkdown(str: String): String
external fun chatParseServer(str: String): String
external fun chatPasswordHash(pwd: String, salt: String): String
class SimplexApp: Application(), LifecycleEventObserver {
var isAppOnForeground: Boolean = false
val defaultLocale: Locale = Locale.getDefault()
suspend fun initChatController(useKey: String? = null, confirmMigrations: MigrationConfirmation? = null, startChat: Boolean = true) {
val dbKey = useKey ?: DatabaseUtils.useDatabaseKey()
val dbAbsolutePathPrefix = getFilesDirectory(SimplexApp.context)
val confirm = confirmMigrations ?: if (appPreferences.confirmDBUpgrades.get()) MigrationConfirmation.Error else MigrationConfirmation.YesUp
val migrated: Array<Any> = chatMigrateInit(dbAbsolutePathPrefix, dbKey, confirm.value)
val res: DBMigrationResult = kotlin.runCatching {
json.decodeFromString<DBMigrationResult>(migrated[0] as String)
}.getOrElse { DBMigrationResult.Unknown(migrated[0] as String) }
val ctrl = if (res is DBMigrationResult.OK) {
migrated[1] as Long
} else null
chatController.ctrl = ctrl
chatModel.chatDbEncrypted.value = dbKey != ""
chatModel.chatDbStatus.value = res
if (res != DBMigrationResult.OK) {
Log.d(TAG, "Unable to migrate successfully: $res")
} else if (startChat) {
// If we migrated successfully means previous re-encryption process on database level finished successfully too
if (appPreferences.encryptionStartedAt.get() != null) appPreferences.encryptionStartedAt.set(null)
val user = chatController.apiGetActiveUser()
if (user == null) {
chatModel.controller.appPrefs.onboardingStage.set(OnboardingStage.Step1_SimpleXInfo)
chatModel.onboardingStage.value = OnboardingStage.Step1_SimpleXInfo
chatModel.currentUser.value = null
chatModel.users.clear()
} else {
val savedOnboardingStage = appPreferences.onboardingStage.get()
chatModel.onboardingStage.value = if (listOf(OnboardingStage.Step1_SimpleXInfo, OnboardingStage.Step2_CreateProfile).contains(savedOnboardingStage) && chatModel.users.size == 1) {
OnboardingStage.Step3_CreateSimpleXAddress
} else {
savedOnboardingStage
}
chatController.startChat(user)
// Prevents from showing "Enable notifications" alert when onboarding wasn't complete yet
if (chatModel.onboardingStage.value == OnboardingStage.OnboardingComplete) {
chatController.showBackgroundServiceNoticeIfNeeded()
if (appPreferences.notificationsMode.get() == NotificationsMode.SERVICE.name)
SimplexService.start(applicationContext)
}
}
}
}
val chatModel: ChatModel
get() = chatController.chatModel
val chatController: ChatController = ChatController
private val ntfManager: NtfManager by lazy {
NtfManager(applicationContext, appPreferences)
}
private val appPreferences: AppPreferences by lazy {
AppPreferences(applicationContext)
}
val chatController: ChatController by lazy {
ChatController(0L, ntfManager, applicationContext, appPreferences)
}
override fun onCreate() {
super.onCreate()
@@ -33,11 +106,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
return;
}
context = this
initHaskell()
initMultiplatform()
tmpDir.deleteRecursively()
tmpDir.mkdir()
context.getDir("temp", MODE_PRIVATE).deleteRecursively()
withBGApi {
initChatController()
runMigrations()
@@ -72,7 +141,7 @@ class SimplexApp: Application(), LifecycleEventObserver {
Lifecycle.Event.ON_RESUME -> {
isAppOnForeground = true
if (chatModel.onboardingStage.value == OnboardingStage.OnboardingComplete) {
SimplexService.showBackgroundServiceNoticeIfNeeded()
chatController.showBackgroundServiceNoticeIfNeeded()
}
/**
* We're starting service here instead of in [Lifecycle.Event.ON_START] because
@@ -81,9 +150,9 @@ class SimplexApp: Application(), LifecycleEventObserver {
* */
if (chatModel.chatRunning.value != false &&
chatModel.onboardingStage.value == OnboardingStage.OnboardingComplete &&
appPrefs.notificationsMode.get() == NotificationsMode.SERVICE
appPreferences.notificationsMode.get() == NotificationsMode.SERVICE.name
) {
SimplexService.start()
SimplexService.start(applicationContext)
}
}
else -> isAppOnForeground = false
@@ -92,13 +161,13 @@ class SimplexApp: Application(), LifecycleEventObserver {
}
fun allowToStartServiceAfterAppExit() = with(chatModel.controller) {
appPrefs.notificationsMode.get() == NotificationsMode.SERVICE &&
(!NotificationsMode.SERVICE.requiresIgnoringBattery || SimplexService.isIgnoringBatteryOptimizations())
appPrefs.notificationsMode.get() == NotificationsMode.SERVICE.name &&
(!NotificationsMode.SERVICE.requiresIgnoringBattery || isIgnoringBatteryOptimizations(chatModel.controller.appContext))
}
private fun allowToStartPeriodically() = with(chatModel.controller) {
appPrefs.notificationsMode.get() == NotificationsMode.PERIODIC &&
(!NotificationsMode.PERIODIC.requiresIgnoringBattery || SimplexService.isIgnoringBatteryOptimizations())
appPrefs.notificationsMode.get() == NotificationsMode.PERIODIC.name &&
(!NotificationsMode.PERIODIC.requiresIgnoringBattery || isIgnoringBatteryOptimizations(chatModel.controller.appContext))
}
/*
@@ -132,73 +201,75 @@ class SimplexApp: Application(), LifecycleEventObserver {
MessagesFetcherWorker.scheduleWork()
}
companion object {
lateinit var context: SimplexApp private set
private fun runMigrations() {
val lastMigration = chatModel.controller.appPrefs.lastMigratedVersionCode
if (lastMigration.get() < BuildConfig.VERSION_CODE) {
while (true) {
if (lastMigration.get() < 117) {
if (chatModel.controller.appPrefs.currentTheme.get() == DefaultTheme.DARK.name) {
chatModel.controller.appPrefs.currentTheme.set(DefaultTheme.SIMPLEX.name)
}
lastMigration.set(117)
} else {
lastMigration.set(BuildConfig.VERSION_CODE)
break
}
}
}
}
private fun initMultiplatform() {
androidAppContext = this
APPLICATION_ID = BuildConfig.APPLICATION_ID
ntfManager = object : chat.simplex.common.platform.NtfManager() {
override fun notifyCallInvitation(invitation: RcvCallInvitation) = NtfManager.notifyCallInvitation(invitation)
override fun hasNotificationsForChat(chatId: String): Boolean = NtfManager.hasNotificationsForChat(chatId)
override fun cancelNotificationsForChat(chatId: String) = NtfManager.cancelNotificationsForChat(chatId)
override fun displayNotification(user: User, chatId: String, displayName: String, msgText: String, image: String?, actions: List<Pair<NotificationAction, () -> Unit>>) = NtfManager.displayNotification(user, chatId, displayName, msgText, image, actions.map { it.first })
override fun androidCreateNtfChannelsMaybeShowAlert() = NtfManager.createNtfChannelsMaybeShowAlert()
override fun cancelCallNotification() = NtfManager.cancelCallNotification()
override fun cancelAllNotifications() = NtfManager.cancelAllNotifications()
}
platform = object : PlatformInterface {
override suspend fun androidServiceStart() {
SimplexService.start()
}
companion object {
lateinit var context: SimplexApp private set
override fun androidServiceSafeStop() {
SimplexService.safeStopService()
}
override fun androidNotificationsModeChanged(mode: NotificationsMode) {
if (mode.requiresIgnoringBattery && !SimplexService.isIgnoringBatteryOptimizations()) {
appPrefs.backgroundServiceNoticeShown.set(false)
init {
val socketName = BuildConfig.APPLICATION_ID + ".local.socket.address.listen.native.cmd2"
val s = Semaphore(0)
thread(name="stdout/stderr pipe") {
Log.d(TAG, "starting server")
var server: LocalServerSocket? = null
for (i in 0..100) {
try {
server = LocalServerSocket(socketName + i)
break
} catch (e: IOException) {
Log.e(TAG, e.stackTraceToString())
}
}
SimplexService.StartReceiver.toggleReceiver(mode == NotificationsMode.SERVICE)
CoroutineScope(Dispatchers.Default).launch {
if (mode == NotificationsMode.SERVICE)
SimplexService.start()
else
SimplexService.safeStopService()
if (server == null) {
throw Error("Unable to setup local server socket. Contact developers")
}
if (mode != NotificationsMode.PERIODIC) {
MessagesFetcherWorker.cancelAll()
}
SimplexService.showBackgroundServiceNoticeIfNeeded()
}
override fun androidChatStartedAfterBeingOff() {
SimplexService.cancelPassphraseNotification()
when (appPrefs.notificationsMode.get()) {
NotificationsMode.SERVICE -> CoroutineScope(Dispatchers.Default).launch { platform.androidServiceStart() }
NotificationsMode.PERIODIC -> SimplexApp.context.schedulePeriodicWakeUp()
NotificationsMode.OFF -> {}
Log.d(TAG, "started server")
s.release()
val receiver = server.accept()
Log.d(TAG, "started receiver")
val logbuffer = FifoQueue<String>(500)
if (receiver != null) {
val inStream = receiver.inputStream
val inStreamReader = InputStreamReader(inStream)
val input = BufferedReader(inStreamReader)
Log.d(TAG, "starting receiver loop")
while (true) {
val line = input.readLine() ?: break
Log.w("$TAG (stdout/stderr)", line)
logbuffer.add(line)
}
Log.w(TAG, "exited receiver loop")
}
}
override fun androidChatStopped() {
SimplexService.safeStopService()
MessagesFetcherWorker.cancelAll()
}
System.loadLibrary("app-lib")
override fun androidChatInitializedAndStarted() {
// Prevents from showing "Enable notifications" alert when onboarding wasn't complete yet
if (chatModel.onboardingStage.value == OnboardingStage.OnboardingComplete) {
SimplexService.showBackgroundServiceNoticeIfNeeded()
if (appPrefs.notificationsMode.get() == NotificationsMode.SERVICE)
withBGApi {
platform.androidServiceStart()
}
}
}
s.acquire()
pipeStdOutToSocket(socketName)
initHS()
}
}
}
class FifoQueue<E>(private var capacity: Int) : LinkedList<E>() {
override fun add(element: E): Boolean {
if(size > capacity) removeFirst()
return super.add(element)
}
}

View File

@@ -1,32 +1,17 @@
package chat.simplex.app
import android.annotation.SuppressLint
import android.app.*
import android.content.*
import android.content.pm.PackageManager
import android.net.Uri
import android.os.*
import android.provider.Settings
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import chat.simplex.common.platform.Log
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import androidx.work.*
import chat.simplex.common.AppLock
import chat.simplex.common.AppLock.clearAuthState
import chat.simplex.common.helpers.requiresIgnoringBattery
import chat.simplex.common.model.ChatController
import chat.simplex.common.model.NotificationsMode
import chat.simplex.common.platform.androidAppContext
import chat.simplex.common.views.helpers.*
import chat.simplex.app.model.ChatController
import chat.simplex.app.views.helpers.*
import kotlinx.coroutines.*
import chat.simplex.res.MR
import dev.icerock.moko.resources.compose.painterResource
import dev.icerock.moko.resources.compose.stringResource
// based on:
// https://robertohuertas.com/2019/06/29/android_foreground_services/
@@ -56,8 +41,8 @@ class SimplexService: Service() {
override fun onCreate() {
super.onCreate()
Log.d(TAG, "Simplex service created")
val title = generalGetString(MR.strings.simplex_service_notification_title)
val text = generalGetString(MR.strings.simplex_service_notification_text)
val title = getString(R.string.simplex_service_notification_title)
val text = getString(R.string.simplex_service_notification_text)
notificationManager = createNotificationChannel()
serviceNotification = createNotification(title, text)
startForeground(SIMPLEX_SERVICE_ID, serviceNotification)
@@ -100,7 +85,7 @@ class SimplexService: Service() {
val self = this
isStartingService = true
withApi {
val chatController = ChatController
val chatController = (application as SimplexApp).chatController
waitDbMigrationEnds(chatController)
try {
Log.w(TAG, "Starting foreground service")
@@ -108,7 +93,7 @@ class SimplexService: Service() {
if (chatDbStatus != DBMigrationResult.OK) {
Log.w(chat.simplex.app.TAG, "SimplexService: problem with the database: $chatDbStatus")
showPassphraseNotification(chatDbStatus)
safeStopService()
safeStopService(self)
return@withApi
}
saveServiceState(self, ServiceState.STARTED)
@@ -157,7 +142,7 @@ class SimplexService: Service() {
setupIntent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
setupIntent.putExtra(Settings.EXTRA_CHANNEL_ID, NOTIFICATION_CHANNEL_ID)
val setup = PendingIntent.getActivity(this, 0, setupIntent, flags)
builder.addAction(0, generalGetString(MR.strings.hide_notification), setup)
builder.addAction(0, getString(R.string.hide_notification), setup)
}
return builder.build()
@@ -170,7 +155,7 @@ class SimplexService: Service() {
// re-schedules the task when "Clear recent apps" is pressed
override fun onTaskRemoved(rootIntent: Intent) {
// Just to make sure that after restart of the app the user will need to re-authenticate
AppLock.clearAuthState()
MainActivity.clearAuthState()
// If notification service isn't enabled or battery optimization isn't disabled, we shouldn't restart the service
if (!SimplexApp.context.allowToStartServiceAfterAppExit()) {
@@ -221,7 +206,7 @@ class SimplexService: Service() {
}
if (getServiceState(context) == ServiceState.STARTED) {
Log.d(TAG, "ServiceStartWorker: Starting foreground service (work ID: $id)")
start()
start(context)
}
return Result.success()
}
@@ -262,26 +247,26 @@ class SimplexService: Service() {
workManager.enqueueUniqueWork(WORK_NAME_ONCE, ExistingWorkPolicy.KEEP, startServiceRequest) // Unique avoids races!
}
suspend fun start() = serviceAction(Action.START)
suspend fun start(context: Context) = serviceAction(context, Action.START)
/**
* If there is a need to stop the service, use this function only. It makes sure that the service will be stopped without an
* exception related to foreground services lifecycle
* */
fun safeStopService() {
fun safeStopService(context: Context) {
if (isServiceStarted) {
androidAppContext.stopService(Intent(androidAppContext, SimplexService::class.java))
context.stopService(Intent(context, SimplexService::class.java))
} else {
stopAfterStart = true
}
}
private suspend fun serviceAction(action: Action) {
private suspend fun serviceAction(context: Context, action: Action) {
Log.d(TAG, "SimplexService serviceAction: ${action.name}")
withContext(Dispatchers.IO) {
Intent(androidAppContext, SimplexService::class.java).also {
Intent(context, SimplexService::class.java).also {
it.action = action.name
ContextCompat.startForegroundService(androidAppContext, it)
ContextCompat.startForegroundService(context, it)
}
}
}
@@ -310,15 +295,15 @@ class SimplexService: Service() {
}
val title = when(chatDbStatus) {
is DBMigrationResult.ErrorNotADatabase -> generalGetString(MR.strings.enter_passphrase_notification_title)
is DBMigrationResult.ErrorNotADatabase -> generalGetString(R.string.enter_passphrase_notification_title)
is DBMigrationResult.OK -> return
else -> generalGetString(MR.strings.database_initialization_error_title)
else -> generalGetString(R.string.database_initialization_error_title)
}
val description = when(chatDbStatus) {
is DBMigrationResult.ErrorNotADatabase -> generalGetString(MR.strings.enter_passphrase_notification_desc)
is DBMigrationResult.ErrorNotADatabase -> generalGetString(R.string.enter_passphrase_notification_desc)
is DBMigrationResult.OK -> return
else -> generalGetString(MR.strings.database_initialization_error_desc)
else -> generalGetString(R.string.database_initialization_error_desc)
}
val builder = NotificationCompat.Builder(SimplexApp.context, NOTIFICATION_CHANNEL_ID)
@@ -352,158 +337,5 @@ class SimplexService: Service() {
}
private fun getPreferences(context: Context): SharedPreferences = context.getSharedPreferences(SHARED_PREFS_ID, Context.MODE_PRIVATE)
fun showBackgroundServiceNoticeIfNeeded() {
val appPrefs = ChatController.appPrefs
val mode = appPrefs.notificationsMode.get()
Log.d(TAG, "showBackgroundServiceNoticeIfNeeded")
// Nothing to do if mode is OFF. Can be selected on on-boarding stage
if (mode == NotificationsMode.OFF) return
if (!appPrefs.backgroundServiceNoticeShown.get()) {
// the branch for the new users who have never seen service notice
if (!mode.requiresIgnoringBattery || isIgnoringBatteryOptimizations()) {
showBGServiceNotice(mode)
} else {
showBGServiceNoticeIgnoreOptimization(mode)
}
// set both flags, so that if the user doesn't allow ignoring optimizations, the service will be disabled without additional notice
appPrefs.backgroundServiceNoticeShown.set(true)
appPrefs.backgroundServiceBatteryNoticeShown.set(true)
} else if (mode.requiresIgnoringBattery && !isIgnoringBatteryOptimizations()) {
// the branch for users who have app installed, and have seen the service notice,
// but the battery optimization for the app is on (Android 12) AND the service is running
if (appPrefs.backgroundServiceBatteryNoticeShown.get()) {
// users have been presented with battery notice before - they did not allow ignoring optimizations -> disable service
showDisablingServiceNotice(mode)
appPrefs.notificationsMode.set(NotificationsMode.OFF)
StartReceiver.toggleReceiver(false)
MessagesFetcherWorker.cancelAll()
safeStopService()
} else {
// show battery optimization notice
showBGServiceNoticeIgnoreOptimization(mode)
appPrefs.backgroundServiceBatteryNoticeShown.set(true)
}
} else {
// service or periodic mode was chosen and battery optimization is disabled
SimplexApp.context.schedulePeriodicServiceRestartWorker()
SimplexApp.context.schedulePeriodicWakeUp()
}
}
private fun showBGServiceNotice(mode: NotificationsMode) = AlertManager.shared.showAlert {
AlertDialog(
onDismissRequest = AlertManager.shared::hideAlert,
title = {
Row {
Icon(
painterResource(MR.images.ic_bolt),
contentDescription =
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.icon_descr_instant_notifications) else stringResource(MR.strings.periodic_notifications),
)
Text(
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.icon_descr_instant_notifications) else stringResource(MR.strings.periodic_notifications),
fontWeight = FontWeight.Bold
)
}
},
text = {
Column {
Text(
if (mode == NotificationsMode.SERVICE) annotatedStringResource(MR.strings.to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery) else annotatedStringResource(MR.strings.periodic_notifications_desc),
Modifier.padding(bottom = 8.dp)
)
Text(
annotatedStringResource(MR.strings.it_can_disabled_via_settings_notifications_still_shown)
)
}
},
confirmButton = {
TextButton(onClick = AlertManager.shared::hideAlert) { Text(stringResource(MR.strings.ok)) }
}
)
}
private fun showBGServiceNoticeIgnoreOptimization(mode: NotificationsMode) = AlertManager.shared.showAlert {
val ignoreOptimization = {
AlertManager.shared.hideAlert()
askAboutIgnoringBatteryOptimization()
}
AlertDialog(
onDismissRequest = ignoreOptimization,
title = {
Row {
Icon(
painterResource(MR.images.ic_bolt),
contentDescription =
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.icon_descr_instant_notifications) else stringResource(MR.strings.periodic_notifications),
)
Text(
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.service_notifications) else stringResource(MR.strings.periodic_notifications),
fontWeight = FontWeight.Bold
)
}
},
text = {
Column {
Text(
if (mode == NotificationsMode.SERVICE) annotatedStringResource(MR.strings.to_preserve_privacy_simplex_has_background_service_instead_of_push_notifications_it_uses_a_few_pc_battery) else annotatedStringResource(MR.strings.periodic_notifications_desc),
Modifier.padding(bottom = 8.dp)
)
Text(annotatedStringResource(MR.strings.turn_off_battery_optimization))
}
},
confirmButton = {
TextButton(onClick = ignoreOptimization) { Text(stringResource(MR.strings.ok)) }
}
)
}
private fun showDisablingServiceNotice(mode: NotificationsMode) = AlertManager.shared.showAlert {
AlertDialog(
onDismissRequest = AlertManager.shared::hideAlert,
title = {
Row {
Icon(
painterResource(MR.images.ic_bolt),
contentDescription =
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.icon_descr_instant_notifications) else stringResource(MR.strings.periodic_notifications),
)
Text(
if (mode == NotificationsMode.SERVICE) stringResource(MR.strings.service_notifications_disabled) else stringResource(MR.strings.periodic_notifications_disabled),
fontWeight = FontWeight.Bold
)
}
},
text = {
Column {
Text(
annotatedStringResource(MR.strings.turning_off_service_and_periodic),
Modifier.padding(bottom = 8.dp)
)
}
},
confirmButton = {
TextButton(onClick = AlertManager.shared::hideAlert) { Text(stringResource(MR.strings.ok)) }
}
)
}
fun isIgnoringBatteryOptimizations(): Boolean {
val powerManager = androidAppContext.getSystemService(Application.POWER_SERVICE) as PowerManager
return powerManager.isIgnoringBatteryOptimizations(androidAppContext.packageName)
}
private fun askAboutIgnoringBatteryOptimization() {
Intent().apply {
@SuppressLint("BatteryLife")
action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
data = Uri.parse("package:${androidAppContext.packageName}")
// This flag is needed when you start a new activity from non-Activity context
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
androidAppContext.startActivity(this)
}
}
}
}

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