diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index afdb9bea1a..2727fc4add 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build: - name: build-${{ matrix.os }} + name: build-${{ matrix.os }}-${{ matrix.ghc }} if: always() needs: prepare-release runs-on: ${{ matrix.os }} @@ -51,18 +51,25 @@ jobs: matrix: include: - os: ubuntu-20.04 + ghc: "8.10.7" + cache_path: ~/.cabal/store + - os: ubuntu-20.04 + ghc: "9.6.3" 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 + ghc: "9.6.3" 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 + ghc: "9.6.3" cache_path: ~/.cabal/store asset_name: simplex-chat-macos-x86-64 desktop_asset_name: simplex-desktop-macos-x86_64.dmg - os: windows-latest + ghc: "9.6.3" cache_path: C:/cabal asset_name: simplex-chat-windows-x86-64 desktop_asset_name: simplex-desktop-windows-x86_64.msi @@ -81,16 +88,17 @@ jobs: - name: Setup Haskell uses: haskell-actions/setup@v2 with: - ghc-version: "9.6.3" + ghc-version: ${{ matrix.ghc }} cabal-version: "3.10.1.0" - - name: Cache dependencies - uses: actions/cache@v3 + - name: Restore cached build + id: restore_cache + uses: actions/cache/restore@v3 with: path: | ${{ matrix.cache_path }} dist-newstyle - key: ${{ matrix.os }}-${{ hashFiles('cabal.project', 'simplex-chat.cabal') }} + key: ${{ matrix.os }}-ghc${{ matrix.ghc }}-${{ hashFiles('cabal.project', 'simplex-chat.cabal') }} # / Unix @@ -105,7 +113,7 @@ jobs: echo " flags: +openssl" >> cabal.project.local - name: Install AppImage dependencies - if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os == 'ubuntu-20.04' run: sudo apt install -y desktop-file-utils - name: Install pkg-config for Mac @@ -131,7 +139,7 @@ jobs: echo "bin_hash=$(echo SHA2-512\(${{ matrix.asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT - name: Unix upload CLI binary to release - if: startsWith(github.ref, 'refs/tags/v') && matrix.os != 'windows-latest' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os != 'windows-latest' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} @@ -140,7 +148,7 @@ jobs: tag: ${{ github.ref }} - name: Unix update CLI binary hash - if: startsWith(github.ref, 'refs/tags/v') && matrix.os != 'windows-latest' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os != 'windows-latest' uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -150,7 +158,7 @@ jobs: ${{ steps.unix_cli_build.outputs.bin_hash }} - name: Setup Java - if: startsWith(github.ref, 'refs/tags/v') + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name uses: actions/setup-java@v3 with: distribution: 'corretto' @@ -159,7 +167,7 @@ jobs: - 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') + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04') shell: bash run: | scripts/desktop/build-lib-linux.sh @@ -168,10 +176,10 @@ jobs: path=$(echo $PWD/release/main/deb/simplex_*_amd64.deb) echo "package_path=$path" >> $GITHUB_OUTPUT echo "package_hash=$(echo SHA2-512\(${{ matrix.desktop_asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT - + - name: Linux make AppImage id: linux_appimage_build - if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os == 'ubuntu-20.04' shell: bash run: | scripts/desktop/make-appimage-linux.sh @@ -194,7 +202,7 @@ jobs: echo "package_hash=$(echo SHA2-512\(${{ matrix.desktop_asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT - name: Linux upload desktop package to release - if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04') + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04') uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} @@ -203,7 +211,7 @@ jobs: tag: ${{ github.ref }} - name: Linux update desktop package hash - if: startsWith(github.ref, 'refs/tags/v') && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04') + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && (matrix.os == 'ubuntu-20.04' || matrix.os == 'ubuntu-22.04') uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -213,7 +221,7 @@ jobs: ${{ steps.linux_desktop_build.outputs.package_hash }} - name: Linux upload AppImage to release - if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os == 'ubuntu-20.04' uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} @@ -222,7 +230,7 @@ jobs: tag: ${{ github.ref }} - name: Linux update AppImage hash - if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'ubuntu-20.04' + if: startsWith(github.ref, 'refs/tags/v') && matrix.asset_name && matrix.os == 'ubuntu-20.04' uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -250,6 +258,15 @@ jobs: body: | ${{ steps.mac_desktop_build.outputs.package_hash }} + - name: Cache unix build + uses: actions/cache/save@v3 + if: matrix.os != 'windows-latest' + with: + path: | + ${{ matrix.cache_path }} + dist-newstyle + key: ${{ steps.restore_cache.outputs.cache-primary-key }} + - name: Unix test if: matrix.os != 'windows-latest' timeout-minutes: 30 @@ -330,7 +347,7 @@ jobs: path=$(echo $PWD/release/main/msi/*imple*.msi | sed 's#/\([a-z]\)#\1:#' | sed 's#/#\\#g') echo "package_path=$path" >> $GITHUB_OUTPUT echo "package_hash=$(echo SHA2-512\(${{ matrix.desktop_asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT - + - name: Windows upload desktop package to release if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'windows-latest' uses: svenstaro/upload-release-action@v2 @@ -350,4 +367,13 @@ jobs: body: | ${{ steps.windows_desktop_build.outputs.package_hash }} + - name: Cache windows build + uses: actions/cache/save@v3 + if: matrix.os == 'windows-latest' + with: + path: | + ${{ matrix.cache_path }} + dist-newstyle + key: ${{ steps.restore_cache.outputs.cache-primary-key }} + # Windows / diff --git a/apps/ios/Shared/AppDelegate.swift b/apps/ios/Shared/AppDelegate.swift index 145e362797..24c0eeb605 100644 --- a/apps/ios/Shared/AppDelegate.swift +++ b/apps/ios/Shared/AppDelegate.swift @@ -15,6 +15,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { logger.debug("AppDelegate: didFinishLaunchingWithOptions") application.registerForRemoteNotifications() if #available(iOS 17.0, *) { trackKeyboard() } + NotificationCenter.default.addObserver(self, selector: #selector(pasteboardChanged), name: UIPasteboard.changedNotification, object: nil) return true } @@ -36,6 +37,10 @@ class AppDelegate: NSObject, UIApplicationDelegate { ChatModel.shared.keyboardHeight = 0 } + @objc func pasteboardChanged() { + ChatModel.shared.pasteboardHasStrings = UIPasteboard.general.hasStrings + } + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let token = deviceToken.map { String(format: "%02hhx", $0) }.joined() logger.debug("AppDelegate: didRegisterForRemoteNotificationsWithDeviceToken \(token)") diff --git a/apps/ios/Shared/Model/ChatModel.swift b/apps/ios/Shared/Model/ChatModel.swift index 0cc281fda9..db0f138690 100644 --- a/apps/ios/Shared/Model/ChatModel.swift +++ b/apps/ios/Shared/Model/ChatModel.swift @@ -89,14 +89,15 @@ final class ChatModel: ObservableObject { @Published var showCallView = false // remote desktop @Published var remoteCtrlSession: RemoteCtrlSession? - // currently showing QR code - @Published var connReqInv: String? + // currently showing invitation + @Published var showingInvitation: ShowingInvitation? // audio recording and playback @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 + @Published var pasteboardHasStrings: Bool = UIPasteboard.general.hasStrings var messageDelivery: Dictionary Void> = [:] @@ -620,14 +621,16 @@ final class ChatModel: ObservableObject { } func dismissConnReqView(_ id: String) { - if let connReqInv = connReqInv, - let c = getChat(id), - case let .contactConnection(contactConnection) = c.chatInfo, - connReqInv == contactConnection.connReqInv { + if id == showingInvitation?.connId { + markShowingInvitationUsed() dismissAllSheets() } } + func markShowingInvitationUsed() { + showingInvitation?.connChatUsed = true + } + func removeChat(_ id: String) { withAnimation { chats.removeAll(where: { $0.id == id }) @@ -704,6 +707,11 @@ final class ChatModel: ObservableObject { } } +struct ShowingInvitation { + var connId: String + var connChatUsed: Bool +} + struct NTFContactRequest { var incognito: Bool var chatId: String diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index eff3110962..ddac78c3da 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -581,15 +581,15 @@ func apiVerifyGroupMember(_ groupId: Int64, _ groupMemberId: Int64, connectionCo return nil } -func apiAddContact(incognito: Bool) async -> (String, PendingContactConnection)? { +func apiAddContact(incognito: Bool) async -> ((String, PendingContactConnection)?, Alert?) { guard let userId = ChatModel.shared.currentUser?.userId else { logger.error("apiAddContact: no current user") - return nil + return (nil, nil) } let r = await chatSendCmd(.apiAddContact(userId: userId, incognito: incognito), bgTask: false) - if case let .invitation(_, connReqInvitation, connection) = r { return (connReqInvitation, connection) } - AlertManager.shared.showAlert(connectionErrorAlert(r)) - return nil + if case let .invitation(_, connReqInvitation, connection) = r { return ((connReqInvitation, connection), nil) } + let alert = connectionErrorAlert(r) + return (nil, alert) } func apiSetConnectionIncognito(connId: Int64, incognito: Bool) async throws -> PendingContactConnection? { diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift index 51dfa3cb50..7b5dd40e97 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift @@ -28,7 +28,9 @@ struct FramedItemView: View { @State var metaColor = Color.secondary @State var showFullScreenImage = false @Binding var allowMenu: Bool - + @State private var showSecrets = false + @State private var showQuoteSecrets = false + @Binding var audioPlayer: AudioPlayer? @Binding var playbackState: VoiceMessagePlaybackState @Binding var playbackTime: TimeInterval? @@ -252,10 +254,12 @@ struct FramedItemView: View { } private func ciQuotedMsgTextView(_ qi: CIQuote, lines: Int) -> some View { - MsgContentView(chat: chat, text: qi.text, formattedText: qi.formattedText) - .lineLimit(lines) - .font(.subheadline) - .padding(.bottom, 6) + toggleSecrets(qi.formattedText, $showQuoteSecrets, + MsgContentView(chat: chat, text: qi.text, formattedText: qi.formattedText, showSecrets: showQuoteSecrets) + .lineLimit(lines) + .font(.subheadline) + .padding(.bottom, 6) + ) } private func ciQuoteIconView(_ image: String) -> some View { @@ -278,13 +282,15 @@ struct FramedItemView: View { @ViewBuilder private func ciMsgContentView(_ ci: ChatItem) -> some View { let text = ci.meta.isLive ? ci.content.msgContent?.text ?? ci.text : ci.text let rtl = isRightToLeft(text) - let v = MsgContentView( + let ft = text == "" ? [] : ci.formattedText + let v = toggleSecrets(ft, $showSecrets, MsgContentView( chat: chat, text: text, - formattedText: text == "" ? [] : ci.formattedText, + formattedText: ft, meta: ci.meta, - rightToLeft: rtl - ) + rightToLeft: rtl, + showSecrets: showSecrets + )) .multilineTextAlignment(rtl ? .trailing : .leading) .padding(.vertical, 6) .padding(.horizontal, 12) @@ -298,7 +304,7 @@ struct FramedItemView: View { v } } - + @ViewBuilder private func ciFileView(_ ci: ChatItem, _ text: String) -> some View { CIFileView(file: chatItem.file, edited: chatItem.meta.itemEdited) .overlay(DetermineWidth()) @@ -318,6 +324,14 @@ struct FramedItemView: View { } } +@ViewBuilder func toggleSecrets(_ ft: [FormattedText]?, _ showSecrets: Binding, _ v: V) -> some View { + if let ft = ft, ft.contains(where: { $0.isSecret }) { + v.onTapGesture { showSecrets.wrappedValue.toggle() } + } else { + v + } +} + func isRightToLeft(_ s: String) -> Bool { if let lang = CFStringTokenizerCopyBestStringLanguage(s as CFString, CFRange(location: 0, length: min(s.count, 80))) { return NSLocale.characterDirection(forLanguage: lang as String) == .rightToLeft diff --git a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift index d0d2bdf3dd..ccd7ac0a12 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift @@ -9,7 +9,7 @@ import SwiftUI import SimpleXChat -private let uiLinkColor = UIColor(red: 0, green: 0.533, blue: 1, alpha: 1) +let uiLinkColor = UIColor(red: 0, green: 0.533, blue: 1, alpha: 1) private let noTyping = Text(" ") @@ -31,6 +31,7 @@ struct MsgContentView: View { var sender: String? = nil var meta: CIMeta? = nil var rightToLeft = false + var showSecrets: Bool @State private var typingIdx = 0 @State private var timer: Timer? @@ -62,7 +63,7 @@ struct MsgContentView: View { } private func msgContentView() -> Text { - var v = messageText(text, formattedText, sender) + var v = messageText(text, formattedText, sender, showSecrets: showSecrets) if let mt = meta { if mt.isLive { v = v + typingIndicator(mt.recent) @@ -84,14 +85,14 @@ struct MsgContentView: View { } } -func messageText(_ text: String, _ formattedText: [FormattedText]?, _ sender: String?, icon: String? = nil, preview: Bool = false) -> Text { +func messageText(_ text: String, _ formattedText: [FormattedText]?, _ sender: String?, icon: String? = nil, preview: Bool = false, showSecrets: Bool) -> Text { let s = text var res: Text if let ft = formattedText, ft.count > 0 && ft.count <= 200 { - res = formatText(ft[0], preview) + res = formatText(ft[0], preview, showSecret: showSecrets) var i = 1 while i < ft.count { - res = res + formatText(ft[i], preview) + res = res + formatText(ft[i], preview, showSecret: showSecrets) i = i + 1 } } else { @@ -110,7 +111,7 @@ func messageText(_ text: String, _ formattedText: [FormattedText]?, _ sender: St } } -private func formatText(_ ft: FormattedText, _ preview: Bool) -> Text { +private func formatText(_ ft: FormattedText, _ preview: Bool, showSecret: Bool) -> Text { let t = ft.text if let f = ft.format { switch (f) { @@ -118,7 +119,13 @@ private func formatText(_ ft: FormattedText, _ preview: Bool) -> Text { case .italic: return Text(t).italic() case .strikeThrough: return Text(t).strikethrough() case .snippet: return Text(t).font(.body.monospaced()) - case .secret: return Text(t).foregroundColor(.clear).underline(color: .primary) + case .secret: return + showSecret + ? Text(t) + : Text(AttributedString(t, attributes: AttributeContainer([ + .foregroundColor: UIColor.clear as Any, + .backgroundColor: UIColor.secondarySystemFill as Any + ]))) case let .colored(color): return Text(t).foregroundColor(color.uiColor) case .uri: return linkText(t, t, preview, prefix: "") case let .simplexLink(linkType, simplexUri, smpHosts): @@ -144,7 +151,7 @@ private func linkText(_ s: String, _ link: String, _ preview: Bool, prefix: Stri ]))).underline() } -private func simplexLinkText(_ linkType: SimplexLinkType, _ smpHosts: [String]) -> String { +func simplexLinkText(_ linkType: SimplexLinkType, _ smpHosts: [String]) -> String { linkType.description + " " + "(via \(smpHosts.first ?? "?"))" } @@ -156,7 +163,8 @@ struct MsgContentView_Previews: PreviewProvider { text: chatItem.text, formattedText: chatItem.formattedText, sender: chatItem.memberDisplayName, - meta: chatItem.meta + meta: chatItem.meta, + showSecrets: false ) .environmentObject(Chat.sampleData) } diff --git a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift index 83c4cdcda6..69cfcd2caf 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemInfoView.swift @@ -168,7 +168,6 @@ struct ChatItemInfoView: View { @ViewBuilder private func itemVersionView(_ itemVersion: ChatItemVersion, _ maxWidth: CGFloat, current: Bool) -> some View { VStack(alignment: .leading, spacing: 4) { textBubble(itemVersion.msgContent.text, itemVersion.formattedText, nil) - .allowsHitTesting(false) .padding(.horizontal, 12) .padding(.vertical, 6) .background(chatItemFrameColor(ci, colorScheme)) @@ -198,7 +197,7 @@ struct ChatItemInfoView: View { @ViewBuilder private func textBubble(_ text: String, _ formattedText: [FormattedText]?, _ sender: String? = nil) -> some View { if text != "" { - messageText(text, formattedText, sender) + TextBubble(text: text, formattedText: formattedText, sender: sender) } else { Text("no text") .italic() @@ -206,6 +205,17 @@ struct ChatItemInfoView: View { } } + private struct TextBubble: View { + var text: String + var formattedText: [FormattedText]? + var sender: String? = nil + @State private var showSecrets = false + + var body: some View { + toggleSecrets(formattedText, $showSecrets, messageText(text, formattedText, sender, showSecrets: showSecrets)) + } + } + @ViewBuilder private func quoteTab(_ qi: CIQuote) -> some View { GeometryReader { g in let maxWidth = (g.size.width - 32) * 0.84 @@ -227,7 +237,6 @@ struct ChatItemInfoView: View { @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)) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 6e2c0c1555..a09c5643b6 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -250,8 +250,8 @@ struct ChatView: View { } private func searchToolbar() -> some View { - HStack { - HStack { + HStack(spacing: 12) { + HStack(spacing: 4) { Image(systemName: "magnifyingglass") TextField("Search", text: $searchText) .focused($searchFocussed) @@ -264,9 +264,9 @@ struct ChatView: View { Image(systemName: "xmark.circle.fill").opacity(searchText == "" ? 0 : 1) } } - .padding(EdgeInsets(top: 8, leading: 6, bottom: 8, trailing: 6)) + .padding(EdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7)) .foregroundColor(.secondary) - .background(Color(.secondarySystemBackground)) + .background(Color(.tertiarySystemFill)) .cornerRadius(10.0) Button ("Cancel") { diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift index 868ae3274a..3eb128cded 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift @@ -51,7 +51,8 @@ struct ContextItemView: View { MsgContentView( chat: chat, text: contextItem.text, - formattedText: contextItem.formattedText + formattedText: contextItem.formattedText, + showSecrets: false ) .multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading) .lineLimit(lines) diff --git a/apps/ios/Shared/Views/Chat/ContactPreferencesView.swift b/apps/ios/Shared/Views/Chat/ContactPreferencesView.swift index ff1892d996..57007fff3f 100644 --- a/apps/ios/Shared/Views/Chat/ContactPreferencesView.swift +++ b/apps/ios/Shared/Views/Chat/ContactPreferencesView.swift @@ -116,7 +116,6 @@ struct ContactPreferencesView: View { private func featureFooter(_ feature: ChatFeature, _ enabled: FeatureEnabled) -> some View { Text(feature.enabledDescription(enabled)) - .frame(height: 36, alignment: .topLeading) } private func savePreferences() { diff --git a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift index 860a6febb0..d88bdfa4a4 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift @@ -28,6 +28,7 @@ struct GroupPreferencesView: View { featureSection(.reactions, $preferences.reactions.enable) featureSection(.voice, $preferences.voice.enable) featureSection(.files, $preferences.files.enable) + featureSection(.history, $preferences.history.enable) if groupInfo.canEdit { Section { @@ -96,7 +97,6 @@ struct GroupPreferencesView: View { } } footer: { Text(feature.enableDescription(enableFeature.wrappedValue, groupInfo.canEdit)) - .frame(height: 36, alignment: .topLeading) } } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupWelcomeView.swift b/apps/ios/Shared/Views/Chat/Group/GroupWelcomeView.swift index 0e47d9dddf..e5ff644a91c 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupWelcomeView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupWelcomeView.swift @@ -53,8 +53,7 @@ struct GroupWelcomeView: View { } private func textPreview() -> some View { - messageText(welcomeText, parseSimpleXMarkdown(welcomeText), nil) - .allowsHitTesting(false) + messageText(welcomeText, parseSimpleXMarkdown(welcomeText), nil, showSecrets: false) .frame(minHeight: 140, alignment: .topLeading) .frame(maxWidth: .infinity, alignment: .leading) } diff --git a/apps/ios/Shared/Views/ChatList/ChatHelp.swift b/apps/ios/Shared/Views/ChatList/ChatHelp.swift index 7741512432..2435c9a4f5 100644 --- a/apps/ios/Shared/Views/ChatList/ChatHelp.swift +++ b/apps/ios/Shared/Views/ChatList/ChatHelp.swift @@ -11,7 +11,7 @@ import SwiftUI struct ChatHelp: View { @EnvironmentObject var chatModel: ChatModel @Binding var showSettings: Bool - @State private var showAddChat = false + @State private var newChatMenuOption: NewChatMenuOption? = nil var body: some View { ScrollView { chatHelp() } @@ -39,13 +39,12 @@ struct ChatHelp: View { HStack(spacing: 8) { Text("Tap button ") - NewChatButton(showAddChat: $showAddChat) + NewChatMenuButton(newChatMenuOption: $newChatMenuOption) Text("above, then choose:") } - Text("**Create link / QR code** for your contact to use.") - Text("**Paste received link** or open it in the browser and tap **Open in mobile app**.") - Text("**Scan QR code**: to connect to your contact in person or via video call.") + Text("**Add contact**: to create a new invitation link, or connect via a link you received.") + Text("**Create group**: to create a new group.") } .padding(.top, 24) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 1d86733206..62955a1040 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -12,8 +12,12 @@ import SimpleXChat struct ChatListView: View { @EnvironmentObject var chatModel: ChatModel @Binding var showSettings: Bool + @State private var searchMode = false + @FocusState private var searchFocussed @State private var searchText = "" - @State private var showAddChat = false + @State private var searchShowingSimplexLink = false + @State private var searchChatFilteredBySimplexLink: String? = nil + @State private var newChatMenuOption: NewChatMenuOption? = nil @State private var userPickerVisible = false @State private var showConnectDesktop = false @AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false @@ -62,11 +66,7 @@ struct ChatListView: View { private var chatListView: some View { VStack { - if chatModel.chats.count > 0 { - chatList.searchable(text: $searchText) - } else { - chatList - } + chatList } .onDisappear() { withAnimation { userPickerVisible = false } } .refreshable { @@ -85,9 +85,9 @@ struct ChatListView: View { secondaryButton: .cancel() )) } - .offset(x: -8) .listStyle(.plain) .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(searchMode) .toolbar { ToolbarItem(placement: .navigationBarLeading) { let user = chatModel.currentUser ?? User.sampleData @@ -124,7 +124,7 @@ struct ChatListView: View { } ToolbarItem(placement: .navigationBarTrailing) { switch chatModel.chatRunning { - case .some(true): NewChatButton(showAddChat: $showAddChat) + case .some(true): NewChatMenuButton(newChatMenuOption: $newChatMenuOption) case .some(false): chatStoppedIcon() case .none: EmptyView() } @@ -144,11 +144,25 @@ struct ChatListView: View { @ViewBuilder private var chatList: some View { let cs = filteredChats() ZStack { - List { - ForEach(cs, id: \.viewId) { chat in - ChatListNavLink(chat: chat) - .padding(.trailing, -16) - .disabled(chatModel.chatRunning != true) + VStack { + List { + if !chatModel.chats.isEmpty { + ChatListSearchBar( + searchMode: $searchMode, + searchFocussed: $searchFocussed, + searchText: $searchText, + searchShowingSimplexLink: $searchShowingSimplexLink, + searchChatFilteredBySimplexLink: $searchChatFilteredBySimplexLink + ) + .listRowSeparator(.hidden) + .frame(maxWidth: .infinity) + } + ForEach(cs, id: \.viewId) { chat in + ChatListNavLink(chat: chat) + .padding(.trailing, -16) + .disabled(chatModel.chatRunning != true) + } + .offset(x: -8) } } .onChange(of: chatModel.chatId) { _ in @@ -182,7 +196,7 @@ struct ChatListView: View { .padding(.trailing, 12) connectButton("Tap to start a new chat") { - showAddChat = true + newChatMenuOption = .newContact } Spacer() @@ -214,22 +228,25 @@ struct ChatListView: View { } private func filteredChats() -> [Chat] { - let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase - return s == "" && !showUnreadAndFavorites + if let linkChatId = searchChatFilteredBySimplexLink { + return chatModel.chats.filter { $0.id == linkChatId } + } else { + let s = searchString() + return s == "" && !showUnreadAndFavorites ? chatModel.chats : chatModel.chats.filter { chat in let cInfo = chat.chatInfo switch cInfo { case let .direct(contact): return s == "" - ? filtered(chat) - : (viewNameContains(cInfo, s) || - contact.profile.displayName.localizedLowercase.contains(s) || - contact.fullName.localizedLowercase.contains(s)) + ? filtered(chat) + : (viewNameContains(cInfo, s) || + contact.profile.displayName.localizedLowercase.contains(s) || + contact.fullName.localizedLowercase.contains(s)) case let .group(gInfo): return s == "" - ? (filtered(chat) || gInfo.membership.memberStatus == .memInvited) - : viewNameContains(cInfo, s) + ? (filtered(chat) || gInfo.membership.memberStatus == .memInvited) + : viewNameContains(cInfo, s) case .contactRequest: return s == "" || viewNameContains(cInfo, s) case let .contactConnection(conn): @@ -238,6 +255,11 @@ struct ChatListView: View { return false } } + } + + func searchString() -> String { + searchShowingSimplexLink ? "" : searchText.trimmingCharacters(in: .whitespaces).localizedLowercase + } func filtered(_ chat: Chat) -> Bool { (chat.chatInfo.chatSettings?.favorite ?? false) || chat.chatStats.unreadCount > 0 || chat.chatStats.unreadChat @@ -249,6 +271,121 @@ struct ChatListView: View { } } +struct ChatListSearchBar: View { + @EnvironmentObject var m: ChatModel + @Binding var searchMode: Bool + @FocusState.Binding var searchFocussed: Bool + @Binding var searchText: String + @Binding var searchShowingSimplexLink: Bool + @Binding var searchChatFilteredBySimplexLink: String? + @State private var ignoreSearchTextChange = false + @State private var showScanCodeSheet = false + @State private var alert: PlanAndConnectAlert? + @State private var sheet: PlanAndConnectActionSheet? + + var body: some View { + VStack(spacing: 12) { + HStack(spacing: 12) { + HStack(spacing: 4) { + Image(systemName: "magnifyingglass") + TextField("Search or paste SimpleX link", text: $searchText) + .foregroundColor(searchShowingSimplexLink ? .secondary : .primary) + .disabled(searchShowingSimplexLink) + .focused($searchFocussed) + .frame(maxWidth: .infinity) + if !searchText.isEmpty { + Image(systemName: "xmark.circle.fill") + .onTapGesture { + searchText = "" + } + } else if !searchFocussed { + HStack(spacing: 24) { + if m.pasteboardHasStrings { + Image(systemName: "doc") + .onTapGesture { + if let str = UIPasteboard.general.string { + searchText = str + } + } + } + + Image(systemName: "qrcode") + .resizable() + .scaledToFit() + .frame(width: 20, height: 20) + .onTapGesture { + showScanCodeSheet = true + } + } + .padding(.trailing, 2) + } + } + .padding(EdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7)) + .foregroundColor(.secondary) + .background(Color(.tertiarySystemFill)) + .cornerRadius(10.0) + + if searchFocussed { + Text("Cancel") + .foregroundColor(.accentColor) + .onTapGesture { + searchText = "" + searchFocussed = false + } + } + } + Divider() + } + .sheet(isPresented: $showScanCodeSheet) { + NewChatView(selection: .connect, showQRCodeScanner: true) + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) // fixes .refreshable in ChatListView affecting nested view + } + .onChange(of: searchFocussed) { sf in + withAnimation { searchMode = sf } + } + .onChange(of: searchText) { t in + if ignoreSearchTextChange { + ignoreSearchTextChange = false + } else { + if let link = strHasSingleSimplexLink(t.trimmingCharacters(in: .whitespaces)) { // if SimpleX link is pasted, show connection dialogue + searchFocussed = false + if case let .simplexLink(linkType, _, smpHosts) = link.format { + ignoreSearchTextChange = true + searchText = simplexLinkText(linkType, smpHosts) + } + searchShowingSimplexLink = true + searchChatFilteredBySimplexLink = nil + connect(link.text) + } else { + if t != "" { // if some other text is pasted, enter search mode + searchFocussed = true + } + searchShowingSimplexLink = false + searchChatFilteredBySimplexLink = nil + } + } + } + .alert(item: $alert) { a in + planAndConnectAlert(a, dismiss: true, cleanup: { searchText = "" }) + } + .actionSheet(item: $sheet) { s in + planAndConnectActionSheet(s, dismiss: true, cleanup: { searchText = "" }) + } + } + + private func connect(_ link: String) { + planAndConnect( + link, + showAlert: { alert = $0 }, + showActionSheet: { sheet = $0 }, + dismiss: false, + incognito: nil, + filterKnownContact: { searchChatFilteredBySimplexLink = $0.id }, + filterKnownGroup: { searchChatFilteredBySimplexLink = $0.id } + ) + } +} + func chatStoppedIcon() -> some View { Button { AlertManager.shared.showAlertMsg( diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 30068114f3..13d91881e6 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -150,7 +150,7 @@ struct ChatPreviewView: View { let msg = draft.message return image("rectangle.and.pencil.and.ellipsis", color: .accentColor) + attachment() - + messageText(msg, parseSimpleXMarkdown(msg), nil, preview: true) + + messageText(msg, parseSimpleXMarkdown(msg), nil, preview: true, showSecrets: false) func image(_ s: String, color: Color = Color(uiColor: .tertiaryLabel)) -> Text { Text(Image(systemName: s)).foregroundColor(color) + Text(" ") @@ -169,7 +169,7 @@ struct ChatPreviewView: View { func chatItemPreview(_ cItem: ChatItem) -> Text { let itemText = cItem.meta.itemDeleted == nil ? cItem.text : NSLocalizedString("marked deleted", comment: "marked deleted chat item preview text") let itemFormattedText = cItem.meta.itemDeleted == nil ? cItem.formattedText : nil - return messageText(itemText, itemFormattedText, cItem.memberDisplayName, icon: attachment(), preview: true) + return messageText(itemText, itemFormattedText, cItem.memberDisplayName, icon: attachment(), preview: true, showSecrets: false) func attachment() -> String? { switch cItem.content.msgContent { diff --git a/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift b/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift index 6d2fba99c6..42e90232d6 100644 --- a/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift +++ b/apps/ios/Shared/Views/ChatList/ContactConnectionInfo.swift @@ -164,6 +164,28 @@ struct ContactConnectionInfo: View { } } +private func shareLinkButton(_ connReqInvitation: String) -> some View { + Button { + showShareSheet(items: [simplexChatLink(connReqInvitation)]) + } label: { + settingsRow("square.and.arrow.up") { + Text("Share 1-time link") + } + } +} + +private func oneTimeLinkLearnMoreButton() -> some View { + NavigationLink { + AddContactLearnMore(showTitle: false) + .navigationTitle("One-time invitation link") + .navigationBarTitleDisplayMode(.large) + } label: { + settingsRow("info.circle") { + Text("Learn more") + } + } +} + struct ContactConnectionInfo_Previews: PreviewProvider { static var previews: some View { ContactConnectionInfo(contactConnection: PendingContactConnection.getSampleData()) diff --git a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift index 182149cbde..45eb783326 100644 --- a/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift +++ b/apps/ios/Shared/Views/NewChat/AddContactLearnMore.swift @@ -9,8 +9,20 @@ import SwiftUI struct AddContactLearnMore: View { + var showTitle: Bool + var body: some View { List { + if showTitle { + Text("One-time invitation link") + .font(.largeTitle) + .bold() + .fixedSize(horizontal: false, vertical: true) + .padding(.vertical) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } VStack(alignment: .leading, spacing: 18) { Text("To connect, your contact can scan QR code or use the link in the app.") Text("If you can't meet in person, show QR code in a video call, or share the link.") @@ -23,6 +35,6 @@ struct AddContactLearnMore: View { struct AddContactLearnMore_Previews: PreviewProvider { static var previews: some View { - AddContactLearnMore() + AddContactLearnMore(showTitle: true) } } diff --git a/apps/ios/Shared/Views/NewChat/AddContactView.swift b/apps/ios/Shared/Views/NewChat/AddContactView.swift deleted file mode 100644 index de8e35d2a6..0000000000 --- a/apps/ios/Shared/Views/NewChat/AddContactView.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// AddContactView.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 29/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI -import CoreImage.CIFilterBuiltins -import SimpleXChat - -struct AddContactView: View { - @EnvironmentObject private var chatModel: ChatModel - @Binding var contactConnection: PendingContactConnection? - var connReqInvitation: String - @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false - - var body: some View { - VStack { - List { - Section { - if connReqInvitation != "" { - SimpleXLinkQRCode(uri: connReqInvitation) - } else { - ProgressView() - .progressViewStyle(.circular) - .scaleEffect(2) - .frame(maxWidth: .infinity) - .padding(.vertical) - } - IncognitoToggle(incognitoEnabled: $incognitoDefault) - .disabled(contactConnection == nil) - shareLinkButton(connReqInvitation) - oneTimeLinkLearnMoreButton() - } header: { - Text("1-time link") - } footer: { - sharedProfileInfo(incognitoDefault) - } - } - } - .onAppear { chatModel.connReqInv = connReqInvitation } - .onChange(of: incognitoDefault) { incognito in - Task { - do { - if let contactConn = contactConnection, - let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) { - await MainActor.run { - contactConnection = conn - chatModel.updateContactConnection(conn) - } - } - } catch { - logger.error("apiSetConnectionIncognito error: \(responseError(error))") - } - } - } - } -} - -struct IncognitoToggle: View { - @Binding var incognitoEnabled: Bool - @State private var showIncognitoSheet = false - - var body: some View { - ZStack(alignment: .leading) { - Image(systemName: incognitoEnabled ? "theatermasks.fill" : "theatermasks") - .frame(maxWidth: 24, maxHeight: 24, alignment: .center) - .foregroundColor(incognitoEnabled ? Color.indigo : .secondary) - .font(.system(size: 14)) - Toggle(isOn: $incognitoEnabled) { - HStack(spacing: 6) { - Text("Incognito") - Image(systemName: "info.circle") - .foregroundColor(.accentColor) - .font(.system(size: 14)) - } - .onTapGesture { - showIncognitoSheet = true - } - } - .padding(.leading, 36) - } - .sheet(isPresented: $showIncognitoSheet) { - IncognitoHelp() - } - } -} - -func sharedProfileInfo(_ incognito: Bool) -> Text { - let name = ChatModel.shared.currentUser?.displayName ?? "" - return Text( - incognito - ? "A new random profile will be shared." - : "Your profile **\(name)** will be shared." - ) -} - -func shareLinkButton(_ connReqInvitation: String) -> some View { - Button { - showShareSheet(items: [simplexChatLink(connReqInvitation)]) - } label: { - settingsRow("square.and.arrow.up") { - Text("Share 1-time link") - } - } -} - -func oneTimeLinkLearnMoreButton() -> some View { - NavigationLink { - AddContactLearnMore() - .navigationTitle("One-time invitation link") - .navigationBarTitleDisplayMode(.large) - } label: { - settingsRow("info.circle") { - Text("Learn more") - } - } -} - -struct AddContactView_Previews: PreviewProvider { - static var previews: some View { - AddContactView( - contactConnection: Binding.constant(PendingContactConnection.getSampleData()), - connReqInvitation: "https://simplex.chat/invitation#/?v=1&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FFe5ICmvrm4wkrr6X1LTMii-lhBqLeB76%23MCowBQYDK2VuAyEAdhZZsHpuaAk3Hh1q0uNb_6hGTpuwBIrsp2z9U2T0oC0%3D&e2e=v%3D1%26x3dh%3DMEIwBQYDK2VvAzkAcz6jJk71InuxA0bOX7OUhddfB8Ov7xwQIlIDeXBRZaOntUU4brU5Y3rBzroZBdQJi0FKdtt_D7I%3D%2CMEIwBQYDK2VvAzkA-hDvk1duBi1hlOr08VWSI-Ou4JNNSQjseY69QyKm7Kgg1zZjbpGfyBqSZ2eqys6xtoV4ZtoQUXQ%3D" - ) - } -} diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index 6c7919669b..3f3623033e 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -187,6 +187,7 @@ struct AddGroupView: View { hideKeyboard() do { profile.displayName = profile.displayName.trimmingCharacters(in: .whitespaces) + profile.groupPreferences = GroupPreferences(history: GroupPreference(enable: .on)) let gInfo = try apiNewGroup(incognito: incognitoDefault, groupProfile: profile) Task { let groupMembers = await apiListMembers(gInfo.groupId) diff --git a/apps/ios/Shared/Views/NewChat/ConnectViaLinkView.swift b/apps/ios/Shared/Views/NewChat/ConnectViaLinkView.swift deleted file mode 100644 index 9df767485e..0000000000 --- a/apps/ios/Shared/Views/NewChat/ConnectViaLinkView.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// ConnectViaLinkView.swift -// SimpleX (iOS) -// -// Created by Evgeny on 21/09/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -enum ConnectViaLinkTab: String { - case scan - case paste -} - -struct ConnectViaLinkView: View { - @State private var selection: ConnectViaLinkTab = connectViaLinkTabDefault.get() - - var body: some View { - TabView(selection: $selection) { - ScanToConnectView() - .tabItem { - Label("Scan QR code", systemImage: "qrcode") - } - .tag(ConnectViaLinkTab.scan) - PasteToConnectView() - .tabItem { - Label("Paste received link", systemImage: "doc.plaintext") - } - .tag(ConnectViaLinkTab.paste) - } - .onChange(of: selection) { _ in - connectViaLinkTabDefault.set(selection) - } - } -} - -struct ConnectViaLinkView_Previews: PreviewProvider { - static var previews: some View { - ConnectViaLinkView() - } -} diff --git a/apps/ios/Shared/Views/NewChat/CreateLinkView.swift b/apps/ios/Shared/Views/NewChat/CreateLinkView.swift deleted file mode 100644 index 3be9e1c3b3..0000000000 --- a/apps/ios/Shared/Views/NewChat/CreateLinkView.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// CreateLinkView.swift -// SimpleX (iOS) -// -// Created by Evgeny on 21/09/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI -import SimpleXChat - -enum CreateLinkTab { - case oneTime - case longTerm - - var title: LocalizedStringKey { - switch self { - case .oneTime: return "One-time invitation link" - case .longTerm: return "Your SimpleX address" - } - } -} - -struct CreateLinkView: View { - @EnvironmentObject var m: ChatModel - @State var selection: CreateLinkTab - @State var connReqInvitation: String = "" - @State var contactConnection: PendingContactConnection? = nil - @State private var creatingConnReq = false - var viaNavLink = false - - var body: some View { - if viaNavLink { - createLinkView() - } else { - NavigationView { - createLinkView() - } - } - } - - private func createLinkView() -> some View { - TabView(selection: $selection) { - AddContactView(contactConnection: $contactConnection, connReqInvitation: connReqInvitation) - .tabItem { - Label( - connReqInvitation == "" - ? "Create one-time invitation link" - : "One-time invitation link", - systemImage: "1.circle" - ) - } - .tag(CreateLinkTab.oneTime) - UserAddressView(viaCreateLinkView: true) - .tabItem { - Label("Your SimpleX address", systemImage: "infinity.circle") - } - .tag(CreateLinkTab.longTerm) - } - .onChange(of: selection) { _ in - if case .oneTime = selection, connReqInvitation == "", contactConnection == nil && !creatingConnReq { - createInvitation() - } - } - .onAppear { m.connReqInv = connReqInvitation } - .onDisappear { m.connReqInv = nil } - .navigationTitle(selection.title) - .navigationBarTitleDisplayMode(.large) - } - - private func createInvitation() { - creatingConnReq = true - Task { - if let (connReq, pcc) = await apiAddContact(incognito: incognitoGroupDefault.get()) { - await MainActor.run { - m.updateContactConnection(pcc) - connReqInvitation = connReq - contactConnection = pcc - m.connReqInv = connReq - } - } else { - await MainActor.run { - creatingConnReq = false - } - } - } - } -} - -struct CreateLinkView_Previews: PreviewProvider { - static var previews: some View { - CreateLinkView(selection: CreateLinkTab.oneTime) - } -} diff --git a/apps/ios/Shared/Views/NewChat/NewChatButton.swift b/apps/ios/Shared/Views/NewChat/NewChatButton.swift deleted file mode 100644 index 170805b488..0000000000 --- a/apps/ios/Shared/Views/NewChat/NewChatButton.swift +++ /dev/null @@ -1,466 +0,0 @@ -// -// NewChatButton.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 31/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI -import SimpleXChat - -enum NewChatAction: Identifiable { - case createLink(link: String, connection: PendingContactConnection) - case connectViaLink - case createGroup - - var id: String { - switch self { - case let .createLink(link, _): return "createLink \(link)" - case .connectViaLink: return "connectViaLink" - case .createGroup: return "createGroup" - } - } -} - -struct NewChatButton: View { - @Binding var showAddChat: Bool - @State private var actionSheet: NewChatAction? - - var body: some View { - Button { showAddChat = true } label: { - Image(systemName: "square.and.pencil") - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - } - .confirmationDialog("Start a new chat", isPresented: $showAddChat, titleVisibility: .visible) { - Button("Share one-time invitation link") { addContactAction() } - Button("Connect via link / QR code") { actionSheet = .connectViaLink } - Button("Create secret group") { actionSheet = .createGroup } - } - .sheet(item: $actionSheet) { sheet in - switch sheet { - case let .createLink(link, pcc): - CreateLinkView(selection: .oneTime, connReqInvitation: link, contactConnection: pcc) - case .connectViaLink: ConnectViaLinkView() - case .createGroup: AddGroupView() - } - } - } - - func addContactAction() { - Task { - if let (connReq, pcc) = await apiAddContact(incognito: incognitoGroupDefault.get()) { - await MainActor.run { - ChatModel.shared.updateContactConnection(pcc) - } - actionSheet = .createLink(link: connReq, connection: pcc) - } - } - } -} - -enum PlanAndConnectAlert: Identifiable { - case ownInvitationLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) - case invitationLinkConnecting(connectionLink: String) - case ownContactAddressConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) - case contactAddressConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) - case groupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) - case groupLinkConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) - case groupLinkConnecting(connectionLink: String, groupInfo: GroupInfo?) - - var id: String { - switch self { - case let .ownInvitationLinkConfirmConnect(connectionLink, _, _): return "ownInvitationLinkConfirmConnect \(connectionLink)" - case let .invitationLinkConnecting(connectionLink): return "invitationLinkConnecting \(connectionLink)" - case let .ownContactAddressConfirmConnect(connectionLink, _, _): return "ownContactAddressConfirmConnect \(connectionLink)" - case let .contactAddressConnectingConfirmReconnect(connectionLink, _, _): return "contactAddressConnectingConfirmReconnect \(connectionLink)" - case let .groupLinkConfirmConnect(connectionLink, _, _): return "groupLinkConfirmConnect \(connectionLink)" - case let .groupLinkConnectingConfirmReconnect(connectionLink, _, _): return "groupLinkConnectingConfirmReconnect \(connectionLink)" - case let .groupLinkConnecting(connectionLink, _): return "groupLinkConnecting \(connectionLink)" - } - } -} - -func planAndConnectAlert(_ alert: PlanAndConnectAlert, dismiss: Bool) -> Alert { - switch alert { - case let .ownInvitationLinkConfirmConnect(connectionLink, connectionPlan, incognito): - return Alert( - title: Text("Connect to yourself?"), - message: Text("This is your own one-time link!"), - primaryButton: .destructive( - Text(incognito ? "Connect incognito" : "Connect"), - action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) } - ), - secondaryButton: .cancel() - ) - case .invitationLinkConnecting: - return Alert( - title: Text("Already connecting!"), - message: Text("You are already connecting via this one-time link!") - ) - case let .ownContactAddressConfirmConnect(connectionLink, connectionPlan, incognito): - return Alert( - title: Text("Connect to yourself?"), - message: Text("This is your own SimpleX address!"), - primaryButton: .destructive( - Text(incognito ? "Connect incognito" : "Connect"), - action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) } - ), - secondaryButton: .cancel() - ) - case let .contactAddressConnectingConfirmReconnect(connectionLink, connectionPlan, incognito): - return Alert( - title: Text("Repeat connection request?"), - message: Text("You have already requested connection via this address!"), - primaryButton: .destructive( - Text(incognito ? "Connect incognito" : "Connect"), - action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) } - ), - secondaryButton: .cancel() - ) - case let .groupLinkConfirmConnect(connectionLink, connectionPlan, incognito): - return Alert( - title: Text("Join group?"), - message: Text("You will connect to all group members."), - primaryButton: .default( - Text(incognito ? "Join incognito" : "Join"), - action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) } - ), - secondaryButton: .cancel() - ) - case let .groupLinkConnectingConfirmReconnect(connectionLink, connectionPlan, incognito): - return Alert( - title: Text("Repeat join request?"), - message: Text("You are already joining the group via this link!"), - primaryButton: .destructive( - Text(incognito ? "Join incognito" : "Join"), - action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) } - ), - secondaryButton: .cancel() - ) - case let .groupLinkConnecting(_, groupInfo): - if let groupInfo = groupInfo { - return Alert( - title: Text("Group already exists!"), - message: Text("You are already joining the group \(groupInfo.displayName).") - ) - } else { - return Alert( - title: Text("Already joining the group!"), - message: Text("You are already joining the group via this link.") - ) - } - } -} - -enum PlanAndConnectActionSheet: Identifiable { - case askCurrentOrIncognitoProfile(connectionLink: String, connectionPlan: ConnectionPlan?, title: LocalizedStringKey) - case askCurrentOrIncognitoProfileDestructive(connectionLink: String, connectionPlan: ConnectionPlan, title: LocalizedStringKey) - case askCurrentOrIncognitoProfileConnectContactViaAddress(contact: Contact) - case ownGroupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool?, groupInfo: GroupInfo) - - var id: String { - switch self { - case let .askCurrentOrIncognitoProfile(connectionLink, _, _): return "askCurrentOrIncognitoProfile \(connectionLink)" - case let .askCurrentOrIncognitoProfileDestructive(connectionLink, _, _): return "askCurrentOrIncognitoProfileDestructive \(connectionLink)" - case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): return "askCurrentOrIncognitoProfileConnectContactViaAddress \(contact.contactId)" - case let .ownGroupLinkConfirmConnect(connectionLink, _, _, _): return "ownGroupLinkConfirmConnect \(connectionLink)" - } - } -} - -func planAndConnectActionSheet(_ sheet: PlanAndConnectActionSheet, dismiss: Bool) -> ActionSheet { - switch sheet { - case let .askCurrentOrIncognitoProfile(connectionLink, connectionPlan, title): - return ActionSheet( - title: Text(title), - buttons: [ - .default(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) }, - .default(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) }, - .cancel() - ] - ) - case let .askCurrentOrIncognitoProfileDestructive(connectionLink, connectionPlan, title): - return ActionSheet( - title: Text(title), - buttons: [ - .destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) }, - .destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) }, - .cancel() - ] - ) - case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): - return ActionSheet( - title: Text("Connect with \(contact.chatViewName)"), - buttons: [ - .default(Text("Use current profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: false) }, - .default(Text("Use new incognito profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: true) }, - .cancel() - ] - ) - case let .ownGroupLinkConfirmConnect(connectionLink, connectionPlan, incognito, groupInfo): - if let incognito = incognito { - return ActionSheet( - title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"), - buttons: [ - .default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) }, - .destructive(Text(incognito ? "Join incognito" : "Join with current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }, - .cancel() - ] - ) - } else { - return ActionSheet( - title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"), - buttons: [ - .default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) }, - .destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) }, - .destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) }, - .cancel() - ] - ) - } - } -} - -func planAndConnect( - _ connectionLink: String, - showAlert: @escaping (PlanAndConnectAlert) -> Void, - showActionSheet: @escaping (PlanAndConnectActionSheet) -> Void, - dismiss: Bool, - incognito: Bool? -) { - Task { - do { - let connectionPlan = try await apiConnectPlan(connReq: connectionLink) - switch connectionPlan { - case let .invitationLink(ilp): - switch ilp { - case .ok: - logger.debug("planAndConnect, .invitationLink, .ok, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) - } else { - showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via one-time link")) - } - case .ownLink: - logger.debug("planAndConnect, .invitationLink, .ownLink, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - showAlert(.ownInvitationLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) - } else { - showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own one-time link!")) - } - case let .connecting(contact_): - logger.debug("planAndConnect, .invitationLink, .connecting, incognito=\(incognito?.description ?? "nil")") - if let contact = contact_ { - openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) } - } else { - showAlert(.invitationLinkConnecting(connectionLink: connectionLink)) - } - case let .known(contact): - logger.debug("planAndConnect, .invitationLink, .known, incognito=\(incognito?.description ?? "nil")") - openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) } - } - case let .contactAddress(cap): - switch cap { - case .ok: - logger.debug("planAndConnect, .contactAddress, .ok, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) - } else { - showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via contact address")) - } - case .ownLink: - logger.debug("planAndConnect, .contactAddress, .ownLink, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - showAlert(.ownContactAddressConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) - } else { - showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own SimpleX address!")) - } - case .connectingConfirmReconnect: - logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - showAlert(.contactAddressConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) - } else { - showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You have already requested connection!\nRepeat connection request?")) - } - case let .connectingProhibit(contact): - logger.debug("planAndConnect, .contactAddress, .connectingProhibit, incognito=\(incognito?.description ?? "nil")") - openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) } - case let .known(contact): - logger.debug("planAndConnect, .contactAddress, .known, incognito=\(incognito?.description ?? "nil")") - openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) } - case let .contactViaAddress(contact): - logger.debug("planAndConnect, .contactAddress, .contactViaAddress, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - connectContactViaAddress_(contact, dismiss: dismiss, incognito: incognito) - } else { - showActionSheet(.askCurrentOrIncognitoProfileConnectContactViaAddress(contact: contact)) - } - } - case let .groupLink(glp): - switch glp { - case .ok: - if let incognito = incognito { - showAlert(.groupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) - } else { - showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Join group")) - } - case let .ownLink(groupInfo): - logger.debug("planAndConnect, .groupLink, .ownLink, incognito=\(incognito?.description ?? "nil")") - showActionSheet(.ownGroupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito, groupInfo: groupInfo)) - case .connectingConfirmReconnect: - logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")") - if let incognito = incognito { - showAlert(.groupLinkConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) - } else { - showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You are already joining the group!\nRepeat join request?")) - } - case let .connectingProhibit(groupInfo_): - logger.debug("planAndConnect, .groupLink, .connectingProhibit, incognito=\(incognito?.description ?? "nil")") - showAlert(.groupLinkConnecting(connectionLink: connectionLink, groupInfo: groupInfo_)) - case let .known(groupInfo): - logger.debug("planAndConnect, .groupLink, .known, incognito=\(incognito?.description ?? "nil")") - openKnownGroup(groupInfo, dismiss: dismiss) { AlertManager.shared.showAlert(groupAlreadyExistsAlert(groupInfo)) } - } - } - } catch { - logger.debug("planAndConnect, plan error") - if let incognito = incognito { - connectViaLink(connectionLink, connectionPlan: nil, dismiss: dismiss, incognito: incognito) - } else { - showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: nil, title: "Connect via link")) - } - } - } -} - -private func connectContactViaAddress_(_ contact: Contact, dismiss: Bool, incognito: Bool) { - Task { - if dismiss { - DispatchQueue.main.async { - dismissAllSheets(animated: true) - } - } - _ = await connectContactViaAddress(contact.contactId, incognito) - } -} - -private func connectViaLink(_ connectionLink: String, connectionPlan: ConnectionPlan?, dismiss: Bool, incognito: Bool) { - Task { - if let (connReqType, pcc) = await apiConnect(incognito: incognito, connReq: connectionLink) { - await MainActor.run { - ChatModel.shared.updateContactConnection(pcc) - } - let crt: ConnReqType - if let plan = connectionPlan { - crt = planToConnReqType(plan) - } else { - crt = connReqType - } - DispatchQueue.main.async { - if dismiss { - dismissAllSheets(animated: true) { - AlertManager.shared.showAlert(connReqSentAlert(crt)) - } - } else { - AlertManager.shared.showAlert(connReqSentAlert(crt)) - } - } - } else { - if dismiss { - DispatchQueue.main.async { - dismissAllSheets(animated: true) - } - } - } - } -} - -func openKnownContact(_ contact: Contact, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) { - Task { - let m = ChatModel.shared - if let c = m.getContactChat(contact.contactId) { - DispatchQueue.main.async { - if dismiss { - dismissAllSheets(animated: true) { - m.chatId = c.id - showAlreadyExistsAlert?() - } - } else { - m.chatId = c.id - showAlreadyExistsAlert?() - } - } - } - } -} - -func openKnownGroup(_ groupInfo: GroupInfo, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) { - Task { - let m = ChatModel.shared - if let g = m.getGroupChat(groupInfo.groupId) { - DispatchQueue.main.async { - if dismiss { - dismissAllSheets(animated: true) { - m.chatId = g.id - showAlreadyExistsAlert?() - } - } else { - m.chatId = g.id - showAlreadyExistsAlert?() - } - } - } - } -} - -func contactAlreadyConnectingAlert(_ contact: Contact) -> Alert { - mkAlert( - title: "Contact already exists", - message: "You are already connecting to \(contact.displayName)." - ) -} - -func groupAlreadyExistsAlert(_ groupInfo: GroupInfo) -> Alert { - mkAlert( - title: "Group already exists", - message: "You are already in group \(groupInfo.displayName)." - ) -} - -enum ConnReqType: Equatable { - case invitation - case contact - case groupLink - - var connReqSentText: LocalizedStringKey { - switch self { - case .invitation: return "You will be connected when your contact's device is online, please wait or check later!" - case .contact: return "You will be connected when your connection request is accepted, please wait or check later!" - case .groupLink: return "You will be connected when group link host's device is online, please wait or check later!" - } - } -} - -private func planToConnReqType(_ connectionPlan: ConnectionPlan) -> ConnReqType { - switch connectionPlan { - case .invitationLink: return .invitation - case .contactAddress: return .contact - case .groupLink: return .groupLink - } -} - -func connReqSentAlert(_ type: ConnReqType) -> Alert { - return mkAlert( - title: "Connection request sent!", - message: type.connReqSentText - ) -} - -struct NewChatButton_Previews: PreviewProvider { - static var previews: some View { - NewChatButton(showAddChat: Binding.constant(false)) - } -} diff --git a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift new file mode 100644 index 0000000000..c3452ce18d --- /dev/null +++ b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift @@ -0,0 +1,52 @@ +// +// NewChatMenuButton.swift +// SimpleX (iOS) +// +// Created by spaced4ndy on 28.11.2023. +// Copyright © 2023 SimpleX Chat. All rights reserved. +// + +import SwiftUI + +enum NewChatMenuOption: Identifiable { + case newContact + case newGroup + + var id: Self { self } +} + +struct NewChatMenuButton: View { + @Binding var newChatMenuOption: NewChatMenuOption? + + var body: some View { + Menu { + Button { + newChatMenuOption = .newContact + } label: { + Text("Add contact") + } + Button { + newChatMenuOption = .newGroup + } label: { + Text("Create group") + } + } label: { + Image(systemName: "square.and.pencil") + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } + .sheet(item: $newChatMenuOption) { opt in + switch opt { + case .newContact: NewChatView(selection: .invite) + case .newGroup: AddGroupView() + } + } + } +} + +#Preview { + NewChatMenuButton( + newChatMenuOption: Binding.constant(nil) + ) +} diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift new file mode 100644 index 0000000000..b78d92ffc8 --- /dev/null +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -0,0 +1,959 @@ +// +// NewChatView.swift +// SimpleX (iOS) +// +// Created by spaced4ndy on 28.11.2023. +// Copyright © 2023 SimpleX Chat. All rights reserved. +// + +import SwiftUI +import SimpleXChat +import CodeScanner +import AVFoundation + +enum SomeAlert: Identifiable { + case someAlert(alert: Alert, id: String) + + var id: String { + switch self { + case let .someAlert(_, id): return id + } + } +} + +private enum NewChatViewAlert: Identifiable { + case planAndConnectAlert(alert: PlanAndConnectAlert) + case newChatSomeAlert(alert: SomeAlert) + + var id: String { + switch self { + case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)" + case let .newChatSomeAlert(alert): return "newChatSomeAlert \(alert.id)" + } + } +} + +enum NewChatOption: Identifiable { + case invite + case connect + + var id: Self { self } +} + +struct NewChatView: View { + @EnvironmentObject var m: ChatModel + @State var selection: NewChatOption + @State var showQRCodeScanner = false + @State private var invitationUsed: Bool = false + @State private var contactConnection: PendingContactConnection? = nil + @State private var connReqInvitation: String = "" + @State private var creatingConnReq = false + @State private var pastedLink: String = "" + @State private var alert: NewChatViewAlert? + + var body: some View { + VStack(alignment: .leading) { + HStack { + Text("New chat") + .font(.largeTitle) + .bold() + .fixedSize(horizontal: false, vertical: true) + Spacer() + InfoSheetButton { + AddContactLearnMore(showTitle: true) + } + } + .padding() + .padding(.top) + + Picker("New chat", selection: $selection) { + Label("Add contact", systemImage: "link") + .tag(NewChatOption.invite) + Label("Connect via link", systemImage: "qrcode") + .tag(NewChatOption.connect) + } + .pickerStyle(.segmented) + .padding() + + VStack { + // it seems there's a bug in iOS 15 if several views in switch (or if-else) statement have different transitions + // https://developer.apple.com/forums/thread/714977?answerId=731615022#731615022 + if case .invite = selection { + prepareAndInviteView() + .transition(.move(edge: .leading)) + .onAppear { + createInvitation() + } + } + if case .connect = selection { + ConnectView(showQRCodeScanner: showQRCodeScanner, pastedLink: $pastedLink, alert: $alert) + .transition(.move(edge: .trailing)) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background( + // Rectangle is needed for swipe gesture to work on mostly empty views (creatingLinkProgressView and retryButton) + Rectangle() + .fill(Color(uiColor: .systemGroupedBackground)) + ) + .animation(.easeInOut(duration: 0.3333), value: selection) + .gesture(DragGesture(minimumDistance: 20.0, coordinateSpace: .local) + .onChanged { value in + switch(value.translation.width, value.translation.height) { + case (...0, -30...30): // left swipe + if selection == .invite { + selection = .connect + } + case (0..., -30...30): // right swipe + if selection == .connect { + selection = .invite + } + default: () + } + } + ) + } + .background(Color(.systemGroupedBackground)) + .onChange(of: invitationUsed) { used in + if used && !(m.showingInvitation?.connChatUsed ?? true) { + m.markShowingInvitationUsed() + } + } + .onDisappear { + if !(m.showingInvitation?.connChatUsed ?? true), + let conn = contactConnection { + AlertManager.shared.showAlert(Alert( + title: Text("Keep unused invitation?"), + message: Text("You can view invitation link again in connection details."), + primaryButton: .default(Text("Keep")) {}, + secondaryButton: .destructive(Text("Delete")) { + Task { + await deleteChat(Chat( + chatInfo: .contactConnection(contactConnection: conn), + chatItems: [] + )) + } + } + )) + } + m.showingInvitation = nil + } + .alert(item: $alert) { a in + switch(a) { + case let .planAndConnectAlert(alert): + return planAndConnectAlert(alert, dismiss: true, cleanup: { pastedLink = "" }) + case let .newChatSomeAlert(.someAlert(alert, _)): + return alert + } + } + } + + private func prepareAndInviteView() -> some View { + ZStack { // ZStack is needed for views to not make transitions between each other + if connReqInvitation != "" { + InviteView( + invitationUsed: $invitationUsed, + contactConnection: $contactConnection, + connReqInvitation: connReqInvitation + ) + } else if creatingConnReq { + creatingLinkProgressView() + } else { + retryButton() + } + } + } + + private func createInvitation() { + if connReqInvitation == "" && contactConnection == nil && !creatingConnReq { + creatingConnReq = true + Task { + _ = try? await Task.sleep(nanoseconds: 250_000000) + let (r, apiAlert) = await apiAddContact(incognito: incognitoGroupDefault.get()) + if let (connReq, pcc) = r { + await MainActor.run { + m.updateContactConnection(pcc) + m.showingInvitation = ShowingInvitation(connId: pcc.id, connChatUsed: false) + connReqInvitation = connReq + contactConnection = pcc + } + } else { + await MainActor.run { + creatingConnReq = false + if let apiAlert = apiAlert { + alert = .newChatSomeAlert(alert: .someAlert(alert: apiAlert, id: "createInvitation error")) + } + } + } + } + } + } + + // Rectangle here and in retryButton are needed for gesture to work + private func creatingLinkProgressView() -> some View { + ProgressView("Creating link…") + .progressViewStyle(.circular) + } + + private func retryButton() -> some View { + Button(action: createInvitation) { + VStack(spacing: 6) { + Image(systemName: "arrow.counterclockwise") + Text("Retry") + } + } + } +} + +private struct InviteView: View { + @EnvironmentObject var chatModel: ChatModel + @Binding var invitationUsed: Bool + @Binding var contactConnection: PendingContactConnection? + var connReqInvitation: String + @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false + + var body: some View { + List { + Section("Share this 1-time invite link") { + shareLinkView() + } + .listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)) + + qrCodeView() + + Section { + IncognitoToggle(incognitoEnabled: $incognitoDefault) + } footer: { + sharedProfileInfo(incognitoDefault) + } + } + .onChange(of: incognitoDefault) { incognito in + Task { + do { + if let contactConn = contactConnection, + let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) { + await MainActor.run { + contactConnection = conn + chatModel.updateContactConnection(conn) + } + } + } catch { + logger.error("apiSetConnectionIncognito error: \(responseError(error))") + } + } + setInvitationUsed() + } + } + + private func shareLinkView() -> some View { + HStack { + let link = simplexChatLink(connReqInvitation) + linkTextView(link) + Button { + showShareSheet(items: [link]) + setInvitationUsed() + } label: { + Image(systemName: "square.and.arrow.up") + .padding(.top, -7) + } + } + .frame(maxWidth: .infinity) + } + + private func qrCodeView() -> some View { + Section("Or show this code") { + SimpleXLinkQRCode(uri: connReqInvitation, onShare: setInvitationUsed) + .padding() + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color(uiColor: .secondarySystemGroupedBackground)) + ) + .padding(.horizontal) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } + } + + private func setInvitationUsed() { + if !invitationUsed { + invitationUsed = true + } + } +} + +private struct ConnectView: View { + @Environment(\.dismiss) var dismiss: DismissAction + @State var showQRCodeScanner = false + @State private var cameraAuthorizationStatus: AVAuthorizationStatus? + @Binding var pastedLink: String + @Binding var alert: NewChatViewAlert? + @State private var sheet: PlanAndConnectActionSheet? + + var body: some View { + List { + Section("Paste the link you received") { + pasteLinkView() + } + + scanCodeView() + } + .actionSheet(item: $sheet) { s in + planAndConnectActionSheet(s, dismiss: true, cleanup: { pastedLink = "" }) + } + .onAppear { + let status = AVCaptureDevice.authorizationStatus(for: .video) + cameraAuthorizationStatus = status + if showQRCodeScanner { + switch status { + case .notDetermined: askCameraAuthorization() + case .restricted: showQRCodeScanner = false + case .denied: showQRCodeScanner = false + case .authorized: () + @unknown default: askCameraAuthorization() + } + } + } + } + + func askCameraAuthorization(_ cb: (() -> Void)? = nil) { + AVCaptureDevice.requestAccess(for: .video) { allowed in + cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video) + if allowed { cb?() } + } + } + + @ViewBuilder private func pasteLinkView() -> some View { + if pastedLink == "" { + Button { + if let str = UIPasteboard.general.string { + if let link = strHasSingleSimplexLink(str.trimmingCharacters(in: .whitespaces)) { + pastedLink = link.text + // It would be good to hide it, but right now it is not clear how to release camera in CodeScanner + // https://github.com/twostraws/CodeScanner/issues/121 + // No known tricks worked (changing view ID, wrapping it in another view, etc.) + // showQRCodeScanner = false + connect(pastedLink) + } else { + alert = .newChatSomeAlert(alert: .someAlert( + alert: mkAlert(title: "Invalid link", message: "The text you pasted is not a SimpleX link."), + id: "pasteLinkView: code is not a SimpleX link" + )) + } + } + } label: { + Text("Tap to paste link") + } + .disabled(!ChatModel.shared.pasteboardHasStrings) + .frame(maxWidth: .infinity, alignment: .center) + } else { + linkTextView(pastedLink) + } + } + + private func scanCodeView() -> some View { + Section("Or scan QR code") { + if showQRCodeScanner, case .authorized = cameraAuthorizationStatus { + CodeScannerView(codeTypes: [.qr], scanMode: .continuous, completion: processQRCode) + .aspectRatio(1, contentMode: .fit) + .cornerRadius(12) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + .padding(.horizontal) + } else { + Button { + switch cameraAuthorizationStatus { + case .notDetermined: askCameraAuthorization { showQRCodeScanner = true } + case .restricted: () + case .denied: UIApplication.shared.open(appSettingsURL) + case .authorized: showQRCodeScanner = true + default: askCameraAuthorization { showQRCodeScanner = true } + } + } label: { + ZStack { + Rectangle() + .aspectRatio(contentMode: .fill) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .foregroundColor(Color.clear) + switch cameraAuthorizationStatus { + case .restricted: Text("Camera not available") + case .denied: Label("Enable camera access", systemImage: "camera") + default: Label("Tap to scan", systemImage: "qrcode") + } + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center) + .padding() + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color(uiColor: .secondarySystemGroupedBackground)) + ) + .padding(.horizontal) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + .disabled(cameraAuthorizationStatus == .restricted) + } + } + } + + private func processQRCode(_ resp: Result) { + switch resp { + case let .success(r): + let link = r.string + if strIsSimplexLink(r.string) { + connect(link) + } else { + alert = .newChatSomeAlert(alert: .someAlert( + alert: mkAlert(title: "Invalid QR code", message: "The code you scanned is not a SimpleX link QR code."), + id: "processQRCode: code is not a SimpleX link" + )) + } + case let .failure(e): + logger.error("processQRCode QR code error: \(e.localizedDescription)") + alert = .newChatSomeAlert(alert: .someAlert( + alert: mkAlert(title: "Invalid QR code", message: "Error scanning code: \(e.localizedDescription)"), + id: "processQRCode: failure" + )) + } + } + + private func connect(_ link: String) { + planAndConnect( + link, + showAlert: { alert = .planAndConnectAlert(alert: $0) }, + showActionSheet: { sheet = $0 }, + dismiss: true, + incognito: nil + ) + } +} + +private func linkTextView(_ link: String) -> some View { + Text(link) + .lineLimit(1) + .font(.caption) + .truncationMode(.middle) +} + +struct InfoSheetButton: View { + @ViewBuilder let content: Content + @State private var showInfoSheet = false + + var body: some View { + Button { + showInfoSheet = true + } label: { + Image(systemName: "info.circle") + .resizable() + .scaledToFit() + .frame(width: 24, height: 24) + } + .sheet(isPresented: $showInfoSheet) { + content + } + } +} + +func strIsSimplexLink(_ str: String) -> Bool { + if let parsedMd = parseSimpleXMarkdown(str), + parsedMd.count == 1, + case .simplexLink = parsedMd[0].format { + return true + } else { + return false + } +} + +func strHasSingleSimplexLink(_ str: String) -> FormattedText? { + if let parsedMd = parseSimpleXMarkdown(str) { + let parsedLinks = parsedMd.filter({ $0.format?.isSimplexLink ?? false }) + if parsedLinks.count == 1 { + return parsedLinks[0] + } else { + return nil + } + } else { + return nil + } +} + +struct IncognitoToggle: View { + @Binding var incognitoEnabled: Bool + @State private var showIncognitoSheet = false + + var body: some View { + ZStack(alignment: .leading) { + Image(systemName: incognitoEnabled ? "theatermasks.fill" : "theatermasks") + .frame(maxWidth: 24, maxHeight: 24, alignment: .center) + .foregroundColor(incognitoEnabled ? Color.indigo : .secondary) + .font(.system(size: 14)) + Toggle(isOn: $incognitoEnabled) { + HStack(spacing: 6) { + Text("Incognito") + Image(systemName: "info.circle") + .foregroundColor(.accentColor) + .font(.system(size: 14)) + } + .onTapGesture { + showIncognitoSheet = true + } + } + .padding(.leading, 36) + } + .sheet(isPresented: $showIncognitoSheet) { + IncognitoHelp() + } + } +} + +func sharedProfileInfo(_ incognito: Bool) -> Text { + let name = ChatModel.shared.currentUser?.displayName ?? "" + return Text( + incognito + ? "A new random profile will be shared." + : "Your profile **\(name)** will be shared." + ) +} + +enum PlanAndConnectAlert: Identifiable { + case ownInvitationLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) + case invitationLinkConnecting(connectionLink: String) + case ownContactAddressConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) + case contactAddressConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) + case groupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) + case groupLinkConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool) + case groupLinkConnecting(connectionLink: String, groupInfo: GroupInfo?) + + var id: String { + switch self { + case let .ownInvitationLinkConfirmConnect(connectionLink, _, _): return "ownInvitationLinkConfirmConnect \(connectionLink)" + case let .invitationLinkConnecting(connectionLink): return "invitationLinkConnecting \(connectionLink)" + case let .ownContactAddressConfirmConnect(connectionLink, _, _): return "ownContactAddressConfirmConnect \(connectionLink)" + case let .contactAddressConnectingConfirmReconnect(connectionLink, _, _): return "contactAddressConnectingConfirmReconnect \(connectionLink)" + case let .groupLinkConfirmConnect(connectionLink, _, _): return "groupLinkConfirmConnect \(connectionLink)" + case let .groupLinkConnectingConfirmReconnect(connectionLink, _, _): return "groupLinkConnectingConfirmReconnect \(connectionLink)" + case let .groupLinkConnecting(connectionLink, _): return "groupLinkConnecting \(connectionLink)" + } + } +} + +func planAndConnectAlert(_ alert: PlanAndConnectAlert, dismiss: Bool, cleanup: (() -> Void)? = nil) -> Alert { + switch alert { + case let .ownInvitationLinkConfirmConnect(connectionLink, connectionPlan, incognito): + return Alert( + title: Text("Connect to yourself?"), + message: Text("This is your own one-time link!"), + primaryButton: .destructive( + Text(incognito ? "Connect incognito" : "Connect"), + action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) } + ), + secondaryButton: .cancel() { cleanup?() } + ) + case .invitationLinkConnecting: + return Alert( + title: Text("Already connecting!"), + message: Text("You are already connecting via this one-time link!"), + dismissButton: .default(Text("OK")) { cleanup?() } + ) + case let .ownContactAddressConfirmConnect(connectionLink, connectionPlan, incognito): + return Alert( + title: Text("Connect to yourself?"), + message: Text("This is your own SimpleX address!"), + primaryButton: .destructive( + Text(incognito ? "Connect incognito" : "Connect"), + action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) } + ), + secondaryButton: .cancel() { cleanup?() } + ) + case let .contactAddressConnectingConfirmReconnect(connectionLink, connectionPlan, incognito): + return Alert( + title: Text("Repeat connection request?"), + message: Text("You have already requested connection via this address!"), + primaryButton: .destructive( + Text(incognito ? "Connect incognito" : "Connect"), + action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) } + ), + secondaryButton: .cancel() { cleanup?() } + ) + case let .groupLinkConfirmConnect(connectionLink, connectionPlan, incognito): + return Alert( + title: Text("Join group?"), + message: Text("You will connect to all group members."), + primaryButton: .default( + Text(incognito ? "Join incognito" : "Join"), + action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) } + ), + secondaryButton: .cancel() { cleanup?() } + ) + case let .groupLinkConnectingConfirmReconnect(connectionLink, connectionPlan, incognito): + return Alert( + title: Text("Repeat join request?"), + message: Text("You are already joining the group via this link!"), + primaryButton: .destructive( + Text(incognito ? "Join incognito" : "Join"), + action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) } + ), + secondaryButton: .cancel() { cleanup?() } + ) + case let .groupLinkConnecting(_, groupInfo): + if let groupInfo = groupInfo { + return Alert( + title: Text("Group already exists!"), + message: Text("You are already joining the group \(groupInfo.displayName)."), + dismissButton: .default(Text("OK")) { cleanup?() } + ) + } else { + return Alert( + title: Text("Already joining the group!"), + message: Text("You are already joining the group via this link."), + dismissButton: .default(Text("OK")) { cleanup?() } + ) + } + } +} + +enum PlanAndConnectActionSheet: Identifiable { + case askCurrentOrIncognitoProfile(connectionLink: String, connectionPlan: ConnectionPlan?, title: LocalizedStringKey) + case askCurrentOrIncognitoProfileDestructive(connectionLink: String, connectionPlan: ConnectionPlan, title: LocalizedStringKey) + case askCurrentOrIncognitoProfileConnectContactViaAddress(contact: Contact) + case ownGroupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool?, groupInfo: GroupInfo) + + var id: String { + switch self { + case let .askCurrentOrIncognitoProfile(connectionLink, _, _): return "askCurrentOrIncognitoProfile \(connectionLink)" + case let .askCurrentOrIncognitoProfileDestructive(connectionLink, _, _): return "askCurrentOrIncognitoProfileDestructive \(connectionLink)" + case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): return "askCurrentOrIncognitoProfileConnectContactViaAddress \(contact.contactId)" + case let .ownGroupLinkConfirmConnect(connectionLink, _, _, _): return "ownGroupLinkConfirmConnect \(connectionLink)" + } + } +} + +func planAndConnectActionSheet(_ sheet: PlanAndConnectActionSheet, dismiss: Bool, cleanup: (() -> Void)? = nil) -> ActionSheet { + switch sheet { + case let .askCurrentOrIncognitoProfile(connectionLink, connectionPlan, title): + return ActionSheet( + title: Text(title), + buttons: [ + .default(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) }, + .default(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) }, + .cancel() { cleanup?() } + ] + ) + case let .askCurrentOrIncognitoProfileDestructive(connectionLink, connectionPlan, title): + return ActionSheet( + title: Text(title), + buttons: [ + .destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) }, + .destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) }, + .cancel() { cleanup?() } + ] + ) + case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): + return ActionSheet( + title: Text("Connect with \(contact.chatViewName)"), + buttons: [ + .default(Text("Use current profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: false, cleanup: cleanup) }, + .default(Text("Use new incognito profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: true, cleanup: cleanup) }, + .cancel() { cleanup?() } + ] + ) + case let .ownGroupLinkConfirmConnect(connectionLink, connectionPlan, incognito, groupInfo): + if let incognito = incognito { + return ActionSheet( + title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"), + buttons: [ + .default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) }, + .destructive(Text(incognito ? "Join incognito" : "Join with current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) }, + .cancel() { cleanup?() } + ] + ) + } else { + return ActionSheet( + title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"), + buttons: [ + .default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) }, + .destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false, cleanup: cleanup) }, + .destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true, cleanup: cleanup) }, + .cancel() { cleanup?() } + ] + ) + } + } +} + +func planAndConnect( + _ connectionLink: String, + showAlert: @escaping (PlanAndConnectAlert) -> Void, + showActionSheet: @escaping (PlanAndConnectActionSheet) -> Void, + dismiss: Bool, + incognito: Bool?, + cleanup: (() -> Void)? = nil, + filterKnownContact: ((Contact) -> Void)? = nil, + filterKnownGroup: ((GroupInfo) -> Void)? = nil +) { + Task { + do { + let connectionPlan = try await apiConnectPlan(connReq: connectionLink) + switch connectionPlan { + case let .invitationLink(ilp): + switch ilp { + case .ok: + logger.debug("planAndConnect, .invitationLink, .ok, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) + } else { + showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via one-time link")) + } + case .ownLink: + logger.debug("planAndConnect, .invitationLink, .ownLink, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + showAlert(.ownInvitationLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) + } else { + showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own one-time link!")) + } + case let .connecting(contact_): + logger.debug("planAndConnect, .invitationLink, .connecting, incognito=\(incognito?.description ?? "nil")") + if let contact = contact_ { + if let f = filterKnownContact { + f(contact) + } else { + openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) } + } + } else { + showAlert(.invitationLinkConnecting(connectionLink: connectionLink)) + } + case let .known(contact): + logger.debug("planAndConnect, .invitationLink, .known, incognito=\(incognito?.description ?? "nil")") + if let f = filterKnownContact { + f(contact) + } else { + openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) } + } + } + case let .contactAddress(cap): + switch cap { + case .ok: + logger.debug("planAndConnect, .contactAddress, .ok, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito, cleanup: cleanup) + } else { + showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via contact address")) + } + case .ownLink: + logger.debug("planAndConnect, .contactAddress, .ownLink, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + showAlert(.ownContactAddressConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) + } else { + showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own SimpleX address!")) + } + case .connectingConfirmReconnect: + logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + showAlert(.contactAddressConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) + } else { + showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You have already requested connection!\nRepeat connection request?")) + } + case let .connectingProhibit(contact): + logger.debug("planAndConnect, .contactAddress, .connectingProhibit, incognito=\(incognito?.description ?? "nil")") + if let f = filterKnownContact { + f(contact) + } else { + openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) } + } + case let .known(contact): + logger.debug("planAndConnect, .contactAddress, .known, incognito=\(incognito?.description ?? "nil")") + if let f = filterKnownContact { + f(contact) + } else { + openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) } + } + case let .contactViaAddress(contact): + logger.debug("planAndConnect, .contactAddress, .contactViaAddress, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + connectContactViaAddress_(contact, dismiss: dismiss, incognito: incognito, cleanup: cleanup) + } else { + showActionSheet(.askCurrentOrIncognitoProfileConnectContactViaAddress(contact: contact)) + } + } + case let .groupLink(glp): + switch glp { + case .ok: + if let incognito = incognito { + showAlert(.groupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) + } else { + showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Join group")) + } + case let .ownLink(groupInfo): + logger.debug("planAndConnect, .groupLink, .ownLink, incognito=\(incognito?.description ?? "nil")") + if let f = filterKnownGroup { + f(groupInfo) + } + showActionSheet(.ownGroupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito, groupInfo: groupInfo)) + case .connectingConfirmReconnect: + logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")") + if let incognito = incognito { + showAlert(.groupLinkConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito)) + } else { + showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You are already joining the group!\nRepeat join request?")) + } + case let .connectingProhibit(groupInfo_): + logger.debug("planAndConnect, .groupLink, .connectingProhibit, incognito=\(incognito?.description ?? "nil")") + showAlert(.groupLinkConnecting(connectionLink: connectionLink, groupInfo: groupInfo_)) + case let .known(groupInfo): + logger.debug("planAndConnect, .groupLink, .known, incognito=\(incognito?.description ?? "nil")") + if let f = filterKnownGroup { + f(groupInfo) + } else { + openKnownGroup(groupInfo, dismiss: dismiss) { AlertManager.shared.showAlert(groupAlreadyExistsAlert(groupInfo)) } + } + } + } + } catch { + logger.debug("planAndConnect, plan error") + if let incognito = incognito { + connectViaLink(connectionLink, connectionPlan: nil, dismiss: dismiss, incognito: incognito, cleanup: cleanup) + } else { + showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: nil, title: "Connect via link")) + } + } + } +} + +private func connectContactViaAddress_(_ contact: Contact, dismiss: Bool, incognito: Bool, cleanup: (() -> Void)? = nil) { + Task { + if dismiss { + DispatchQueue.main.async { + dismissAllSheets(animated: true) + } + } + _ = await connectContactViaAddress(contact.contactId, incognito) + cleanup?() + } +} + +private func connectViaLink( + _ connectionLink: String, + connectionPlan: ConnectionPlan?, + dismiss: Bool, + incognito: Bool, + cleanup: (() -> Void)? +) { + Task { + if let (connReqType, pcc) = await apiConnect(incognito: incognito, connReq: connectionLink) { + await MainActor.run { + ChatModel.shared.updateContactConnection(pcc) + } + let crt: ConnReqType + if let plan = connectionPlan { + crt = planToConnReqType(plan) + } else { + crt = connReqType + } + DispatchQueue.main.async { + if dismiss { + dismissAllSheets(animated: true) { + AlertManager.shared.showAlert(connReqSentAlert(crt)) + } + } else { + AlertManager.shared.showAlert(connReqSentAlert(crt)) + } + } + } else { + if dismiss { + DispatchQueue.main.async { + dismissAllSheets(animated: true) + } + } + } + cleanup?() + } +} + +func openKnownContact(_ contact: Contact, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) { + Task { + let m = ChatModel.shared + if let c = m.getContactChat(contact.contactId) { + DispatchQueue.main.async { + if dismiss { + dismissAllSheets(animated: true) { + m.chatId = c.id + showAlreadyExistsAlert?() + } + } else { + m.chatId = c.id + showAlreadyExistsAlert?() + } + } + } + } +} + +func openKnownGroup(_ groupInfo: GroupInfo, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) { + Task { + let m = ChatModel.shared + if let g = m.getGroupChat(groupInfo.groupId) { + DispatchQueue.main.async { + if dismiss { + dismissAllSheets(animated: true) { + m.chatId = g.id + showAlreadyExistsAlert?() + } + } else { + m.chatId = g.id + showAlreadyExistsAlert?() + } + } + } + } +} + +func contactAlreadyConnectingAlert(_ contact: Contact) -> Alert { + mkAlert( + title: "Contact already exists", + message: "You are already connecting to \(contact.displayName)." + ) +} + +func groupAlreadyExistsAlert(_ groupInfo: GroupInfo) -> Alert { + mkAlert( + title: "Group already exists", + message: "You are already in group \(groupInfo.displayName)." + ) +} + +enum ConnReqType: Equatable { + case invitation + case contact + case groupLink + + var connReqSentText: LocalizedStringKey { + switch self { + case .invitation: return "You will be connected when your contact's device is online, please wait or check later!" + case .contact: return "You will be connected when your connection request is accepted, please wait or check later!" + case .groupLink: return "You will be connected when group link host's device is online, please wait or check later!" + } + } +} + +private func planToConnReqType(_ connectionPlan: ConnectionPlan) -> ConnReqType { + switch connectionPlan { + case .invitationLink: return .invitation + case .contactAddress: return .contact + case .groupLink: return .groupLink + } +} + +func connReqSentAlert(_ type: ConnReqType) -> Alert { + return mkAlert( + title: "Connection request sent!", + message: type.connReqSentText + ) +} + +#Preview { + NewChatView( + selection: .invite + ) +} diff --git a/apps/ios/Shared/Views/NewChat/PasteToConnectView.swift b/apps/ios/Shared/Views/NewChat/PasteToConnectView.swift deleted file mode 100644 index 7c272fb631..0000000000 --- a/apps/ios/Shared/Views/NewChat/PasteToConnectView.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// PasteToConnectView.swift -// SimpleX (iOS) -// -// Created by Ian Davies on 22/04/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI -import SimpleXChat - -struct PasteToConnectView: View { - @Environment(\.dismiss) var dismiss: DismissAction - @State private var connectionLink: String = "" - @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false - @FocusState private var linkEditorFocused: Bool - @State private var alert: PlanAndConnectAlert? - @State private var sheet: PlanAndConnectActionSheet? - - var body: some View { - List { - Text("Connect via link") - .font(.largeTitle) - .bold() - .fixedSize(horizontal: false, vertical: true) - .listRowBackground(Color.clear) - .listRowSeparator(.hidden) - .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) - .onTapGesture { linkEditorFocused = false } - - Section { - linkEditor() - - Button { - if connectionLink == "" { - connectionLink = UIPasteboard.general.string ?? "" - } else { - connectionLink = "" - } - } label: { - if connectionLink == "" { - settingsRow("doc.plaintext") { Text("Paste") } - } else { - settingsRow("multiply") { Text("Clear") } - } - } - - Button { - connect() - } label: { - settingsRow("link") { Text("Connect") } - } - .disabled(connectionLink == "" || connectionLink.trimmingCharacters(in: .whitespaces).firstIndex(of: " ") != nil) - - IncognitoToggle(incognitoEnabled: $incognitoDefault) - } footer: { - VStack(alignment: .leading, spacing: 4) { - sharedProfileInfo(incognitoDefault) - Text("You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button.") - } - .frame(maxWidth: .infinity, alignment: .leading) - } - } - .alert(item: $alert) { a in planAndConnectAlert(a, dismiss: true) } - .actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) } - } - - private func linkEditor() -> some View { - ZStack { - Group { - if connectionLink.isEmpty { - TextEditor(text: Binding.constant(NSLocalizedString("Paste the link you received to connect with your contact.", comment: "placeholder"))) - .foregroundColor(.secondary) - .disabled(true) - } - TextEditor(text: $connectionLink) - .onSubmit(connect) - .textInputAutocapitalization(.never) - .disableAutocorrection(true) - .focused($linkEditorFocused) - } - .allowsTightening(false) - .padding(.horizontal, -5) - .padding(.top, -8) - .frame(height: 180, alignment: .topLeading) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - - private func connect() { - let link = connectionLink.trimmingCharacters(in: .whitespaces) - planAndConnect( - link, - showAlert: { alert = $0 }, - showActionSheet: { sheet = $0 }, - dismiss: true, - incognito: incognitoDefault - ) - } -} - -struct PasteToConnectView_Previews: PreviewProvider { - static var previews: some View { - PasteToConnectView() - } -} diff --git a/apps/ios/Shared/Views/NewChat/QRCode.swift b/apps/ios/Shared/Views/NewChat/QRCode.swift index 3ddb85079c..e3bae9287a 100644 --- a/apps/ios/Shared/Views/NewChat/QRCode.swift +++ b/apps/ios/Shared/Views/NewChat/QRCode.swift @@ -24,9 +24,10 @@ struct SimpleXLinkQRCode: View { let uri: String var withLogo: Bool = true var tintColor = UIColor(red: 0.023, green: 0.176, blue: 0.337, alpha: 1) + var onShare: (() -> Void)? = nil var body: some View { - QRCode(uri: simplexChatLink(uri), withLogo: withLogo, tintColor: tintColor) + QRCode(uri: simplexChatLink(uri), withLogo: withLogo, tintColor: tintColor, onShare: onShare) } } @@ -40,6 +41,7 @@ struct QRCode: View { let uri: String var withLogo: Bool = true var tintColor = UIColor(red: 0.023, green: 0.176, blue: 0.337, alpha: 1) + var onShare: (() -> Void)? = nil @State private var image: UIImage? = nil @State private var makeScreenshotFunc: () -> Void = {} @@ -65,6 +67,7 @@ struct QRCode: View { makeScreenshotFunc = { let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale) showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)]) + onShare?() } } .frame(width: geo.size.width, height: geo.size.height) diff --git a/apps/ios/Shared/Views/NewChat/ScanToConnectView.swift b/apps/ios/Shared/Views/NewChat/ScanToConnectView.swift deleted file mode 100644 index 7f3f5e02f8..0000000000 --- a/apps/ios/Shared/Views/NewChat/ScanToConnectView.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// ConnectContactView.swift -// SimpleX -// -// Created by Evgeny Poberezkin on 29/01/2022. -// Copyright © 2022 SimpleX Chat. All rights reserved. -// - -import SwiftUI -import SimpleXChat -import CodeScanner - -struct ScanToConnectView: View { - @Environment(\.dismiss) var dismiss: DismissAction - @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false - @State private var alert: PlanAndConnectAlert? - @State private var sheet: PlanAndConnectActionSheet? - - var body: some View { - ScrollView { - VStack(alignment: .leading) { - Text("Scan QR code") - .font(.largeTitle) - .bold() - .fixedSize(horizontal: false, vertical: true) - .padding(.vertical) - - CodeScannerView(codeTypes: [.qr], scanMode: .continuous, completion: processQRCode) - .aspectRatio(1, contentMode: .fit) - .cornerRadius(12) - - IncognitoToggle(incognitoEnabled: $incognitoDefault) - .padding(.horizontal) - .padding(.vertical, 6) - .background( - RoundedRectangle(cornerRadius: 12, style: .continuous) - .fill(Color(uiColor: .systemBackground)) - ) - .padding(.top) - - VStack(alignment: .leading, spacing: 4) { - sharedProfileInfo(incognitoDefault) - Text("If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.") - } - .frame(maxWidth: .infinity, alignment: .leading) - .font(.footnote) - .foregroundColor(.secondary) - .padding(.horizontal) - } - .padding() - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) - } - .background(Color(.systemGroupedBackground)) - .alert(item: $alert) { a in planAndConnectAlert(a, dismiss: true) } - .actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) } - } - - func processQRCode(_ resp: Result) { - switch resp { - case let .success(r): - planAndConnect( - r.string, - showAlert: { alert = $0 }, - showActionSheet: { sheet = $0 }, - dismiss: true, - incognito: incognitoDefault - ) - case let .failure(e): - logger.error("ConnectContactView.processQRCode QR code error: \(e.localizedDescription)") - dismiss() - } - } -} - -struct ConnectContactView_Previews: PreviewProvider { - static var previews: some View { - ScanToConnectView() - } -} diff --git a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift index 20dadb7954..fc478596a9 100644 --- a/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift +++ b/apps/ios/Shared/Views/UserSettings/IncognitoHelp.swift @@ -10,24 +10,23 @@ import SwiftUI struct IncognitoHelp: View { var body: some View { - VStack(alignment: .leading) { + List { Text("Incognito mode") .font(.largeTitle) .bold() + .fixedSize(horizontal: false, vertical: true) .padding(.vertical) - ScrollView { - VStack(alignment: .leading) { - Group { - Text("Incognito mode protects your privacy by using a new random profile for each contact.") - Text("It allows having many anonymous connections without any shared data between them in a single chat profile.") - Text("When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.") - } - .padding(.bottom) - } + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + VStack(alignment: .leading, spacing: 18) { + Text("Incognito mode protects your privacy by using a new random profile for each contact.") + Text("It allows having many anonymous connections without any shared data between them in a single chat profile.") + Text("When you share an incognito profile with somebody, this profile will be used for the groups they invite you to.") + Text("Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).") } + .listRowBackground(Color.clear) } - .frame(maxWidth: .infinity) - .padding() } } diff --git a/apps/ios/Shared/Views/UserSettings/PreferencesView.swift b/apps/ios/Shared/Views/UserSettings/PreferencesView.swift index 960afb6d38..2e560f8578 100644 --- a/apps/ios/Shared/Views/UserSettings/PreferencesView.swift +++ b/apps/ios/Shared/Views/UserSettings/PreferencesView.swift @@ -63,7 +63,6 @@ struct PreferencesView: View { private func featureFooter(_ feature: ChatFeature, _ allowFeature: Binding) -> some View { Text(feature.allowDescription(allowFeature.wrappedValue)) - .frame(height: 36, alignment: .topLeading) } private func savePreferences() { diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index f889d9c394..b73d6b867d 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -95,6 +95,12 @@ let appDefaults: [String: Any] = [ DEFAULT_CONNECT_REMOTE_VIA_MULTICAST_AUTO: true, ] +// not used anymore +enum ConnectViaLinkTab: String { + case scan + case paste +} + enum SimpleXLinkMode: String, Identifiable { case description case full diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index 7a2afea082..506df8cf17 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -303,14 +303,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Добави нов контакт**: за да създадете своя еднократен QR код или линк за вашия контакт. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Създай линк / QR код**, който вашият контакт да използва. + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +326,6 @@ **Най-поверително**: не използвайте сървъра за известия SimpleX Chat, периодично проверявайте съобщенията във фонов режим (зависи от това колко често използвате приложението). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Поставете получения линк** или го отворете в браузъра и докоснете **Отваряне в мобилно приложение**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Моля, обърнете внимание**: НЯМА да можете да възстановите или промените паролата, ако я загубите. @@ -338,11 +336,6 @@ **Препоръчително**: токенът на устройството и известията се изпращат до сървъра за уведомяване на SimpleX Chat, но не и съдържанието, размерът на съобщението или от кого е. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Сканирай QR код**: за да се свържете с вашия контакт лично или чрез видеообаждане. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Внимание**: Незабавните push известия изискват парола, запазена в Keychain. @@ -440,11 +433,6 @@ 1 седмица time interval - - 1-time link - Еднократен линк - No comment provided by engineer. - 5 minutes 5 минути @@ -560,6 +548,10 @@ Добавете адрес към вашия профил, така че вашите контакти да могат да го споделят с други хора. Актуализацията на профила ще бъде изпратена до вашите контакти. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Добави предварително зададени сървъри @@ -956,6 +948,10 @@ Обаждания No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Потребителският профил не може да се изтрие! @@ -1072,6 +1068,10 @@ Чатът е спрян No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Чат настройки @@ -1208,11 +1208,6 @@ This is your own one-time link! Свърване чрез линк No comment provided by engineer. - - Connect via link / QR code - Свърване чрез линк/QR код - No comment provided by engineer. - Connect via one-time link Свързване чрез еднократен линк за връзка @@ -1380,11 +1375,6 @@ This is your own one-time link! Създайте нов профил в [настолното приложение](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Създай линк за еднократна покана - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1409,6 +1399,10 @@ This is your own one-time link! Създаден на %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Текущ kод за достъп @@ -1950,6 +1944,10 @@ This cannot be undone! Активиране на автоматично изтриване на съобщения? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Активиране за всички @@ -2015,6 +2013,10 @@ This cannot be undone! Криптирано съобщение или друго събитие notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Криптирано съобщение: грешка в базата данни @@ -2240,6 +2242,10 @@ This cannot be undone! Грешка при зареждане на %@ сървъри No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Грешка при получаване на файл @@ -2280,6 +2286,10 @@ This cannot be undone! Грешка при запазване на потребителска парола No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Грешка при изпращане на имейл @@ -2749,11 +2759,6 @@ This cannot be undone! Ако не можете да се срещнете лично, покажете QR код във видеоразговора или споделете линка. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Ако не можете да се срещнете на живо, можете да **сканирате QR код във видеообаждането** или вашият контакт може да сподели линк за покана. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Ако въведете този kод за достъп, когато отваряте приложението, всички данни от приложението ще бъдат необратимо изтрити! @@ -2909,15 +2914,27 @@ This cannot be undone! Интерфейс No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Невалиден линк за връзка No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Невалиден адрес на сървъра! @@ -3032,10 +3049,18 @@ This is your link for group %@! Присъединяване към групата No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Запазете връзките си @@ -3118,6 +3143,11 @@ This is your link for group %@! Съобщения на живо No comment provided by engineer. + + Local + Локално + No comment provided by engineer. + Local name Локално име @@ -3357,6 +3387,10 @@ This is your link for group %@! Нов kод за достъп No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Нова заявка за контакт @@ -3480,16 +3514,15 @@ This is your link for group %@! - да деактивират членове (роля "наблюдател") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Изключено No comment provided by engineer. - - Off (Local) - Изключено (Локално) - No comment provided by engineer. - Ok Ок @@ -3629,9 +3662,16 @@ This is your link for group %@! Протокол и код с отворен код – всеки може да оперира собствени сървъри. No comment provided by engineer. - - Opening database… - Отваряне на база данни… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3674,11 +3714,6 @@ This is your link for group %@! Парола за показване No comment provided by engineer. - - Paste - Постави - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3688,16 +3723,10 @@ This is your link for group %@! Постави изображение No comment provided by engineer. - - Paste received link - Постави получения линк + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Поставете линка, който сте получили, за да се свържете с вашия контакт. - placeholder - People can connect to you only via the links you share. Хората могат да се свържат с вас само чрез ликовете, които споделяте. @@ -3733,6 +3762,11 @@ This is your link for group %@! Моля, проверете вашите настройки и тези вашия за контакт. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Моля, свържете се с груповия администартор. @@ -3936,6 +3970,10 @@ This is your link for group %@! Прочетете повече в [Ръководство за потребителя](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Прочетете повече в [Ръководство на потребителя](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4144,6 +4182,10 @@ This is your link for group %@! Грешка при възстановяване на базата данни No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Покажи @@ -4298,6 +4340,10 @@ This is your link for group %@! Търсене No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Сигурна опашка @@ -4572,9 +4618,8 @@ This is your link for group %@! Сподели линк No comment provided by engineer. - - Share one-time invitation link - Сподели линк за еднократна покана + + Share this 1-time invite link No comment provided by engineer. @@ -4697,16 +4742,15 @@ This is your link for group %@! Някой notification title - - Start a new chat - Започни нов чат - No comment provided by engineer. - Start chat Започни чат No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Започни миграция @@ -4831,6 +4875,14 @@ This is your link for group %@! Докосни за инкогнито вход No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Докосни за започване на нов чат @@ -4893,6 +4945,10 @@ It can happen because of some bug or when the connection is compromised.Опитът за промяна на паролата на базата данни не беше завършен. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Връзката, която приехте, ще бъде отказана! @@ -4958,6 +5014,10 @@ It can happen because of some bug or when the connection is compromised.Сървърите за нови връзки на текущия ви чат профил **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Тема @@ -5106,11 +5166,6 @@ You will be prompted to complete authentication before this feature is enabled.< Изключи No comment provided by engineer. - - Turn off notifications? - Изключи известията? - No comment provided by engineer. - Turn on Включи @@ -5307,6 +5362,10 @@ To connect, please ask your contact to create another connection link and check Използвай нов инкогнито профил No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Използвай сървър @@ -5556,11 +5615,6 @@ Repeat join request? Можете да приемате обаждания от заключен екран, без идентификация на устройство и приложението. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Можете също да се свържете, като натиснете върху линка. Ако се отвори в браузъра, натиснете върху бутона **Отваряне в мобилно приложение**. - No comment provided by engineer. - You can create it later Можете да го създадете по-късно @@ -5581,6 +5635,10 @@ Repeat join request? Можете да скриете или заглушите известията за потребителски профил - плъзнете надясно. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Вече можете да изпращате съобщения до %@ @@ -5621,6 +5679,10 @@ Repeat join request? Можете да използвате markdown за форматиране на съобщенията: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Не може да изпращате съобщения! @@ -5805,13 +5867,6 @@ You can cancel this connection and remove the contact (and try later with a new Вашите контакти могат да позволят пълното изтриване на съобщението. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Вашите контакти в SimpleX ще го видят. -Можете да го промените в Настройки. - No comment provided by engineer. - Your contacts will remain connected. Вашите контакти ще останат свързани. diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index be8b23658b..076c2c97fb 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -303,14 +303,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Přidat nový kontakt**: pro vytvoření jednorázového QR kódu nebo odkazu pro váš kontakt. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Vytvořte odkaz / QR kód** pro váš kontakt. + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +326,6 @@ **Nejsoukromější**: nepoužívejte server oznámení SimpleX Chat, pravidelně kontrolujte zprávy na pozadí (závisí na tom, jak často aplikaci používáte). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Vložte přijatý odkaz** nebo jej otevřete v prohlížeči a klepněte na **Otevřít v mobilní aplikaci**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Upozornění**: Pokud heslo ztratíte, NEBUDETE jej moci obnovit ani změnit. @@ -338,11 +336,6 @@ **Doporučeno**: Token zařízení a oznámení se odesílají na oznamovací server SimpleX Chat, ale nikoli obsah, velikost nebo od koho jsou zprávy. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - ** Naskenujte QR kód**: pro připojení ke kontaktu osobně nebo prostřednictvím videohovoru. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Upozornění**: Okamžitě doručovaná oznámení vyžadují přístupové heslo uložené v Klíčence. @@ -440,11 +433,6 @@ 1 týden time interval - - 1-time link - Jednorázový odkaz - No comment provided by engineer. - 5 minutes 5 minut @@ -560,6 +548,10 @@ Přidejte adresu do svého profilu, aby ji vaše kontakty mohly sdílet s dalšími lidmi. Aktualizace profilu bude zaslána vašim kontaktům. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Přidejte přednastavené servery @@ -956,6 +948,10 @@ Hovory No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Nemohu smazat uživatelský profil! @@ -1072,6 +1068,10 @@ Chat je zastaven No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Předvolby chatu @@ -1208,11 +1208,6 @@ This is your own one-time link! Připojte se prostřednictvím odkazu No comment provided by engineer. - - Connect via link / QR code - Připojit se prostřednictvím odkazu / QR kódu - No comment provided by engineer. - Connect via one-time link Připojit se jednorázovým odkazem @@ -1380,11 +1375,6 @@ This is your own one-time link! Vytvořit nový profil v [desktop app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Vytvořit jednorázovou pozvánku - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1409,6 +1399,10 @@ This is your own one-time link! Vytvořeno na %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Aktuální heslo @@ -1950,6 +1944,10 @@ This cannot be undone! Povolit automatické mazání zpráv? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Povolit pro všechny @@ -2015,6 +2013,10 @@ This cannot be undone! Šifrovaná zpráva nebo jiná událost notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Šifrovaná zpráva: chyba databáze @@ -2240,6 +2242,10 @@ This cannot be undone! Chyba načítání %@ serverů No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Chyba při příjmu souboru @@ -2280,6 +2286,10 @@ This cannot be undone! Chyba ukládání hesla uživatele No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Chyba odesílání e-mailu @@ -2749,11 +2759,6 @@ This cannot be undone! Pokud se nemůžete setkat osobně, zobrazte QR kód ve videohovoru nebo sdílejte odkaz. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Pokud se nemůžete setkat osobně, můžete **naskenovat QR kód během videohovoru**, nebo váš kontakt může sdílet odkaz na pozvánku. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Pokud tento přístupový kód zadáte při otevření aplikace, všechna data budou nenávratně smazána! @@ -2909,15 +2914,27 @@ This cannot be undone! Rozhranní No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Neplatný odkaz na spojení No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Neplatná adresa serveru! @@ -3032,10 +3049,18 @@ This is your link for group %@! Připojování ke skupině No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Zachovat vaše připojení @@ -3118,6 +3143,11 @@ This is your link for group %@! Živé zprávy No comment provided by engineer. + + Local + Místní + No comment provided by engineer. + Local name Místní název @@ -3357,6 +3387,10 @@ This is your link for group %@! Nové heslo No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Žádost o nový kontakt @@ -3480,16 +3514,15 @@ This is your link for group %@! - zakázat členy (role "pozorovatel") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Vypnout No comment provided by engineer. - - Off (Local) - Vypnuto (místní) - No comment provided by engineer. - Ok Ok @@ -3629,9 +3662,16 @@ This is your link for group %@! Protokol a kód s otevřeným zdrojovým kódem - servery může provozovat kdokoli. No comment provided by engineer. - - Opening database… - Otvírání databáze… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3674,11 +3714,6 @@ This is your link for group %@! Heslo k zobrazení No comment provided by engineer. - - Paste - Vložit - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3688,16 +3723,10 @@ This is your link for group %@! Vložit obrázek No comment provided by engineer. - - Paste received link - Vložení přijatého odkazu + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Vložte odkaz, který jste obdrželi, do pole níže a spojte se se svým kontaktem. - placeholder - People can connect to you only via the links you share. Lidé se s vámi mohou spojit pouze prostřednictvím odkazů, které sdílíte. @@ -3733,6 +3762,11 @@ This is your link for group %@! Zkontrolujte prosím nastavení své i svého kontaktu. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Kontaktujte prosím správce skupiny. @@ -3936,6 +3970,10 @@ This is your link for group %@! Další informace naleznete v [Uživatelské příručce](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Přečtěte si více v [Uživatelské příručce](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4144,6 +4182,10 @@ This is your link for group %@! Chyba obnovení databáze No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Odhalit @@ -4298,6 +4340,10 @@ This is your link for group %@! Hledat No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Zabezpečit frontu @@ -4572,9 +4618,8 @@ This is your link for group %@! Sdílet odkaz No comment provided by engineer. - - Share one-time invitation link - Jednorázový zvací odkaz + + Share this 1-time invite link No comment provided by engineer. @@ -4697,16 +4742,15 @@ This is your link for group %@! Někdo notification title - - Start a new chat - Začít nový chat - No comment provided by engineer. - Start chat Začít chat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Zahájit přenesení @@ -4831,6 +4875,14 @@ This is your link for group %@! Klepnutím se připojíte inkognito No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Klepnutím na zahájíte nový chat @@ -4893,6 +4945,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován Pokus o změnu přístupové fráze databáze nebyl dokončen. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Připojení, které jste přijali, bude zrušeno! @@ -4958,6 +5014,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován Servery pro nová připojení vašeho aktuálního chat profilu **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Téma @@ -5106,11 +5166,6 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření. Vypnout No comment provided by engineer. - - Turn off notifications? - Vypnout upozornění? - No comment provided by engineer. - Turn on Zapnout @@ -5307,6 +5362,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Použít nový inkognito profil No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Použít server @@ -5556,11 +5615,6 @@ Repeat join request? Můžete přijímat hovory z obrazovky zámku, bez ověření zařízení a aplikace. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Můžete se také připojit kliknutím na odkaz. Pokud se otevře v prohlížeči, klikněte na tlačítko **Otevřít v mobilní aplikaci**. - No comment provided by engineer. - You can create it later Můžete vytvořit později @@ -5581,6 +5635,10 @@ Repeat join request? Profil uživatele můžete skrýt nebo ztlumit - přejeďte prstem doprava. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Nyní můžete posílat zprávy %@ @@ -5621,6 +5679,10 @@ Repeat join request? K formátování zpráv můžete použít markdown: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Nemůžete posílat zprávy! @@ -5805,13 +5867,6 @@ Toto připojení můžete zrušit a kontakt odebrat (a zkusit to později s nov Vaše kontakty mohou povolit úplné mazání zpráv. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Vaše kontakty v SimpleX ji uvidí. -Můžete ji změnit v Nastavení. - No comment provided by engineer. - Your contacts will remain connected. Vaše kontakty zůstanou připojeny. diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 75f70f7ad1..2b877c32d2 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Fügen Sie einen neuen Kontakt hinzu**: Erzeugen Sie einen Einmal-QR-Code oder -Link für Ihren Kontakt. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Generieren Sie einen Einladungs-Link / QR code** für Ihren Kontakt. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Beste Privatsphäre**: Es wird kein SimpleX-Chat-Benachrichtigungs-Server genutzt, Nachrichten werden in periodischen Abständen im Hintergrund geprüft (dies hängt davon ab, wie häufig Sie die App nutzen). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Fügen Sie den von Ihrem Kontakt erhaltenen Link ein** oder öffnen Sie ihn im Browser und tippen Sie auf **In mobiler App öffnen**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Bitte beachten Sie**: Das Passwort kann NICHT wiederhergestellt oder geändert werden, wenn Sie es vergessen haben oder verlieren. @@ -347,11 +345,6 @@ **Empfohlen**: Nur Ihr Geräte-Token und ihre Benachrichtigungen werden an den SimpleX-Chat-Benachrichtigungs-Server gesendet, aber weder der Nachrichteninhalt noch deren Größe oder von wem sie gesendet wurde. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Scannen Sie den QR-Code**, um sich während einem persönlichen Treffen oder per Videoanruf mit Ihrem Kontakt zu verbinden. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Warnung**: Sofortige Push-Benachrichtigungen erfordern die Eingabe eines Passworts, welches in Ihrem Schlüsselbund gespeichert ist. @@ -453,11 +446,6 @@ wöchentlich time interval - - 1-time link - Einmal-Link - No comment provided by engineer. - 5 minutes 5 Minuten @@ -573,6 +561,10 @@ Fügen Sie die Adresse zu Ihrem Profil hinzu, damit Ihre Kontakte sie mit anderen Personen teilen können. Es wird eine Profilaktualisierung an Ihre Kontakte gesendet. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Füge voreingestellte Server hinzu @@ -978,6 +970,10 @@ Anrufe No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Das Benutzerprofil kann nicht gelöscht werden! @@ -1094,6 +1090,10 @@ Der Chat ist beendet No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Chat-Präferenzen @@ -1238,11 +1238,6 @@ Das ist Ihr eigener Einmal-Link! Über einen Link verbinden No comment provided by engineer. - - Connect via link / QR code - Über einen Link / QR-Code verbinden - No comment provided by engineer. - Connect via one-time link Über einen Einmal-Link verbinden @@ -1418,11 +1413,6 @@ Das ist Ihr eigener Einmal-Link! Neues Profil in der [Desktop-App] erstellen (https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Einmal-Einladungslink erstellen - No comment provided by engineer. - Create profile Profil erstellen @@ -1448,6 +1438,10 @@ Das ist Ihr eigener Einmal-Link! Erstellt am %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Aktueller Zugangscode @@ -1998,6 +1992,10 @@ Das kann nicht rückgängig gemacht werden! Automatisches Löschen von Nachrichten aktivieren? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Für Alle aktivieren @@ -2063,6 +2061,10 @@ Das kann nicht rückgängig gemacht werden! Verschlüsselte Nachricht oder ein anderes Ereignis notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Verschlüsselte Nachricht: Datenbankfehler @@ -2293,6 +2295,10 @@ Das kann nicht rückgängig gemacht werden! Fehler beim Laden von %@ Servern No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Fehler beim Empfangen der Datei @@ -2333,6 +2339,10 @@ Das kann nicht rückgängig gemacht werden! Fehler beim Speichern des Benutzer-Passworts No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Fehler beim Senden der eMail @@ -2808,11 +2818,6 @@ Das kann nicht rückgängig gemacht werden! Falls Sie sich nicht persönlich treffen können, zeigen Sie den QR-Code in einem Videoanruf oder teilen Sie den Link. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Wenn Sie sich nicht persönlich treffen können, kann der **QR-Code während eines Videoanrufs gescannt werden**, oder Ihr Kontakt kann den Einladungslink über einen anderen Kanal mit Ihnen teilen. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Wenn Sie diesen Zugangscode während des Öffnens der App eingeben, werden alle App-Daten unwiederbringlich gelöscht! @@ -2970,16 +2975,28 @@ Das kann nicht rückgängig gemacht werden! Schnittstelle No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Ungültiger Verbindungslink No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Ungültiger Name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Ungültige Serveradresse! @@ -3098,11 +3115,19 @@ Das ist Ihr Link für die Gruppe %@! Der Gruppe beitreten No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Die App muss geöffnet bleiben, um sie vom Desktop aus nutzen zu können No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Ihre Verbindungen beibehalten @@ -3188,6 +3213,11 @@ Das ist Ihr Link für die Gruppe %@! Live Nachrichten No comment provided by engineer. + + Local + Lokal + No comment provided by engineer. + Local name Lokaler Name @@ -3428,6 +3458,10 @@ Das ist Ihr Link für die Gruppe %@! Neuer Zugangscode No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Neue Kontaktanfrage @@ -3552,16 +3586,15 @@ Das ist Ihr Link für die Gruppe %@! - Gruppenmitglieder deaktivieren ("Beobachter"-Rolle) No comment provided by engineer. + + OK + No comment provided by engineer. + Off Aus No comment provided by engineer. - - Off (Local) - Aus (Lokal) - No comment provided by engineer. - Ok Ok @@ -3702,9 +3735,16 @@ Das ist Ihr Link für die Gruppe %@! Open-Source-Protokoll und -Code – Jede Person kann ihre eigenen Server aufsetzen und nutzen. No comment provided by engineer. - - Opening database… - Öffne Datenbank … + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3747,11 +3787,6 @@ Das ist Ihr Link für die Gruppe %@! Passwort anzeigen No comment provided by engineer. - - Paste - Einfügen - No comment provided by engineer. - Paste desktop address Desktop-Adresse einfügen @@ -3762,16 +3797,10 @@ Das ist Ihr Link für die Gruppe %@! Bild einfügen No comment provided by engineer. - - Paste received link - Fügen Sie den erhaltenen Link ein + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Um sich mit Ihrem Kontakt zu verbinden, fügen Sie den erhaltenen Link in das Feld unten ein. - placeholder - People can connect to you only via the links you share. Verbindungen mit Kontakten sind nur über Links möglich, die Sie oder Ihre Kontakte untereinander teilen. @@ -3807,6 +3836,11 @@ Das ist Ihr Link für die Gruppe %@! Bitte überprüfen sie sowohl Ihre, als auch die Präferenzen Ihres Kontakts. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Bitte kontaktieren Sie den Gruppen-Administrator. @@ -4012,6 +4046,10 @@ Das ist Ihr Link für die Gruppe %@! Mehr dazu in der [Benutzeranleitung](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address) lesen. No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Mehr dazu in der [Benutzeranleitung](https://simplex.chat/docs/guide/readme.html#connect-to-friends) lesen. @@ -4222,6 +4260,10 @@ Das ist Ihr Link für die Gruppe %@! Fehler bei der Wiederherstellung der Datenbank No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Aufdecken @@ -4377,6 +4419,10 @@ Das ist Ihr Link für die Gruppe %@! Suche No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Sichere Warteschlange @@ -4652,9 +4698,8 @@ Das ist Ihr Link für die Gruppe %@! Link teilen No comment provided by engineer. - - Share one-time invitation link - Einmal-Einladungslink teilen + + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4822,15 @@ Das ist Ihr Link für die Gruppe %@! Jemand notification title - - Start a new chat - Starten Sie einen neuen Chat - No comment provided by engineer. - Start chat Starten Sie den Chat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Starten Sie die Migration @@ -4912,6 +4956,14 @@ Das ist Ihr Link für die Gruppe %@! Tippen, um Inkognito beizutreten No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Tippen, um einen neuen Chat zu starten @@ -4974,6 +5026,10 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro Die Änderung des Datenbank-Passworts konnte nicht abgeschlossen werden. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Die von Ihnen akzeptierte Verbindung wird abgebrochen! @@ -5039,6 +5095,10 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro Server der neuen Verbindungen von Ihrem aktuellen Chat-Profil **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Design @@ -5191,11 +5251,6 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt Abschalten No comment provided by engineer. - - Turn off notifications? - Benachrichtigungen abschalten? - No comment provided by engineer. - Turn on Einschalten @@ -5398,6 +5453,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Nutzen Sie das neue Inkognito-Profil No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Server nutzen @@ -5660,11 +5719,6 @@ Verbindungsanfrage wiederholen? Sie können Anrufe ohne Geräte- und App-Authentifizierung vom Sperrbildschirm aus annehmen. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Sie können sich auch verbinden, indem Sie auf den Link klicken. Wenn er im Browser geöffnet wird, klicken Sie auf die Schaltfläche **In mobiler App öffnen**. - No comment provided by engineer. - You can create it later Sie können dies später erstellen @@ -5685,6 +5739,10 @@ Verbindungsanfrage wiederholen? Sie können ein Benutzerprofil verbergen oder stummschalten - wischen Sie es nach rechts. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Sie können nun Nachrichten an %@ versenden @@ -5725,6 +5783,10 @@ Verbindungsanfrage wiederholen? Um Nachrichteninhalte zu formatieren, können Sie Markdowns verwenden: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Sie können keine Nachrichten versenden! @@ -5914,13 +5976,6 @@ Sie können diese Verbindung abbrechen und den Kontakt entfernen (und es später Ihre Kontakte können die unwiederbringliche Löschung von Nachrichten erlauben. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Ihre Kontakte in SimpleX werden es sehen. -Sie können es in den Einstellungen ändern. - No comment provided by engineer. - Your contacts will remain connected. Ihre Kontakte bleiben verbunden. diff --git a/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff b/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff index 7649b595cd..c6dcc84e99 100644 --- a/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff +++ b/apps/ios/SimpleX Localizations/el.xcloc/Localized Contents/el.xliff @@ -31,32 +31,39 @@ Available in v5.1 ( No comment provided by engineer. - + (can be copied) + (μπορεί να αντιγραφή) No comment provided by engineer. - + !1 colored! + !1 έγχρωμο! No comment provided by engineer. - + #secret# + #μυστικό# No comment provided by engineer. - + %@ + %@ No comment provided by engineer. - + %@ %@ + %@ %@ No comment provided by engineer. - + %@ / %@ + %@ / %@ No comment provided by engineer. - + %@ is connected! + %@ είναι συνδεδεμένο! notification title @@ -4162,6 +4169,51 @@ SimpleX servers cannot see your profile. \~strike~ No comment provided by engineer. + + %@ connected + %@ συνδεδεμένο + No comment provided by engineer. + + + # %@ + # %@ + copied message info title, # <title> + + + %@ and %@ + %@ και %@ + No comment provided by engineer. + + + %1$@ at %2$@: + %1$@ στις %2$@: + copied message info, <sender> at <time> + + + ## History + ## Ιστορικό + copied message info + + + ## In reply to + ## Ως απαντηση σε + copied message info + + + %@ (current) + %@ (τωρινό) + No comment provided by engineer. + + + %@ (current): + %@ (τωρινό): + copied message info + + + %@ and %@ connected + %@ και %@ συνδεδεμένο + No comment provided by engineer. + diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index 23498b2128..7dd5db3b65 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -312,14 +312,19 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Add new contact**: to create your one-time QR Code or link for your contact. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Create link / QR code** for your contact to use. + + **Create group**: to create a new group. + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +337,6 @@ **Most private**: do not use SimpleX Chat notifications server, check messages periodically in the background (depends on how often you use the app). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Paste received link** or open it in the browser and tap **Open in mobile app**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Please note**: you will NOT be able to recover or change passphrase if you lose it. @@ -347,11 +347,6 @@ **Recommended**: device token and notifications are sent to SimpleX Chat notification server, but not the message content, size or who it is from. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Scan QR code**: to connect to your contact in person or via video call. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Warning**: Instant push notifications require passphrase saved in Keychain. @@ -453,11 +448,6 @@ 1 week time interval - - 1-time link - 1-time link - No comment provided by engineer. - 5 minutes 5 minutes @@ -573,6 +563,11 @@ Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts. No comment provided by engineer. + + Add contact + Add contact + No comment provided by engineer. + Add preset servers Add preset servers @@ -978,6 +973,11 @@ Calls No comment provided by engineer. + + Camera not available + Camera not available + No comment provided by engineer. + Can't delete user profile! Can't delete user profile! @@ -1094,6 +1094,11 @@ Chat is stopped No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Chat preferences @@ -1238,11 +1243,6 @@ This is your own one-time link! Connect via link No comment provided by engineer. - - Connect via link / QR code - Connect via link / QR code - No comment provided by engineer. - Connect via one-time link Connect via one-time link @@ -1418,11 +1418,6 @@ This is your own one-time link! Create new profile in [desktop app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Create one-time invitation link - No comment provided by engineer. - Create profile Create profile @@ -1448,6 +1443,11 @@ This is your own one-time link! Created on %@ No comment provided by engineer. + + Creating link… + Creating link… + No comment provided by engineer. + Current Passcode Current Passcode @@ -1998,6 +1998,11 @@ This cannot be undone! Enable automatic message deletion? No comment provided by engineer. + + Enable camera access + Enable camera access + No comment provided by engineer. + Enable for all Enable for all @@ -2063,6 +2068,11 @@ This cannot be undone! Encrypted message or another event notification + + Encrypted message: app is stopped + Encrypted message: app is stopped + notification + Encrypted message: database error Encrypted message: database error @@ -2293,6 +2303,11 @@ This cannot be undone! Error loading %@ servers No comment provided by engineer. + + Error opening chat + Error opening chat + No comment provided by engineer. + Error receiving file Error receiving file @@ -2333,6 +2348,11 @@ This cannot be undone! Error saving user password No comment provided by engineer. + + Error scanning code: %@ + Error scanning code: %@ + No comment provided by engineer. + Error sending email Error sending email @@ -2808,11 +2828,6 @@ This cannot be undone! If you can't meet in person, show QR code in a video call, or share the link. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! If you enter this passcode when opening the app, all app data will be irreversibly removed! @@ -2970,16 +2985,31 @@ This cannot be undone! Interface No comment provided by engineer. + + Invalid QR code + Invalid QR code + No comment provided by engineer. + Invalid connection link Invalid connection link No comment provided by engineer. + + Invalid link + Invalid link + No comment provided by engineer. + Invalid name! Invalid name! No comment provided by engineer. + + Invalid response + Invalid response + No comment provided by engineer. + Invalid server address! Invalid server address! @@ -3098,11 +3128,21 @@ This is your link for group %@! Joining group No comment provided by engineer. + + Keep + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + Keep unused invitation? + No comment provided by engineer. + Keep your connections Keep your connections @@ -3188,6 +3228,11 @@ This is your link for group %@! Live messages No comment provided by engineer. + + Local + Local + No comment provided by engineer. + Local name Local name @@ -3428,6 +3473,11 @@ This is your link for group %@! New Passcode No comment provided by engineer. + + New chat + New chat + No comment provided by engineer. + New contact request New contact request @@ -3552,16 +3602,16 @@ This is your link for group %@! - disable members ("observer" role) No comment provided by engineer. + + OK + OK + No comment provided by engineer. + Off Off No comment provided by engineer. - - Off (Local) - Off (Local) - No comment provided by engineer. - Ok Ok @@ -3702,9 +3752,19 @@ This is your link for group %@! Open-source protocol and code – anybody can run the servers. No comment provided by engineer. - - Opening database… - Opening database… + + Opening app… + Opening app… + No comment provided by engineer. + + + Or scan QR code + Or scan QR code + No comment provided by engineer. + + + Or show this code + Or show this code No comment provided by engineer. @@ -3747,11 +3807,6 @@ This is your link for group %@! Password to show No comment provided by engineer. - - Paste - Paste - No comment provided by engineer. - Paste desktop address Paste desktop address @@ -3762,16 +3817,11 @@ This is your link for group %@! Paste image No comment provided by engineer. - - Paste received link - Paste received link + + Paste the link you received + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Paste the link you received to connect with your contact. - placeholder - People can connect to you only via the links you share. People can connect to you only via the links you share. @@ -3807,6 +3857,13 @@ This is your link for group %@! Please check yours and your contact preferences. No comment provided by engineer. + + Please contact developers. +Error: %@ + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Please contact group admin. @@ -4012,6 +4069,11 @@ This is your link for group %@! Read more in [User Guide](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4222,6 +4284,11 @@ This is your link for group %@! Restore database error No comment provided by engineer. + + Retry + Retry + No comment provided by engineer. + Reveal Reveal @@ -4377,6 +4444,11 @@ This is your link for group %@! Search No comment provided by engineer. + + Search or paste SimpleX link + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Secure queue @@ -4652,9 +4724,9 @@ This is your link for group %@! Share link No comment provided by engineer. - - Share one-time invitation link - Share one-time invitation link + + Share this 1-time invite link + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4849,16 @@ This is your link for group %@! Somebody notification title - - Start a new chat - Start a new chat - No comment provided by engineer. - Start chat Start chat No comment provided by engineer. + + Start chat? + Start chat? + No comment provided by engineer. + Start migration Start migration @@ -4912,6 +4984,16 @@ This is your link for group %@! Tap to join incognito No comment provided by engineer. + + Tap to paste link + Tap to paste link + No comment provided by engineer. + + + Tap to scan + Tap to scan + No comment provided by engineer. + Tap to start a new chat Tap to start a new chat @@ -4974,6 +5056,11 @@ It can happen because of some bug or when the connection is compromised.The attempt to change database passphrase was not completed. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! The connection you accepted will be cancelled! @@ -5039,6 +5126,11 @@ It can happen because of some bug or when the connection is compromised.The servers for new connections of your current chat profile **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Theme @@ -5191,11 +5283,6 @@ You will be prompted to complete authentication before this feature is enabled.< Turn off No comment provided by engineer. - - Turn off notifications? - Turn off notifications? - No comment provided by engineer. - Turn on Turn on @@ -5398,6 +5485,11 @@ To connect, please ask your contact to create another connection link and check Use new incognito profile No comment provided by engineer. + + Use only local notifications? + Use only local notifications? + No comment provided by engineer. + Use server Use server @@ -5660,11 +5752,6 @@ Repeat join request? You can accept calls from lock screen, without device and app authentication. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - No comment provided by engineer. - You can create it later You can create it later @@ -5685,6 +5772,11 @@ Repeat join request? You can hide or mute a user profile - swipe it to the right. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ You can now send messages to %@ @@ -5725,6 +5817,11 @@ Repeat join request? You can use markdown to format messages: No comment provided by engineer. + + You can view invitation link again in connection details. + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! You can't send messages! @@ -5914,13 +6011,6 @@ You can cancel this connection and remove the contact (and try later with a new Your contacts can allow full message deletion. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Your contacts in SimpleX will see it. -You can change it in Settings. - No comment provided by engineer. - Your contacts will remain connected. Your contacts will remain connected. diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index ccc7ee3446..0f2accb893 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -89,6 +89,7 @@ %@ and %@ + %@ y %@ No comment provided by engineer. @@ -103,6 +104,7 @@ %@ connected + %@ conectado No comment provided by engineer. @@ -132,6 +134,7 @@ %@, %@ and %lld members + %@, %@ y %lld miembro(s) más No comment provided by engineer. @@ -201,6 +204,7 @@ %lld group events + %lld evento(s) de grupo No comment provided by engineer. @@ -210,14 +214,17 @@ %lld messages blocked + %lld mensaje(s) bloqueado(s) No comment provided by engineer. %lld messages marked deleted + %lld mensaje(s) marcado(s) eliminado(s) No comment provided by engineer. %lld messages moderated by %@ + %lld mensaje(s) moderado(s) por %@ No comment provided by engineer. @@ -292,10 +299,12 @@ (new) + (nuevo) No comment provided by engineer. (this device v%@) + (este dispositivo v%@) No comment provided by engineer. @@ -303,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Añadir nuevo contacto**: para crear tu código QR o enlace de un uso para tu contacto. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Crea enlace / código QR** para que tu contacto lo use. + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +335,6 @@ **Más privado**: no se usa el servidor de notificaciones de SimpleX Chat, los mensajes se comprueban periódicamente en segundo plano (dependiendo de la frecuencia con la que utilices la aplicación). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Pega el enlace recibido** o ábrelo en el navegador y pulsa **Abrir en aplicación móvil**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Atención**: NO podrás recuperar o cambiar la contraseña si la pierdes. @@ -338,11 +345,6 @@ **Recomendado**: el token del dispositivo y las notificaciones se envían al servidor de notificaciones de SimpleX Chat, pero no el contenido del mensaje, su tamaño o su procedencia. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Escanear código QR**: en persona para conectarte con tu contacto, o por videollamada. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Advertencia**: Las notificaciones automáticas instantáneas requieren una contraseña guardada en Keychain. @@ -390,6 +392,9 @@ - optionally notify deleted contacts. - profile names with spaces. - and more! + - notificar opcionalmente a los contactos eliminados. +- nombres de perfil con espacios. +- ¡...y más! No comment provided by engineer. @@ -408,6 +413,7 @@ 0 sec + 0 seg time to disappear @@ -440,11 +446,6 @@ una semana time interval - - 1-time link - Enlace un uso - No comment provided by engineer. - 5 minutes 5 minutos @@ -560,6 +561,10 @@ Añade la dirección a tu perfil para que tus contactos puedan compartirla con otros. La actualización del perfil se enviará a tus contactos. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Añadir servidores predefinidos @@ -637,6 +642,7 @@ All new messages from %@ will be hidden! + ¡Los mensajes nuevos de %@ estarán ocultos! No comment provided by engineer. @@ -746,10 +752,12 @@ Already connecting! + ¡Ya en proceso de conexión! No comment provided by engineer. Already joining the group! + ¡Ya en proceso de unirse al grupo! No comment provided by engineer. @@ -874,6 +882,7 @@ Bad desktop address + Dirección ordenador incorrecta No comment provided by engineer. @@ -888,6 +897,7 @@ Better groups + Grupos mejorados No comment provided by engineer. @@ -897,18 +907,22 @@ Block + Bloquear No comment provided by engineer. Block group members + Bloquear miembros del grupo No comment provided by engineer. Block member + Bloquear miembro No comment provided by engineer. Block member? + ¿Bloquear miembro? No comment provided by engineer. @@ -956,6 +970,10 @@ Llamadas No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! ¡No se puede eliminar el perfil! @@ -1072,6 +1090,10 @@ Chat está detenido No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Preferencias de Chat @@ -1174,6 +1196,7 @@ Connect automatically + Conectar automáticamente No comment provided by engineer. @@ -1183,24 +1206,31 @@ Connect to desktop + Conectar con ordenador No comment provided by engineer. Connect to yourself? + ¿Conectarte a tí mismo? No comment provided by engineer. Connect to yourself? This is your own SimpleX address! + ¿Conectarte a tí mismo? +¡Esta es tu propia dirección SimpleX! No comment provided by engineer. Connect to yourself? This is your own one-time link! + ¿Conectarte a tí mismo? +¡Este es tu propio enlace de un solo uso! No comment provided by engineer. Connect via contact address + Conectar mediante dirección de contacto No comment provided by engineer. @@ -1208,11 +1238,6 @@ This is your own one-time link! Conectar mediante enlace No comment provided by engineer. - - Connect via link / QR code - Conecta vía enlace / Código QR - No comment provided by engineer. - Connect via one-time link Conectar mediante enlace de un sólo uso @@ -1220,14 +1245,17 @@ This is your own one-time link! Connect with %@ + Conectar con %@ No comment provided by engineer. Connected desktop + Ordenador conectado No comment provided by engineer. Connected to desktop + Conectado con ordenador No comment provided by engineer. @@ -1242,6 +1270,7 @@ This is your own one-time link! Connecting to desktop + Conectando con ordenador No comment provided by engineer. @@ -1266,6 +1295,7 @@ This is your own one-time link! Connection terminated + Conexión finalizada No comment provided by engineer. @@ -1335,6 +1365,7 @@ This is your own one-time link! Correct name to %@? + ¿Corregir el nombre a %@? No comment provided by engineer. @@ -1344,11 +1375,12 @@ This is your own one-time link! Create SimpleX address - Crear tu dirección SimpleX + Crear dirección SimpleX No comment provided by engineer. Create a group using a random profile. + Crear grupo usando perfil aleatorio. No comment provided by engineer. @@ -1363,6 +1395,7 @@ This is your own one-time link! Create group + Crear grupo No comment provided by engineer. @@ -1380,13 +1413,9 @@ This is your own one-time link! Crea perfil nuevo en la [aplicación para PC](https://simplex.Descargas/de chat/). 💻 No comment provided by engineer. - - Create one-time invitation link - Crea enlace de invitación de un uso - No comment provided by engineer. - Create profile + Crear perfil No comment provided by engineer. @@ -1409,6 +1438,10 @@ This is your own one-time link! Creado en %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Código de Acceso @@ -1549,6 +1582,7 @@ This is your own one-time link! Delete %lld messages? + ¿Elimina %lld mensajes? No comment provided by engineer. @@ -1578,6 +1612,7 @@ This is your own one-time link! Delete and notify contact + Eliminar y notificar contacto No comment provided by engineer. @@ -1613,6 +1648,8 @@ This is your own one-time link! Delete contact? This cannot be undone! + ¿Eliminar contacto? +¡No podrá deshacerse! No comment provided by engineer. @@ -1757,14 +1794,17 @@ This cannot be undone! Desktop address + Dirección ordenador No comment provided by engineer. Desktop app version %@ is not compatible with this app. + La versión de aplicación del ordenador %" no es compatible con esta aplicación. No comment provided by engineer. Desktop devices + Ordenadores No comment provided by engineer. @@ -1859,6 +1899,7 @@ This cannot be undone! Disconnect desktop? + ¿Desconectar ordenador? No comment provided by engineer. @@ -1868,6 +1909,7 @@ This cannot be undone! Discover via local network + Descubrir en red local No comment provided by engineer. @@ -1950,6 +1992,10 @@ This cannot be undone! ¿Activar eliminación automática de mensajes? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Activar para todos @@ -2015,6 +2061,10 @@ This cannot be undone! Mensaje cifrado u otro evento notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Mensaje cifrado: error base de datos @@ -2042,10 +2092,12 @@ This cannot be undone! Encryption re-negotiation error + Error de renegociación de cifrado message decrypt error item Encryption re-negotiation failed. + Renegociación de cifrado fallida. No comment provided by engineer. @@ -2060,6 +2112,7 @@ This cannot be undone! Enter group name… + Nombre del grupo… No comment provided by engineer. @@ -2079,6 +2132,7 @@ This cannot be undone! Enter this device name… + Nombre de este dispositivo… No comment provided by engineer. @@ -2093,6 +2147,7 @@ This cannot be undone! Enter your name… + Introduce tu nombre… No comment provided by engineer. @@ -2240,6 +2295,10 @@ This cannot be undone! Error al cargar servidores %@ No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Error al recibir archivo @@ -2280,6 +2339,10 @@ This cannot be undone! Error al guardar contraseña de usuario No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Error al enviar email @@ -2372,6 +2435,7 @@ This cannot be undone! Expand + Expandir chat item action @@ -2406,6 +2470,7 @@ This cannot be undone! Faster joining and more reliable messages. + Mensajería más segura y conexión más rápida. No comment provided by engineer. @@ -2505,6 +2570,7 @@ This cannot be undone! Found desktop + Ordenador encontrado No comment provided by engineer. @@ -2529,6 +2595,7 @@ This cannot be undone! Fully decentralized – visible only to members. + Completamente descentralizado: sólo visible a los miembros. No comment provided by engineer. @@ -2553,10 +2620,12 @@ This cannot be undone! Group already exists + El grupo ya existe No comment provided by engineer. Group already exists! + ¡El grupo ya existe! No comment provided by engineer. @@ -2749,11 +2818,6 @@ This cannot be undone! Si no puedes reunirte en persona, muestra el código QR por videollamada, o comparte el enlace. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Si no puedes reunirte en persona, puedes **escanear el código QR por videollamada**, o tu contacto puede compartir un enlace de invitación. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! ¡Si introduces este código al abrir la aplicación, todos los datos de la misma se eliminarán de forma irreversible! @@ -2831,6 +2895,7 @@ This cannot be undone! Incognito groups + Grupos incógnito No comment provided by engineer. @@ -2865,6 +2930,7 @@ This cannot be undone! Incompatible version + Versión incompatible No comment provided by engineer. @@ -2909,13 +2975,26 @@ This cannot be undone! Interfaz No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Enlace de conexión no válido No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! + ¡Nombre no válido! + No comment provided by engineer. + + + Invalid response No comment provided by engineer. @@ -3011,6 +3090,7 @@ This cannot be undone! Join group? + ¿Unirse al grupo? No comment provided by engineer. @@ -3020,11 +3100,14 @@ This cannot be undone! Join with current profile + Unirte con el perfil actual No comment provided by engineer. Join your group? This is your link for group %@! + ¿Unirse a tu grupo? +¡Este es tu enlace para el grupo %@! No comment provided by engineer. @@ -3032,8 +3115,17 @@ This is your link for group %@! Entrando al grupo No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop + Mantén la aplicación abierta para usarla desde el ordenador + No comment provided by engineer. + + + Keep unused invitation? No comment provided by engineer. @@ -3098,14 +3190,17 @@ This is your link for group %@! Link mobile and desktop apps! 🔗 + ¡Enlazar aplicación móvil con ordenador! 🔗 No comment provided by engineer. Linked desktop options + Opciones ordenador enlazado No comment provided by engineer. Linked desktops + Ordenadores enlazados No comment provided by engineer. @@ -3118,6 +3213,11 @@ This is your link for group %@! Mensajes en vivo No comment provided by engineer. + + Local + Local + No comment provided by engineer. + Local name Nombre local @@ -3260,6 +3360,7 @@ This is your link for group %@! Messages from %@ will be shown! + ¡Los mensajes de %@ serán mostrados! No comment provided by engineer. @@ -3357,6 +3458,10 @@ This is your link for group %@! Código Nuevo No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Nueva solicitud de contacto @@ -3459,6 +3564,7 @@ This is your link for group %@! Not compatible! + ¡No compatible! No comment provided by engineer. @@ -3480,16 +3586,15 @@ This is your link for group %@! - desactivar el rol miembro (a rol "observador") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Desactivado No comment provided by engineer. - - Off (Local) - Desactivado (Local) - No comment provided by engineer. - Ok Ok @@ -3617,6 +3722,7 @@ This is your link for group %@! Open group + Grupo abierto No comment provided by engineer. @@ -3629,9 +3735,16 @@ This is your link for group %@! Protocolo y código abiertos: cualquiera puede usar los servidores. No comment provided by engineer. - - Opening database… - Abriendo base de datos… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3674,13 +3787,9 @@ This is your link for group %@! Contraseña para hacerlo visible No comment provided by engineer. - - Paste - Pegar - No comment provided by engineer. - Paste desktop address + Pegar dirección de ordenador No comment provided by engineer. @@ -3688,16 +3797,10 @@ This is your link for group %@! Pegar imagen No comment provided by engineer. - - Paste received link - Pegar enlace recibido + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Pega el enlace que has recibido en el recuadro para conectar con tu contacto. - placeholder - People can connect to you only via the links you share. Las personas pueden conectarse contigo solo mediante los enlaces que compartes. @@ -3733,6 +3836,11 @@ This is your link for group %@! Comprueba tus preferencias y las de tu contacto. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Póngase en contacto con el administrador del grupo. @@ -3830,10 +3938,12 @@ This is your link for group %@! Profile name + Nombre del perfil No comment provided by engineer. Profile name: + Nombre del perfil: No comment provided by engineer. @@ -3936,6 +4046,10 @@ This is your link for group %@! Más información en el [Manual de usuario](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Más información en el [Manual de usuario](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4083,10 +4197,12 @@ This is your link for group %@! Repeat connection request? + ¿Repetir solicitud de conexión? No comment provided by engineer. Repeat join request? + ¿Repetir solicitud de admisión? No comment provided by engineer. @@ -4144,6 +4260,10 @@ This is your link for group %@! Error al restaurar base de datos No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Revelar @@ -4276,6 +4396,7 @@ This is your link for group %@! Scan QR code from desktop + Escanear código QR desde ordenador No comment provided by engineer. @@ -4298,6 +4419,10 @@ This is your link for group %@! Buscar No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Cola segura @@ -4500,6 +4625,7 @@ This is your link for group %@! Session code + Código de sesión No comment provided by engineer. @@ -4572,9 +4698,8 @@ This is your link for group %@! Compartir enlace No comment provided by engineer. - - Share one-time invitation link - Compartir enlace de invitación de un uso + + Share this 1-time invite link No comment provided by engineer. @@ -4697,16 +4822,15 @@ This is your link for group %@! Alguien notification title - - Start a new chat - Iniciar chat nuevo - No comment provided by engineer. - Start chat Iniciar chat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Iniciar migración @@ -4814,6 +4938,7 @@ This is your link for group %@! Tap to Connect + Pulsa para conectar No comment provided by engineer. @@ -4831,6 +4956,14 @@ This is your link for group %@! Pulsa para unirte en modo incógnito No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Pulsa para iniciar chat nuevo @@ -4893,6 +5026,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. El intento de cambiar la contraseña de la base de datos no se ha completado. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! ¡La conexión que has aceptado se cancelará! @@ -4958,6 +5095,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. Lista de servidores para las conexiones nuevas de tu perfil actual **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Tema @@ -5000,6 +5141,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. This device name + Nombre del dispositivo No comment provided by engineer. @@ -5014,10 +5156,12 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. This is your own SimpleX address! + ¡Esta es tu propia dirección SimpleX! No comment provided by engineer. This is your own one-time link! + ¡Este es tu propio enlace de un solo uso! No comment provided by engineer. @@ -5037,6 +5181,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. To hide unwanted messages. + Para ocultar mensajes no deseados. No comment provided by engineer. @@ -5046,7 +5191,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. 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. + Para proteger tu 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. No comment provided by engineer. @@ -5057,7 +5202,7 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. To protect your information, turn on SimpleX Lock. You will be prompted to complete authentication before this feature is enabled. - Para proteger tu información, activa Bloqueo SimpleX. + Para proteger tu información, activa el Bloqueo SimpleX. Se te pedirá que completes la autenticación antes de activar esta función. No comment provided by engineer. @@ -5106,11 +5251,6 @@ Se te pedirá que completes la autenticación antes de activar esta función.Desactivar No comment provided by engineer. - - Turn off notifications? - ¿Desactivar notificaciones? - No comment provided by engineer. - Turn on Activar @@ -5123,14 +5263,17 @@ Se te pedirá que completes la autenticación antes de activar esta función. Unblock + Desbloquear No comment provided by engineer. Unblock member + Desbloquear miembro No comment provided by engineer. Unblock member? + ¿Desbloquear miembro? No comment provided by engineer. @@ -5198,10 +5341,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Unlink + Desenlazar No comment provided by engineer. Unlink desktop? + ¿Desenlazar ordenador? No comment provided by engineer. @@ -5296,6 +5441,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Use from desktop + Usar desde ordenador No comment provided by engineer. @@ -5308,6 +5454,10 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Usar nuevo perfil incógnito No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Usar servidor @@ -5330,10 +5480,12 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Verify code with desktop + Verificar código con ordenador No comment provided by engineer. Verify connection + Verificar conexión No comment provided by engineer. @@ -5343,6 +5495,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Verify connections + Verificar conexiones No comment provided by engineer. @@ -5357,6 +5510,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Via secure quantum resistant protocol. + Mediante protocolo seguro de resistencia cuántica. No comment provided by engineer. @@ -5411,6 +5565,7 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb Waiting for desktop... + Esperando ordenador... No comment provided by engineer. @@ -5515,31 +5670,39 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb You are already connecting to %@. + Ya estás conectando con %@. No comment provided by engineer. You are already connecting via this one-time link! + ¡Ya estás conectando mediante este enlace de un solo uso! No comment provided by engineer. You are already in group %@. + Ya estás en el grupo %@. No comment provided by engineer. You are already joining the group %@. + Ya estás uniéndote al grupo %@. No comment provided by engineer. You are already joining the group via this link! + ¡Ya estás uniéndote al grupo mediante este enlace! No comment provided by engineer. You are already joining the group via this link. + Ya estás uniéndote al grupo mediante este enlace. No comment provided by engineer. You are already joining the group! Repeat join request? + ¡En proceso de unirte al grupo! +¿Repetir solicitud de admisión? No comment provided by engineer. @@ -5557,11 +5720,6 @@ Repeat join request? Puede aceptar llamadas desde la pantalla de bloqueo, sin autenticación de dispositivos y aplicaciones. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - También puedes conectarte haciendo clic en el enlace. Si se abre en el navegador, haz clic en el botón **Abrir en aplicación móvil**. - No comment provided by engineer. - You can create it later Puedes crearla más tarde @@ -5582,6 +5740,10 @@ Repeat join request? Puedes ocultar o silenciar un perfil deslizándolo a la derecha. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Ya puedes enviar mensajes a %@ @@ -5622,6 +5784,10 @@ Repeat join request? Puedes usar la sintaxis markdown para dar formato a tus mensajes: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! ¡No puedes enviar mensajes! @@ -5639,11 +5805,14 @@ Repeat join request? You have already requested connection via this address! + ¡Ya has solicitado la conexión mediante esta dirección! No comment provided by engineer. You have already requested connection! Repeat connection request? + Ya has solicitado la conexión +¿Repetir solicitud? No comment provided by engineer. @@ -5698,6 +5867,7 @@ Repeat connection request? You will be connected when group link host's device is online, please wait or check later! + Te conectarás cuando el dispositivo propietario del grupo esté en línea, por favor espera o compruébalo más tarde. No comment provided by engineer. @@ -5717,6 +5887,7 @@ Repeat connection request? You will connect to all group members. + Te conectarás con todos los miembros del grupo. No comment provided by engineer. @@ -5806,13 +5977,6 @@ Puedes cancelar esta conexión y eliminar el contacto (e intentarlo más tarde c Tus contactos pueden permitir la eliminación completa de mensajes. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Tus contactos en SimpleX lo verán. -Puedes cambiarlo en Configuración. - No comment provided by engineer. - Your contacts will remain connected. Tus contactos permanecerán conectados. @@ -5840,6 +6004,7 @@ Puedes cambiarlo en Configuración. Your profile + Tu perfil No comment provided by engineer. @@ -5936,6 +6101,7 @@ Los servidores de SimpleX no pueden ver tu perfil. and %lld other events + y %lld evento(s) más No comment provided by engineer. @@ -5945,6 +6111,7 @@ Los servidores de SimpleX no pueden ver tu perfil. author + autor member role @@ -5959,6 +6126,7 @@ Los servidores de SimpleX no pueden ver tu perfil. blocked + bloqueado No comment provided by engineer. @@ -6133,6 +6301,7 @@ Los servidores de SimpleX no pueden ver tu perfil. deleted contact + contacto eliminado rcv direct event chat item @@ -6317,7 +6486,7 @@ Los servidores de SimpleX no pueden ver tu perfil. invited to connect - invitado a conectarse + invitación a conectarse chat list item title @@ -6529,6 +6698,7 @@ Los servidores de SimpleX no pueden ver tu perfil. v%@ + v%@ No comment provided by engineer. @@ -6628,7 +6798,7 @@ Los servidores de SimpleX no pueden ver tu perfil. you shared one-time link - has compartido un enlace de un uso + enlace de un solo uso chat list item description @@ -6670,6 +6840,7 @@ Los servidores de SimpleX no pueden ver tu perfil. SimpleX uses local network access to allow using user chat profile via desktop app on the same network. + SimpleX utiliza el acceso a la red local para abrir el perfil de chat en la aplicación de ordenador en la misma red. Privacy - Local Network Usage Description diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index cf161efae4..81bc19013b 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -303,14 +303,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Lisää uusi kontakti**: luo kertakäyttöinen QR-koodi tai linkki kontaktille. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Luo linkki / QR-koodi* kontaktille. + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +326,6 @@ **Yksityisin**: älä käytä SimpleX Chat -ilmoituspalvelinta, tarkista viestit ajoittain taustalla (riippuu siitä, kuinka usein käytät sovellusta). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Liitä vastaanotettu linkki** tai avaa se selaimessa ja napauta **Avaa mobiilisovelluksessa**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Huomaa**: et voi palauttaa tai muuttaa tunnuslausetta, jos kadotat sen. @@ -338,11 +336,6 @@ **Suositus**: laitetunnus ja ilmoitukset lähetetään SimpleX Chat -ilmoituspalvelimelle, mutta ei viestin sisältöä, kokoa tai sitä, keneltä se on peräisin. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Skannaa QR-koodi**: muodosta yhteys kontaktiisi henkilökohtaisesti tai videopuhelun kautta. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Varoitus**: Välittömät push-ilmoitukset vaativat tunnuslauseen, joka on tallennettu Keychainiin. @@ -437,11 +430,6 @@ 1 viikko time interval - - 1-time link - Kertakäyttölinkki - No comment provided by engineer. - 5 minutes 5 minuuttia @@ -557,6 +545,10 @@ Lisää osoite profiiliisi, jotta kontaktisi voivat jakaa sen muiden kanssa. Profiilipäivitys lähetetään kontakteillesi. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Lisää esiasetettuja palvelimia @@ -951,6 +943,10 @@ Puhelut No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Käyttäjäprofiilia ei voi poistaa! @@ -1067,6 +1063,10 @@ Chat on pysäytetty No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Chat-asetukset @@ -1203,11 +1203,6 @@ This is your own one-time link! Yhdistä linkin kautta No comment provided by engineer. - - Connect via link / QR code - Yhdistä linkillä / QR-koodilla - No comment provided by engineer. - Connect via one-time link Yhdistä kertalinkillä @@ -1375,11 +1370,6 @@ This is your own one-time link! Luo uusi profiili [työpöytäsovelluksessa](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Luo kertakutsulinkki - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1404,6 +1394,10 @@ This is your own one-time link! Luotu %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Nykyinen pääsykoodi @@ -1945,6 +1939,10 @@ This cannot be undone! Ota automaattinen viestien poisto käyttöön? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Salli kaikille @@ -2009,6 +2007,10 @@ This cannot be undone! Salattu viesti tai muu tapahtuma notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Salattu viesti: tietokantavirhe @@ -2233,6 +2235,10 @@ This cannot be undone! Virhe %@-palvelimien lataamisessa No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Virhe tiedoston vastaanottamisessa @@ -2273,6 +2279,10 @@ This cannot be undone! Virhe käyttäjän salasanan tallentamisessa No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Virhe sähköpostin lähettämisessä @@ -2741,11 +2751,6 @@ This cannot be undone! Jos et voi tavata henkilökohtaisesti, näytä QR-koodi videopuhelussa tai jaa linkki. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Jos et voi tavata henkilökohtaisesti, voit **skannata QR-koodin videopuhelussa** tai kontaktisi voi jakaa kutsulinkin. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Jos syötät tämän pääsykoodin sovellusta avatessasi, kaikki sovelluksen tiedot poistetaan peruuttamattomasti! @@ -2901,15 +2906,27 @@ This cannot be undone! Käyttöliittymä No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Virheellinen yhteyslinkki No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Virheellinen palvelinosoite! @@ -3024,10 +3041,18 @@ This is your link for group %@! Liittyy ryhmään No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Pidä kontaktisi @@ -3110,6 +3135,11 @@ This is your link for group %@! Live-viestit No comment provided by engineer. + + Local + Paikallinen + No comment provided by engineer. + Local name Paikallinen nimi @@ -3349,6 +3379,10 @@ This is your link for group %@! Uusi pääsykoodi No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Uusi kontaktipyyntö @@ -3471,16 +3505,15 @@ This is your link for group %@! - poista jäsenet käytöstä ("tarkkailija" rooli) No comment provided by engineer. + + OK + No comment provided by engineer. + Off Pois No comment provided by engineer. - - Off (Local) - Pois (Paikallinen) - No comment provided by engineer. - Ok Ok @@ -3619,9 +3652,16 @@ This is your link for group %@! Avoimen lähdekoodin protokolla ja koodi - kuka tahansa voi käyttää palvelimia. No comment provided by engineer. - - Opening database… - Avataan tietokantaa… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3664,11 +3704,6 @@ This is your link for group %@! Salasana näytettäväksi No comment provided by engineer. - - Paste - Liitä - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3678,16 +3713,10 @@ This is your link for group %@! Liitä kuva No comment provided by engineer. - - Paste received link - Liitä vastaanotettu linkki + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Liitä saamasi linkki, jonka avulla voit muodostaa yhteyden kontaktiisi. - placeholder - People can connect to you only via the links you share. Ihmiset voivat ottaa sinuun yhteyttä vain jakamiesi linkkien kautta. @@ -3723,6 +3752,11 @@ This is your link for group %@! Tarkista omasi ja kontaktin asetukset. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Ota yhteyttä ryhmän ylläpitäjään. @@ -3926,6 +3960,10 @@ This is your link for group %@! Lue lisää [Käyttöoppaasta](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Lue lisää [Käyttöoppaasta](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4134,6 +4172,10 @@ This is your link for group %@! Virhe tietokannan palauttamisessa No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Paljasta @@ -4288,6 +4330,10 @@ This is your link for group %@! Haku No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Turvallinen jono @@ -4561,9 +4607,8 @@ This is your link for group %@! Jaa linkki No comment provided by engineer. - - Share one-time invitation link - Jaa kertakutsulinkki + + Share this 1-time invite link No comment provided by engineer. @@ -4685,16 +4730,15 @@ This is your link for group %@! Joku notification title - - Start a new chat - Aloita uusi keskustelu - No comment provided by engineer. - Start chat Aloita keskustelu No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Aloita siirto @@ -4819,6 +4863,14 @@ This is your link for group %@! Napauta liittyäksesi incognito-tilassa No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Aloita uusi keskustelu napauttamalla @@ -4881,6 +4933,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.Tietokannan tunnuslauseen muuttamista ei suoritettu loppuun. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Hyväksymäsi yhteys peruuntuu! @@ -4946,6 +5002,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.Palvelimet nykyisen keskusteluprofiilisi uusille yhteyksille **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Teema @@ -5093,11 +5153,6 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote Sammuta No comment provided by engineer. - - Turn off notifications? - Kytke ilmoitukset pois päältä? - No comment provided by engineer. - Turn on Kytke päälle @@ -5294,6 +5349,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Käytä uutta incognito-profiilia No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Käytä palvelinta @@ -5543,11 +5602,6 @@ Repeat join request? Voit vastaanottaa puheluita lukitusnäytöltä ilman laitteen ja sovelluksen todennusta. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Voit myös muodostaa yhteyden klikkaamalla linkkiä. Jos se avautuu selaimessa, napsauta **Avaa mobiilisovelluksessa**-painiketta. - No comment provided by engineer. - You can create it later Voit luoda sen myöhemmin @@ -5568,6 +5622,10 @@ Repeat join request? Voit piilottaa tai mykistää käyttäjäprofiilin pyyhkäisemällä sitä oikealle. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Voit nyt lähettää viestejä %@:lle @@ -5608,6 +5666,10 @@ Repeat join request? Voit käyttää markdownia viestien muotoiluun: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Et voi lähettää viestejä! @@ -5792,13 +5854,6 @@ Voit peruuttaa tämän yhteyden ja poistaa kontaktin (ja yrittää myöhemmin uu Kontaktisi voivat sallia viestien täydellisen poistamisen. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Kontaktisi SimpleX:ssä näkevät sen. -Voit muuttaa sitä Asetuksista. - No comment provided by engineer. - Your contacts will remain connected. Kontaktisi pysyvät yhdistettyinä. diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 153d98be3c..4d08ee9652 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Ajouter un nouveau contact** : pour créer un lien ou code QR unique pour votre contact. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Créer un lien / code QR** que votre contact pourra utiliser. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Confidentiel** : ne pas utiliser le serveur de notifications SimpleX, vérification de nouveaux messages periodiquement en arrière plan (dépend de l'utilisation de l'app). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Collez le lien reçu** ou ouvrez-le dans votre navigateur et appuyez sur **Open in mobile app**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Veuillez noter** : vous NE pourrez PAS récupérer ou modifier votre phrase secrète si vous la perdez. @@ -347,11 +345,6 @@ **Recommandé** : le token de l'appareil et les notifications sont envoyés au serveur de notifications SimpleX, mais pas le contenu du message, sa taille ou son auteur. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Scanner le code QR** : pour vous connecter à votre contact en personne ou par appel vidéo. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Avertissement** : les notifications push instantanées nécessitent une phrase secrète enregistrée dans la keychain. @@ -453,11 +446,6 @@ 1 semaine time interval - - 1-time link - Lien à usage unique - No comment provided by engineer. - 5 minutes 5 minutes @@ -573,6 +561,10 @@ Ajoutez une adresse à votre profil, afin que vos contacts puissent la partager avec d'autres personnes. La mise à jour du profil sera envoyée à vos contacts. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Ajouter des serveurs prédéfinis @@ -978,6 +970,10 @@ Appels No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Impossible de supprimer le profil d'utilisateur ! @@ -1094,6 +1090,10 @@ Le chat est arrêté No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Préférences de chat @@ -1238,11 +1238,6 @@ Il s'agit de votre propre lien unique ! Se connecter via un lien No comment provided by engineer. - - Connect via link / QR code - Se connecter via un lien / code QR - No comment provided by engineer. - Connect via one-time link Se connecter via un lien unique @@ -1418,11 +1413,6 @@ Il s'agit de votre propre lien unique ! Créer un nouveau profil sur [l'application de bureau](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Créer un lien d'invitation unique - No comment provided by engineer. - Create profile Créer le profil @@ -1448,6 +1438,10 @@ Il s'agit de votre propre lien unique ! Créé le %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Code d'accès actuel @@ -1998,6 +1992,10 @@ Cette opération ne peut être annulée ! Activer la suppression automatique des messages ? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Activer pour tous @@ -2063,6 +2061,10 @@ Cette opération ne peut être annulée ! Message chiffrée ou autre événement notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Message chiffrée : erreur de base de données @@ -2293,6 +2295,10 @@ Cette opération ne peut être annulée ! Erreur lors du chargement des serveurs %@ No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Erreur lors de la réception du fichier @@ -2333,6 +2339,10 @@ Cette opération ne peut être annulée ! Erreur d'enregistrement du mot de passe de l'utilisateur No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Erreur lors de l'envoi de l'e-mail @@ -2808,11 +2818,6 @@ Cette opération ne peut être annulée ! Si vous ne pouvez pas vous rencontrer en personne, montrez le code QR lors d'un appel vidéo ou partagez le lien. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Si vous ne pouvez pas voir la personne, vous pouvez **scanner le code QR dans un appel vidéo**, ou votre contact peut vous partager un lien d'invitation. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Si vous saisissez ce code à l'ouverture de l'application, toutes les données de l'application seront irréversiblement supprimées ! @@ -2970,16 +2975,28 @@ Cette opération ne peut être annulée ! Interface No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Lien de connection invalide No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Nom invalide ! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Adresse de serveur invalide ! @@ -3098,11 +3115,19 @@ Voici votre lien pour le groupe %@ ! Entrain de rejoindre le groupe No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Garder l'application ouverte pour l'utiliser depuis le bureau No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Conserver vos connexions @@ -3188,6 +3213,11 @@ Voici votre lien pour le groupe %@ ! Messages dynamiques No comment provided by engineer. + + Local + Local + No comment provided by engineer. + Local name Nom local @@ -3428,6 +3458,10 @@ Voici votre lien pour le groupe %@ ! Nouveau code d'accès No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Nouvelle demande de contact @@ -3552,16 +3586,15 @@ Voici votre lien pour le groupe %@ ! - désactiver des membres (rôle "observateur") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Off No comment provided by engineer. - - Off (Local) - Off (Local) - No comment provided by engineer. - Ok Ok @@ -3702,9 +3735,16 @@ Voici votre lien pour le groupe %@ ! Protocole et code open-source – n'importe qui peut heberger un serveur. No comment provided by engineer. - - Opening database… - Ouverture de la base de données… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3747,11 +3787,6 @@ Voici votre lien pour le groupe %@ ! Mot de passe à entrer No comment provided by engineer. - - Paste - Coller - No comment provided by engineer. - Paste desktop address Coller l'adresse du bureau @@ -3762,16 +3797,10 @@ Voici votre lien pour le groupe %@ ! Coller l'image No comment provided by engineer. - - Paste received link - Coller le lien reçu + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Collez le lien que vous avez reçu dans le cadre ci-dessous pour vous connecter avec votre contact. - placeholder - People can connect to you only via the links you share. On ne peut se connecter à vous qu’avec les liens que vous partagez. @@ -3807,6 +3836,11 @@ Voici votre lien pour le groupe %@ ! Veuillez vérifier vos préférences ainsi que celles de votre contact. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Veuillez contacter l'administrateur du groupe. @@ -4012,6 +4046,10 @@ Voici votre lien pour le groupe %@ ! Pour en savoir plus, consultez le [Guide de l'utilisateur](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Pour en savoir plus, consultez le [Guide de l'utilisateur](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4222,6 +4260,10 @@ Voici votre lien pour le groupe %@ ! Erreur de restauration de la base de données No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Révéler @@ -4377,6 +4419,10 @@ Voici votre lien pour le groupe %@ ! Recherche No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue File d'attente sécurisée @@ -4652,9 +4698,8 @@ Voici votre lien pour le groupe %@ ! Partager le lien No comment provided by engineer. - - Share one-time invitation link - Partager un lien d'invitation unique + + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4822,15 @@ Voici votre lien pour le groupe %@ ! Quelqu'un notification title - - Start a new chat - Commencer une nouvelle conversation - No comment provided by engineer. - Start chat Démarrer le chat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Démarrer la migration @@ -4912,6 +4956,14 @@ Voici votre lien pour le groupe %@ ! Appuyez pour rejoindre incognito No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Appuyez ici pour démarrer une nouvelle discussion @@ -4974,6 +5026,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. La tentative de modification de la phrase secrète de la base de données n'a pas abouti. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! La connexion que vous avez acceptée sera annulée ! @@ -5039,6 +5095,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. Les serveurs pour les nouvelles connexions de votre profil de chat actuel **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Thème @@ -5191,11 +5251,6 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s Désactiver No comment provided by engineer. - - Turn off notifications? - Désactiver les notifications ? - No comment provided by engineer. - Turn on Activer @@ -5398,6 +5453,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Utiliser un nouveau profil incognito No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Utiliser ce serveur @@ -5660,11 +5719,6 @@ Répéter la demande d'adhésion ? Vous pouvez accepter des appels à partir de l'écran de verrouillage, sans authentification de l'appareil ou de l'application. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Vous pouvez également vous connecter en cliquant sur le lien. S'il s'ouvre dans le navigateur, cliquez sur le bouton **Open in mobile app**. - No comment provided by engineer. - You can create it later Vous pouvez la créer plus tard @@ -5685,6 +5739,10 @@ Répéter la demande d'adhésion ? Vous pouvez masquer ou mettre en sourdine un profil d'utilisateur - faites-le glisser vers la droite. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Vous pouvez maintenant envoyer des messages à %@ @@ -5725,6 +5783,10 @@ Répéter la demande d'adhésion ? Vous pouvez utiliser le format markdown pour mettre en forme les messages : No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Vous ne pouvez pas envoyer de messages ! @@ -5914,13 +5976,6 @@ Vous pouvez annuler la connexion et supprimer le contact (et réessayer plus tar Vos contacts peuvent autoriser la suppression complète des messages. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Vos contacts dans SimpleX la verront. -Vous pouvez modifier ce choix dans les Paramètres. - No comment provided by engineer. - Your contacts will remain connected. Vos contacts resteront connectés. @@ -6537,12 +6592,12 @@ Les serveurs SimpleX ne peuvent pas voir votre profil. offered %@ - offert %@ + propose %@ feature offered item offered %1$@: %2$@ - offert %1$@ : %2$@ + propose %1$@ : %2$@ feature offered item diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index bf1b1ee386..d9d48bd995 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -94,7 +94,7 @@ %@ and %@ connected - %@ e %@ sono connessi/e + %@ e %@ si sono connessi/e No comment provided by engineer. @@ -139,7 +139,7 @@ %@, %@ and %lld other members connected - %@, %@ e altri %lld membri sono connessi + %@, %@ e altri %lld membri si sono connessi No comment provided by engineer. @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Aggiungi un contatto**: per creare il tuo codice QR o link una tantum per il tuo contatto. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Crea link / codice QR** da usare per il tuo contatto. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Il più privato**: non usare il server di notifica di SimpleX Chat, controlla i messaggi periodicamente in secondo piano (dipende da quanto spesso usi l'app). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Incolla il link ricevuto** o aprilo nel browser e tocca **Apri in app mobile**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Nota bene**: NON potrai recuperare o cambiare la password se la perdi. @@ -347,11 +345,6 @@ **Consigliato**: vengono inviati il token del dispositivo e le notifiche al server di notifica di SimpleX Chat, ma non il contenuto del messaggio,la sua dimensione o il suo mittente. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Scansiona codice QR**: per connetterti al contatto di persona o via videochiamata. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Attenzione**: le notifiche push istantanee richiedono una password salvata nel portachiavi. @@ -453,11 +446,6 @@ 1 settimana time interval - - 1-time link - Link una tantum - No comment provided by engineer. - 5 minutes 5 minuti @@ -573,6 +561,10 @@ Aggiungi l'indirizzo al tuo profilo, in modo che i tuoi contatti possano condividerlo con altre persone. L'aggiornamento del profilo verrà inviato ai tuoi contatti. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Aggiungi server preimpostati @@ -978,6 +970,10 @@ Chiamate No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Impossibile eliminare il profilo utente! @@ -1094,6 +1090,10 @@ Chat fermata No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Preferenze della chat @@ -1181,7 +1181,7 @@ Confirm new passphrase… - Conferma password nuova… + Conferma nuova password… No comment provided by engineer. @@ -1196,6 +1196,7 @@ Connect automatically + Connetti automaticamente No comment provided by engineer. @@ -1237,11 +1238,6 @@ Questo è il tuo link una tantum! Connetti via link No comment provided by engineer. - - Connect via link / QR code - Connetti via link / codice QR - No comment provided by engineer. - Connect via one-time link Connetti via link una tantum @@ -1417,11 +1413,6 @@ Questo è il tuo link una tantum! Crea un nuovo profilo nell'[app desktop](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Crea link di invito una tantum - No comment provided by engineer. - Create profile Crea profilo @@ -1447,6 +1438,10 @@ Questo è il tuo link una tantum! Creato il %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Codice di accesso attuale @@ -1914,6 +1909,7 @@ Non è reversibile! Discover via local network + Individua via rete locale No comment provided by engineer. @@ -1996,6 +1992,10 @@ Non è reversibile! Attivare l'eliminazione automatica dei messaggi? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Attiva per tutti @@ -2061,6 +2061,10 @@ Non è reversibile! Messaggio crittografato o altro evento notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Messaggio crittografato: errore del database @@ -2291,6 +2295,10 @@ Non è reversibile! Errore nel caricamento dei server %@ No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Errore nella ricezione del file @@ -2331,6 +2339,10 @@ Non è reversibile! Errore nel salvataggio della password utente No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Errore nell'invio dell'email @@ -2558,6 +2570,7 @@ Non è reversibile! Found desktop + Desktop trovato No comment provided by engineer. @@ -2805,11 +2818,6 @@ Non è reversibile! Se non potete incontrarvi di persona, mostra il codice QR in una videochiamata o condividi il link. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Se non potete incontrarvi di persona, puoi **scansionare il codice QR durante la videochiamata** oppure il tuo contatto può condividere un link di invito. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Se inserisci questo codice all'apertura dell'app, tutti i dati di essa verranno rimossi in modo irreversibile! @@ -2967,16 +2975,28 @@ Non è reversibile! Interfaccia No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Link di connessione non valido No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Nome non valido! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Indirizzo del server non valido! @@ -3095,11 +3115,19 @@ Questo è il tuo link per il gruppo %@! Ingresso nel gruppo No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Tieni aperta l'app per usarla dal desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Mantieni le tue connessioni @@ -3185,6 +3213,11 @@ Questo è il tuo link per il gruppo %@! Messaggi in diretta No comment provided by engineer. + + Local + Locale + No comment provided by engineer. + Local name Nome locale @@ -3425,6 +3458,10 @@ Questo è il tuo link per il gruppo %@! Nuovo codice di accesso No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Nuova richiesta di contatto @@ -3527,6 +3564,7 @@ Questo è il tuo link per il gruppo %@! Not compatible! + Non compatibile! No comment provided by engineer. @@ -3548,16 +3586,15 @@ Questo è il tuo link per il gruppo %@! - disattivare i membri (ruolo "osservatore") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Off No comment provided by engineer. - - Off (Local) - Off (Locale) - No comment provided by engineer. - Ok Ok @@ -3698,9 +3735,16 @@ Questo è il tuo link per il gruppo %@! Protocollo e codice open source: chiunque può gestire i server. No comment provided by engineer. - - Opening database… - Apertura del database… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3743,11 +3787,6 @@ Questo è il tuo link per il gruppo %@! Password per mostrare No comment provided by engineer. - - Paste - Incolla - No comment provided by engineer. - Paste desktop address Incolla l'indirizzo desktop @@ -3758,16 +3797,10 @@ Questo è il tuo link per il gruppo %@! Incolla immagine No comment provided by engineer. - - Paste received link - Incolla il link ricevuto + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Incolla il link che hai ricevuto nella casella sottostante per connetterti con il tuo contatto. - placeholder - People can connect to you only via the links you share. Le persone possono connettersi a te solo tramite i link che condividi. @@ -3803,6 +3836,11 @@ Questo è il tuo link per il gruppo %@! Controlla le preferenze tue e del tuo contatto. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Contatta l'amministratore del gruppo. @@ -4008,6 +4046,10 @@ Questo è il tuo link per il gruppo %@! Maggiori informazioni nella [Guida per l'utente](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Maggiori informazioni nella [Guida per l'utente](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4218,6 +4260,10 @@ Questo è il tuo link per il gruppo %@! Errore di ripristino del database No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Rivela @@ -4373,6 +4419,10 @@ Questo è il tuo link per il gruppo %@! Cerca No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Coda sicura @@ -4648,9 +4698,8 @@ Questo è il tuo link per il gruppo %@! Condividi link No comment provided by engineer. - - Share one-time invitation link - Condividi link di invito una tantum + + Share this 1-time invite link No comment provided by engineer. @@ -4720,7 +4769,7 @@ Questo è il tuo link per il gruppo %@! SimpleX contact address - Indirizzo del contatto SimpleX + Indirizzo di contatto SimpleX simplex link type @@ -4773,16 +4822,15 @@ Questo è il tuo link per il gruppo %@! Qualcuno notification title - - Start a new chat - Inizia una nuova chat - No comment provided by engineer. - Start chat Avvia chat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Avvia la migrazione @@ -4908,6 +4956,14 @@ Questo è il tuo link per il gruppo %@! Toccare per entrare in incognito No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Tocca per iniziare una chat @@ -4970,6 +5026,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.Il tentativo di cambiare la password del database non è stato completato. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! La connessione che hai accettato verrà annullata! @@ -5035,6 +5095,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.I server per le nuove connessioni del profilo di chat attuale **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Tema @@ -5187,11 +5251,6 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio Spegni No comment provided by engineer. - - Turn off notifications? - Spegnere le notifiche? - No comment provided by engineer. - Turn on Attiva @@ -5394,6 +5453,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Usa nuovo profilo in incognito No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Usa il server @@ -5501,6 +5564,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Waiting for desktop... + In attesa del desktop... No comment provided by engineer. @@ -5655,11 +5719,6 @@ Ripetere la richiesta di ingresso? Puoi accettare chiamate dalla schermata di blocco, senza l'autenticazione del dispositivo e dell'app. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Puoi anche connetterti cliccando il link. Se si apre nel browser, clicca il pulsante **Apri nell'app mobile**. - No comment provided by engineer. - You can create it later Puoi crearlo più tardi @@ -5680,6 +5739,10 @@ Ripetere la richiesta di ingresso? Puoi nascondere o silenziare un profilo utente - scorrilo verso destra. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Ora puoi inviare messaggi a %@ @@ -5720,6 +5783,10 @@ Ripetere la richiesta di ingresso? Puoi usare il markdown per formattare i messaggi: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Non puoi inviare messaggi! @@ -5909,13 +5976,6 @@ Puoi annullare questa connessione e rimuovere il contatto (e riprovare più tard I tuoi contatti possono consentire l'eliminazione completa dei messaggi. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - I tuoi contatti in SimpleX lo vedranno. -Puoi modificarlo nelle impostazioni. - No comment provided by engineer. - Your contacts will remain connected. I tuoi contatti resteranno connessi. @@ -5995,7 +6055,7 @@ I server di SimpleX non possono vedere il tuo profilo. [Star on GitHub](https://github.com/simplex-chat/simplex-chat) - [Stella su GitHub](https://github.com/simplex-chat/simplex-chat) + [Dai una stella su GitHub](https://github.com/simplex-chat/simplex-chat) No comment provided by engineer. @@ -6050,6 +6110,7 @@ I server di SimpleX non possono vedere il tuo profilo. author + autore member role @@ -6631,7 +6692,7 @@ I server di SimpleX non possono vedere il tuo profilo. updated group profile - profilo del gruppo aggiornato + ha aggiornato il profilo del gruppo rcv group event chat item diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index 11ca09ba3b..de25ffb08f 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -103,6 +103,7 @@ %@ connected + %@ 接続中 No comment provided by engineer. @@ -214,10 +215,12 @@ %lld messages marked deleted + %lld 件のメッセージが削除されました No comment provided by engineer. %lld messages moderated by %@ + %@ により%lld 件のメッセージが検閲されました No comment provided by engineer. @@ -303,14 +306,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **新しい連絡先を追加**: 連絡先のワンタイム QR コードまたはリンクを作成します。 No comment provided by engineer. - - **Create link / QR code** for your contact to use. - 連絡先が使用する **リンク/QR コードを作成します**。 + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +329,6 @@ **最もプライベート**: SimpleX Chat 通知サーバーを使用せず、バックグラウンドで定期的にメッセージをチェックします (アプリの使用頻度によって異なります)。 No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **受信したリンク**を貼り付けるか、ブラウザーで開いて [**モバイル アプリで開く**] をタップします。 - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **注意**: パスフレーズを紛失すると、パスフレーズを復元または変更できなくなります。 @@ -338,11 +339,6 @@ **推奨**: デバイス トークンと通知は SimpleX Chat 通知サーバーに送信されますが、メッセージの内容、サイズ、送信者は送信されません。 No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **QR コードをスキャン**: 直接またはビデオ通話で連絡先に接続します。 - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **警告**: 即時の プッシュ通知には、キーチェーンに保存されたパスフレーズが必要です。 @@ -437,11 +433,6 @@ 1週間 time interval - - 1-time link - 使い捨てのリンク - No comment provided by engineer. - 5 minutes 5分 @@ -557,6 +548,10 @@ プロフィールにアドレスを追加し、連絡先があなたのアドレスを他の人と共有できるようにします。プロフィールの更新は連絡先に送信されます。 No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers 既存サーバを追加 @@ -953,6 +948,10 @@ 通話 No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! ユーザープロフィールが削除できません! @@ -1069,6 +1068,10 @@ チャットが停止してます No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences チャット設定 @@ -1205,11 +1208,6 @@ This is your own one-time link! リンク経由で接続 No comment provided by engineer. - - Connect via link / QR code - リンク・QRコード経由で接続 - No comment provided by engineer. - Connect via one-time link 使い捨てリンク経由で接続しますか? @@ -1377,11 +1375,6 @@ This is your own one-time link! [デスクトップアプリ](https://simplex.chat/downloads/)で新しいプロファイルを作成します。 💻 No comment provided by engineer. - - Create one-time invitation link - 使い捨ての招待リンクを生成する - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1406,6 +1399,10 @@ This is your own one-time link! %@ によって作成されました No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode 現在のパスコード @@ -1947,6 +1944,10 @@ This cannot be undone! 自動メッセージ削除を有効にしますか? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all すべて有効 @@ -2012,6 +2013,10 @@ This cannot be undone! 暗号化されたメッセージまたは別のイベント notification + + Encrypted message: app is stopped + notification + Encrypted message: database error 暗号化されたメッセージ : データベースエラー @@ -2236,6 +2241,10 @@ This cannot be undone! %@ サーバーのロード中にエラーが発生 No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file ファイル受信にエラー発生 @@ -2276,6 +2285,10 @@ This cannot be undone! ユーザーパスワード保存エラー No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email メールの送信にエラー発生 @@ -2744,11 +2757,6 @@ This cannot be undone! 直接会えない場合は、ビデオ通話で QR コードを表示するか、リンクを共有してください。 No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - 直接会えない場合は、**ビデオ通話で QR コードを表示する**か、リンクを共有してください。 - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! アプリを開くときにこのパスコードを入力すると、アプリのすべてのデータが元に戻せないように削除されます! @@ -2904,15 +2912,27 @@ This cannot be undone! インターフェース No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link 無効な接続リンク No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! 無効なサーバアドレス! @@ -3027,10 +3047,18 @@ This is your link for group %@! グループに参加 No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections 接続を維持 @@ -3113,6 +3141,11 @@ This is your link for group %@! ライブメッセージ No comment provided by engineer. + + Local + 自分のみ + No comment provided by engineer. + Local name ローカルネーム @@ -3351,6 +3384,10 @@ This is your link for group %@! 新しいパスコード No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request 新しい繋がりのリクエスト @@ -3474,16 +3511,15 @@ This is your link for group %@! - メンバーを無効にする (メッセージの送信不可) No comment provided by engineer. + + OK + No comment provided by engineer. + Off オフ No comment provided by engineer. - - Off (Local) - オフ(自分のみ) - No comment provided by engineer. - Ok OK @@ -3623,9 +3659,16 @@ This is your link for group %@! プロトコル技術とコードはオープンソースで、どなたでもご自分のサーバを運用できます。 No comment provided by engineer. - - Opening database… - データベースを開いています… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3668,11 +3711,6 @@ This is your link for group %@! パスワードを表示する No comment provided by engineer. - - Paste - 貼り付け - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3682,16 +3720,10 @@ This is your link for group %@! 画像の貼り付け No comment provided by engineer. - - Paste received link - 頂いたリンクを貼り付ける + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - 連絡相手から頂いたリンクを以下の入力欄に貼り付けて繋がります。 - placeholder - People can connect to you only via the links you share. あなたと繋がることができるのは、あなたからリンクを頂いた方のみです。 @@ -3727,6 +3759,11 @@ This is your link for group %@! あなたと連絡先の設定を確認してください。 No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. グループの管理者に連絡してください。 @@ -3930,6 +3967,10 @@ This is your link for group %@! 詳しくは[ユーザーガイド](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address)をご覧ください。 No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). 詳しくは[ユーザーガイド](https://simplex.chat/docs/guide/readme.html#connect-to-friends)をご覧ください。 @@ -4137,6 +4178,10 @@ This is your link for group %@! データベース復元エラー No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal 開示する @@ -4291,6 +4336,10 @@ This is your link for group %@! 検索 No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue 待ち行列セキュリティ確認 @@ -4557,9 +4606,8 @@ This is your link for group %@! リンクを送る No comment provided by engineer. - - Share one-time invitation link - 使い捨ての招待リンクを共有 + + Share this 1-time invite link No comment provided by engineer. @@ -4682,16 +4730,15 @@ This is your link for group %@! 誰か notification title - - Start a new chat - 新しいチャットを開始する - No comment provided by engineer. - Start chat チャットを開始する No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration 移行の開始 @@ -4816,6 +4863,14 @@ This is your link for group %@! タップしてシークレットモードで参加 No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat タップして新しいチャットを始める @@ -4878,6 +4933,10 @@ It can happen because of some bug or when the connection is compromised.データベースのパスフレーズ変更が完了してません。 No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! 承認済の接続がキャンセルされます! @@ -4943,6 +5002,10 @@ It can happen because of some bug or when the connection is compromised.現在のチャットプロフィールの新しい接続のサーバ **%@**。 No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme テーマ @@ -5089,11 +5152,6 @@ You will be prompted to complete authentication before this feature is enabled.< オフにする No comment provided by engineer. - - Turn off notifications? - 通知をオフにしますか? - No comment provided by engineer. - Turn on オンにする @@ -5290,6 +5348,10 @@ To connect, please ask your contact to create another connection link and check 新しいシークレットプロファイルを使用する No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server サーバを使う @@ -5539,11 +5601,6 @@ Repeat join request? デバイスやアプリの認証を行わずに、ロック画面から通話を受けることができます。 No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - リンクをクリックすることでも接続できます。ブラウザで開いた場合は、**モバイルアプリで開く**ボタンをクリックしてください。 - No comment provided by engineer. - You can create it later 後からでも作成できます @@ -5564,6 +5621,10 @@ Repeat join request? ユーザープロファイルを右にスワイプすると、非表示またはミュートにすることができます。 No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ %@ にメッセージを送信できるようになりました @@ -5604,6 +5665,10 @@ Repeat join request? メッセージの書式にmarkdownを使用することができます: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! メッセージを送信できませんでした! @@ -5788,13 +5853,6 @@ You can cancel this connection and remove the contact (and try later with a new 連絡先がメッセージの完全削除を許可できます。 No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - SimpleX の連絡先に表示されます。 -設定で変更できます。 - No comment provided by engineer. - Your contacts will remain connected. 連絡先は接続されたままになります。 diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index 094a30677a..e8aef28d41 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Nieuw contact toevoegen**: om uw eenmalige QR-code of link voor uw contact te maken. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Maak een link / QR-code aan** die uw contact kan gebruiken. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Meest privé**: gebruik geen SimpleX Chat-notificatie server, controleer berichten regelmatig op de achtergrond (afhankelijk van hoe vaak u de app gebruikt). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Plak de ontvangen link** of open deze in de browser en tik op **Openen in mobiele app**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Let op**: u kunt het wachtwoord NIET herstellen of wijzigen als u het kwijtraakt. @@ -347,11 +345,6 @@ **Aanbevolen**: apparaattoken en meldingen worden naar de SimpleX Chat-meldingsserver gestuurd, maar niet de berichtinhoud, -grootte of van wie het afkomstig is. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Scan QR-code**: om persoonlijk of via een video gesprek verbinding te maken met uw contact. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Waarschuwing**: voor directe push meldingen is een wachtwoord vereist dat is opgeslagen in de Keychain. @@ -453,11 +446,6 @@ 1 week time interval - - 1-time link - Eenmalige link - No comment provided by engineer. - 5 minutes 5 minuten @@ -573,6 +561,10 @@ Voeg een adres toe aan uw profiel, zodat uw contacten het met andere mensen kunnen delen. Profiel update wordt naar uw contacten verzonden. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Vooraf ingestelde servers toevoegen @@ -770,7 +762,7 @@ Always use relay - Verbinden via relais + Altijd relay gebruiken No comment provided by engineer. @@ -978,6 +970,10 @@ Oproepen No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Kan gebruikers profiel niet verwijderen! @@ -1094,6 +1090,10 @@ Chat is gestopt No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Gesprek voorkeuren @@ -1238,11 +1238,6 @@ Dit is uw eigen eenmalige link! Maak verbinding via link No comment provided by engineer. - - Connect via link / QR code - Maak verbinding via link / QR-code - No comment provided by engineer. - Connect via one-time link Verbinden via een eenmalige link? @@ -1418,11 +1413,6 @@ Dit is uw eigen eenmalige link! Maak een nieuw profiel aan in [desktop-app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Maak een eenmalige uitnodiging link - No comment provided by engineer. - Create profile Maak een profiel aan @@ -1448,6 +1438,10 @@ Dit is uw eigen eenmalige link! Gemaakt op %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Huidige toegangscode @@ -1618,7 +1612,7 @@ Dit is uw eigen eenmalige link! Delete and notify contact - Contact verwijderen en op de hoogte stellen + Verwijderen en contact op de hoogte stellen No comment provided by engineer. @@ -1998,6 +1992,10 @@ Dit kan niet ongedaan gemaakt worden! Automatisch verwijderen van berichten aanzetten? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Inschakelen voor iedereen @@ -2063,6 +2061,10 @@ Dit kan niet ongedaan gemaakt worden! Versleuteld bericht of een andere gebeurtenis notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Versleuteld bericht: database fout @@ -2293,6 +2295,10 @@ Dit kan niet ongedaan gemaakt worden! Fout bij het laden van %@ servers No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Fout bij ontvangen van bestand @@ -2333,6 +2339,10 @@ Dit kan niet ongedaan gemaakt worden! Fout bij opslaan gebruikers wachtwoord No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Fout bij het verzenden van e-mail @@ -2425,7 +2435,7 @@ Dit kan niet ongedaan gemaakt worden! Expand - Uitbreiden + Uitklappen chat item action @@ -2808,11 +2818,6 @@ Dit kan niet ongedaan gemaakt worden! Als je elkaar niet persoonlijk kunt ontmoeten, laat dan de QR-code zien in een videogesprek of deel de link. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Als u elkaar niet persoonlijk kunt ontmoeten, kunt u **de QR-code scannen in het video gesprek**, of uw contact kan een uitnodiging link delen. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Als u deze toegangscode invoert bij het openen van de app, worden alle app-gegevens onomkeerbaar verwijderd! @@ -2962,7 +2967,7 @@ Dit kan niet ongedaan gemaakt worden! Instantly - Meteen + Direct No comment provided by engineer. @@ -2970,16 +2975,28 @@ Dit kan niet ongedaan gemaakt worden! Interface No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Ongeldige verbinding link No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Ongeldige naam! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Ongeldig server adres! @@ -3098,11 +3115,19 @@ Dit is jouw link voor groep %@! Deel nemen aan groep No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Houd de app geopend om deze vanaf de desktop te gebruiken No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Behoud uw verbindingen @@ -3188,6 +3213,11 @@ Dit is jouw link voor groep %@! Live berichten No comment provided by engineer. + + Local + Lokaal + No comment provided by engineer. + Local name Lokale naam @@ -3428,6 +3458,10 @@ Dit is jouw link voor groep %@! Nieuwe toegangscode No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Nieuw contactverzoek @@ -3552,16 +3586,15 @@ Dit is jouw link voor groep %@! - schakel leden uit ("waarnemer" rol) No comment provided by engineer. + + OK + No comment provided by engineer. + Off Uit No comment provided by engineer. - - Off (Local) - Uit (lokaal) - No comment provided by engineer. - Ok OK @@ -3702,9 +3735,16 @@ Dit is jouw link voor groep %@! Open-source protocol en code. Iedereen kan de servers draaien. No comment provided by engineer. - - Opening database… - Database openen… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3747,11 +3787,6 @@ Dit is jouw link voor groep %@! Wachtwoord om weer te geven No comment provided by engineer. - - Paste - Plakken - No comment provided by engineer. - Paste desktop address Desktopadres plakken @@ -3762,16 +3797,10 @@ Dit is jouw link voor groep %@! Afbeelding plakken No comment provided by engineer. - - Paste received link - Plak de ontvangen link + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Plak de link die je hebt ontvangen in het vak hieronder om verbinding te maken met je contact. - placeholder - People can connect to you only via the links you share. Mensen kunnen alleen verbinding met u maken via de links die u deelt. @@ -3807,6 +3836,11 @@ Dit is jouw link voor groep %@! Controleer de uwe en uw contact voorkeuren. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Neem contact op met de groep beheerder. @@ -4012,6 +4046,10 @@ Dit is jouw link voor groep %@! Lees meer in de [Gebruikershandleiding](https://simplex.chat/docs/guide/app-settings.html#uw-simplex-contactadres). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Lees meer in de [Gebruikershandleiding](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4222,6 +4260,10 @@ Dit is jouw link voor groep %@! Database fout herstellen No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Onthullen @@ -4377,6 +4419,10 @@ Dit is jouw link voor groep %@! Zoeken No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Veilige wachtrij @@ -4652,9 +4698,8 @@ Dit is jouw link voor groep %@! Deel link No comment provided by engineer. - - Share one-time invitation link - Eenmalige uitnodiging link delen + + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4822,15 @@ Dit is jouw link voor groep %@! Iemand notification title - - Start a new chat - Begin een nieuw gesprek - No comment provided by engineer. - Start chat Begin gesprek No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Start migratie @@ -4912,6 +4956,14 @@ Dit is jouw link voor groep %@! Tik om incognito lid te worden No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Tik om een nieuw gesprek te starten @@ -4974,6 +5026,10 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. De poging om het wachtwoord van de database te wijzigen is niet voltooid. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! De door u geaccepteerde verbinding wordt geannuleerd! @@ -5039,6 +5095,10 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. De servers voor nieuwe verbindingen van uw huidige chat profiel **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Thema @@ -5191,11 +5251,6 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc Uitschakelen No comment provided by engineer. - - Turn off notifications? - Schakel meldingen uit? - No comment provided by engineer. - Turn on Zet aan @@ -5398,6 +5453,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruik een nieuw incognitoprofiel No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Gebruik server @@ -5660,11 +5719,6 @@ Deelnameverzoek herhalen? U kunt oproepen van het vergrendelingsscherm accepteren, zonder apparaat- en app-verificatie. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - U kunt ook verbinding maken door op de link te klikken. Als het in de browser wordt geopend, klikt u op de knop **Openen in mobiele app**. - No comment provided by engineer. - You can create it later U kan het later maken @@ -5685,6 +5739,10 @@ Deelnameverzoek herhalen? U kunt een gebruikers profiel verbergen of dempen - veeg het naar rechts. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Je kunt nu berichten sturen naar %@ @@ -5725,6 +5783,10 @@ Deelnameverzoek herhalen? U kunt markdown gebruiken voor opmaak in berichten: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Je kunt geen berichten versturen! @@ -5914,13 +5976,6 @@ U kunt deze verbinding verbreken en het contact verwijderen en later proberen me Uw contacten kunnen volledige verwijdering van berichten toestaan. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Uw contacten in SimpleX kunnen het zien. -U kunt dit wijzigen in Instellingen. - No comment provided by engineer. - Your contacts will remain connected. Uw contacten blijven verbonden. @@ -6667,7 +6722,7 @@ SimpleX servers kunnen uw profiel niet zien. via relay - via relais + via relay No comment provided by engineer. diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index ad1924f4c4..0cdbb8c7e1 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Dodaj nowy kontakt**: aby stworzyć swój jednorazowy kod QR lub link dla kontaktu. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Utwórz link / kod QR**, aby Twój kontakt mógł z niego skorzystać. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Najbardziej prywatny**: nie korzystaj z serwera powiadomień SimpleX Chat, sprawdzaj wiadomości okresowo w tle (zależy jak często korzystasz z aplikacji). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Wklej otrzymany link** lub otwórz go w przeglądarce i dotknij **Otwórz w aplikacji mobilnej**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Uwaga**: NIE będziesz w stanie odzyskać lub zmienić hasła, jeśli je stracisz. @@ -347,11 +345,6 @@ **Zalecane**: token urządzenia i powiadomienia są wysyłane do serwera powiadomień SimpleX Chat, ale nie treść wiadomości, rozmiar lub od kogo jest. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Skanuj kod QR**: aby połączyć się z kontaktem osobiście lub za pomocą połączenia wideo. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Uwaga**: Natychmiastowe powiadomienia push wymagają hasła zapisanego w Keychain. @@ -453,11 +446,6 @@ 1 tydzień time interval - - 1-time link - 1-razowy link - No comment provided by engineer. - 5 minutes 5 minut @@ -573,6 +561,10 @@ Dodaj adres do swojego profilu, aby Twoje kontakty mogły go udostępnić innym osobom. Aktualizacja profilu zostanie wysłana do Twoich kontaktów. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Dodaj gotowe serwery @@ -978,6 +970,10 @@ Połączenia No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Nie można usunąć profilu użytkownika! @@ -1094,6 +1090,10 @@ Czat jest zatrzymany No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Preferencje czatu @@ -1238,11 +1238,6 @@ To jest twój jednorazowy link! Połącz się przez link No comment provided by engineer. - - Connect via link / QR code - Połącz się przez link / kod QR - No comment provided by engineer. - Connect via one-time link Połącz przez jednorazowy link @@ -1418,11 +1413,6 @@ To jest twój jednorazowy link! Utwórz nowy profil w [aplikacji desktopowej](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Utwórz jednorazowy link do zaproszenia - No comment provided by engineer. - Create profile Utwórz profil @@ -1448,6 +1438,10 @@ To jest twój jednorazowy link! Utworzony w dniu %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Aktualny Pin @@ -1998,6 +1992,10 @@ To nie może być cofnięte! Czy włączyć automatyczne usuwanie wiadomości? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Włącz dla wszystkich @@ -2063,6 +2061,10 @@ To nie może być cofnięte! Zaszyfrowana wiadomość lub inne zdarzenie notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Zaszyfrowana wiadomość: błąd bazy danych @@ -2293,6 +2295,10 @@ To nie może być cofnięte! Błąd ładowania %@ serwerów No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Błąd odbioru pliku @@ -2333,6 +2339,10 @@ To nie może być cofnięte! Błąd zapisu hasła użytkownika No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Błąd wysyłania e-mail @@ -2808,11 +2818,6 @@ To nie może być cofnięte! Jeśli nie możesz spotkać się osobiście, pokaż kod QR w rozmowie wideo lub udostępnij link. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Jeśli nie możesz spotkać się osobiście, możesz **zeskanować kod QR w rozmowie wideo** lub Twój kontakt może udostępnić link z zaproszeniem. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Jeśli wprowadzisz ten pin podczas otwierania aplikacji, wszystkie dane aplikacji zostaną nieodwracalnie usunięte! @@ -2970,16 +2975,28 @@ To nie może być cofnięte! Interfejs No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Nieprawidłowy link połączenia No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Nieprawidłowa nazwa! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Nieprawidłowy adres serwera! @@ -3098,11 +3115,19 @@ To jest twój link do grupy %@! Dołączanie do grupy No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Zostaw aplikację otwartą i używaj ją z komputera No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Zachowaj swoje połączenia @@ -3188,6 +3213,11 @@ To jest twój link do grupy %@! Wiadomości na żywo No comment provided by engineer. + + Local + Lokalnie + No comment provided by engineer. + Local name Nazwa lokalna @@ -3428,6 +3458,10 @@ To jest twój link do grupy %@! Nowy Pin No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Nowa prośba o kontakt @@ -3552,16 +3586,15 @@ To jest twój link do grupy %@! - wyłączyć członków (rola "obserwatora") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Wyłączony No comment provided by engineer. - - Off (Local) - Wyłączony (Lokalnie) - No comment provided by engineer. - Ok Ok @@ -3702,9 +3735,16 @@ To jest twój link do grupy %@! Otwarto źródłowy protokół i kod - każdy może uruchomić serwery. No comment provided by engineer. - - Opening database… - Otwieranie bazy danych… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3747,11 +3787,6 @@ To jest twój link do grupy %@! Hasło do wyświetlenia No comment provided by engineer. - - Paste - Wklej - No comment provided by engineer. - Paste desktop address Wklej adres komputera @@ -3762,16 +3797,10 @@ To jest twój link do grupy %@! Wklej obraz No comment provided by engineer. - - Paste received link - Wklej otrzymany link + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Wklej otrzymany link w pole poniżej, aby połączyć się z kontaktem. - placeholder - People can connect to you only via the links you share. Ludzie mogą się z Tobą połączyć tylko poprzez linki, które udostępniasz. @@ -3807,6 +3836,11 @@ To jest twój link do grupy %@! Proszę sprawdzić preferencje Twoje i Twojego kontaktu. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Skontaktuj się z administratorem grupy. @@ -4012,6 +4046,10 @@ To jest twój link do grupy %@! Przeczytaj więcej w [Podręczniku Użytkownika](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Przeczytaj więcej w [Podręczniku Użytkownika](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4222,6 +4260,10 @@ To jest twój link do grupy %@! Błąd przywracania bazy danych No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Ujawnij @@ -4377,6 +4419,10 @@ To jest twój link do grupy %@! Szukaj No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Bezpieczna kolejka @@ -4652,9 +4698,8 @@ To jest twój link do grupy %@! Udostępnij link No comment provided by engineer. - - Share one-time invitation link - Jednorazowy link zaproszenia + + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4822,15 @@ To jest twój link do grupy %@! Ktoś notification title - - Start a new chat - Rozpocznij nowy czat - No comment provided by engineer. - Start chat Rozpocznij czat No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Rozpocznij migrację @@ -4912,6 +4956,14 @@ To jest twój link do grupy %@! Dotnij, aby dołączyć w trybie incognito No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Dotknij, aby rozpocząć nowy czat @@ -4974,6 +5026,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom Próba zmiany hasła bazy danych nie została zakończona. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Zaakceptowane przez Ciebie połączenie zostanie anulowane! @@ -5039,6 +5095,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom Serwery dla nowych połączeń bieżącego profilu czatu **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Motyw @@ -5191,11 +5251,6 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.Wyłącz No comment provided by engineer. - - Turn off notifications? - Wyłączyć powiadomienia? - No comment provided by engineer. - Turn on Włącz @@ -5398,6 +5453,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Użyj nowego profilu incognito No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Użyj serwera @@ -5660,11 +5719,6 @@ Powtórzyć prośbę dołączenia? Możesz przyjmować połączenia z ekranu blokady, bez uwierzytelniania urządzenia i aplikacji. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Możesz też połączyć się klikając w link. Jeśli otworzy się on w przeglądarce, kliknij przycisk **Otwórz w aplikacji mobilnej**. - No comment provided by engineer. - You can create it later Możesz go utworzyć później @@ -5685,6 +5739,10 @@ Powtórzyć prośbę dołączenia? Możesz ukryć lub wyciszyć profil użytkownika - przesuń palcem w prawo. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Możesz teraz wysyłać wiadomości do %@ @@ -5725,6 +5783,10 @@ Powtórzyć prośbę dołączenia? Możesz używać markdown do formatowania wiadomości: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Nie możesz wysyłać wiadomości! @@ -5914,13 +5976,6 @@ Możesz anulować to połączenie i usunąć kontakt (i spróbować później z Twoje kontakty mogą zezwolić na pełne usunięcie wiadomości. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Twoje kontakty w SimpleX będą to widzieć. -Możesz to zmienić w Ustawieniach. - No comment provided by engineer. - Your contacts will remain connected. Twoje kontakty pozostaną połączone. diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index f4970446ae..2129456374 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -312,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Добавить новый контакт**: чтобы создать одноразовый QR код или ссылку для Вашего контакта. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Создать ссылку / QR код** для Вашего контакта. + + **Create group**: to create a new group. No comment provided by engineer. @@ -332,11 +335,6 @@ **Самый конфиденциальный**: не использовать сервер уведомлений SimpleX Chat, проверять сообщения периодически в фоновом режиме (зависит от того насколько часто Вы используете приложение). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Вставить полученную ссылку**, или откройте её в браузере и нажмите **Open in mobile app**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Внимание**: Вы не сможете восстановить или поменять пароль, если Вы его потеряете. @@ -347,11 +345,6 @@ **Рекомендовано**: токен устройства и уведомления отправляются на сервер SimpleX Chat, но сервер не получает сами сообщения, их размер или от кого они. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Сканировать QR код**: соединиться с Вашим контактом при встрече или во время видеозвонка. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Внимание**: для работы мгновенных уведомлений пароль должен быть сохранен в Keychain. @@ -453,11 +446,6 @@ 1 неделю time interval - - 1-time link - Одноразовая ссылка - No comment provided by engineer. - 5 minutes 5 минут @@ -573,6 +561,10 @@ Добавьте адрес в свой профиль, чтобы Ваши контакты могли поделиться им. Профиль будет отправлен Вашим контактам. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Добавить серверы по умолчанию @@ -978,6 +970,10 @@ Звонки No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Нельзя удалить профиль пользователя! @@ -1094,6 +1090,10 @@ Чат остановлен No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Предпочтения @@ -1238,11 +1238,6 @@ This is your own one-time link! Соединиться через ссылку No comment provided by engineer. - - Connect via link / QR code - Соединиться через ссылку / QR код - No comment provided by engineer. - Connect via one-time link Соединиться через одноразовую ссылку @@ -1418,11 +1413,6 @@ This is your own one-time link! Создайте новый профиль в [приложении для компьютера](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Создать ссылку-приглашение - No comment provided by engineer. - Create profile Создать профиль @@ -1448,6 +1438,10 @@ This is your own one-time link! Дата создания %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Текущий Код @@ -1998,6 +1992,10 @@ This cannot be undone! Включить автоматическое удаление сообщений? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Включить для всех @@ -2063,6 +2061,10 @@ This cannot be undone! Зашифрованное сообщение или событие чата notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Зашифрованное сообщение: ошибка базы данных @@ -2293,6 +2295,10 @@ This cannot be undone! Ошибка загрузки %@ серверов No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Ошибка при получении файла @@ -2333,6 +2339,10 @@ This cannot be undone! Ошибка при сохранении пароля пользователя No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Ошибка отправки email @@ -2808,11 +2818,6 @@ This cannot be undone! Если Вы не можете встретиться лично, покажите QR-код во время видеозвонка или поделитесь ссылкой. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Если Вы не можете встретиться лично, Вы можете **сосканировать QR код во время видеозвонка**, или Ваш контакт может отправить Вам ссылку. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Если Вы введете этот код при открытии приложения, все данные приложения будут безвозвратно удалены! @@ -2970,16 +2975,28 @@ This cannot be undone! Интерфейс No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Ошибка в ссылке контакта No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! Неверное имя! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Ошибка в адресе сервера! @@ -3098,11 +3115,19 @@ This is your link for group %@! Вступление в группу No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop Оставьте приложение открытым, чтобы использовать его с компьютера No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Сохраните Ваши соединения @@ -3188,6 +3213,11 @@ This is your link for group %@! "Живые" сообщения No comment provided by engineer. + + Local + Локальные + No comment provided by engineer. + Local name Локальное имя @@ -3428,6 +3458,10 @@ This is your link for group %@! Новый Код No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Новый запрос на соединение @@ -3552,16 +3586,15 @@ This is your link for group %@! - приостанавливать членов (роль "наблюдатель") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Выключено No comment provided by engineer. - - Off (Local) - Выключить (Локальные) - No comment provided by engineer. - Ok Ок @@ -3702,9 +3735,16 @@ This is your link for group %@! Открытый протокол и код - кто угодно может запустить сервер. No comment provided by engineer. - - Opening database… - Открытие базы данных… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3747,11 +3787,6 @@ This is your link for group %@! Пароль чтобы раскрыть No comment provided by engineer. - - Paste - Вставить - No comment provided by engineer. - Paste desktop address Вставить адрес компьютера @@ -3762,16 +3797,10 @@ This is your link for group %@! Вставить изображение No comment provided by engineer. - - Paste received link - Вставить полученную ссылку + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Чтобы соединиться, вставьте ссылку, полученную от Вашего контакта. - placeholder - People can connect to you only via the links you share. С Вами можно соединиться только через созданные Вами ссылки. @@ -3807,6 +3836,11 @@ This is your link for group %@! Проверьте предпочтения Вашего контакта. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Пожалуйста, свяжитесь с админом группы. @@ -4012,6 +4046,10 @@ This is your link for group %@! Узнать больше в [Руководстве пользователя](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Узнать больше в [Руководстве пользователя](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4222,6 +4260,10 @@ This is your link for group %@! Ошибка при восстановлении базы данных No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Показать @@ -4377,6 +4419,10 @@ This is your link for group %@! Поиск No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Защита очереди @@ -4652,9 +4698,8 @@ This is your link for group %@! Поделиться ссылкой No comment provided by engineer. - - Share one-time invitation link - Поделиться ссылкой-приглашением + + Share this 1-time invite link No comment provided by engineer. @@ -4777,16 +4822,15 @@ This is your link for group %@! Контакт notification title - - Start a new chat - Начать новый разговор - No comment provided by engineer. - Start chat Запустить чат No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Запустить перемещение данных @@ -4912,6 +4956,14 @@ This is your link for group %@! Нажмите, чтобы вступить инкогнито No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Нажмите, чтобы начать чат @@ -4974,6 +5026,10 @@ It can happen because of some bug or when the connection is compromised.Попытка поменять пароль базы данных не была завершена. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Подтвержденное соединение будет отменено! @@ -5039,6 +5095,10 @@ It can happen because of some bug or when the connection is compromised.Серверы для новых соединений Вашего текущего профиля чата **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Тема @@ -5191,11 +5251,6 @@ You will be prompted to complete authentication before this feature is enabled.< Выключить No comment provided by engineer. - - Turn off notifications? - Выключить уведомления? - No comment provided by engineer. - Turn on Включить @@ -5398,6 +5453,10 @@ To connect, please ask your contact to create another connection link and check Использовать новый Инкогнито профиль No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Использовать сервер @@ -5660,11 +5719,6 @@ Repeat join request? Вы можете принимать звонки на экране блокировки, без аутентификации. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Вы также можете соединиться, открыв ссылку. Если ссылка откроется в браузере, нажмите кнопку **Open in mobile app**. - No comment provided by engineer. - You can create it later Вы можете создать его позже @@ -5685,6 +5739,10 @@ Repeat join request? Вы можете скрыть профиль или выключить уведомления - потяните его вправо. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Вы теперь можете отправлять сообщения %@ @@ -5725,6 +5783,10 @@ Repeat join request? Вы можете форматировать сообщения: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Вы не можете отправлять сообщения! @@ -5914,13 +5976,6 @@ You can cancel this connection and remove the contact (and try later with a new Ваши контакты могут разрешить окончательное удаление сообщений. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Ваши контакты в SimpleX получат этот адрес. -Вы можете изменить это в Настройках. - No comment provided by engineer. - Your contacts will remain connected. Ваши контакты сохранятся. diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index bcb39e6e03..b4520553c5 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -297,14 +297,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **เพิ่มผู้ติดต่อใหม่**: เพื่อสร้างคิวอาร์โค้ดแบบใช้ครั้งเดียวหรือลิงก์สำหรับผู้ติดต่อของคุณ No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **สร้างลิงค์ / คิวอาร์โค้ด** เพื่อให้ผู้ติดต่อของคุณใช้ + + **Create group**: to create a new group. No comment provided by engineer. @@ -317,11 +320,6 @@ **ส่วนตัวที่สุด**: ไม่ใช้เซิร์ฟเวอร์การแจ้งเตือนของ SimpleX Chat ตรวจสอบข้อความเป็นระยะในพื้นหลัง (ขึ้นอยู่กับความถี่ที่คุณใช้แอป) No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **แปะลิงก์ที่ได้รับ** หรือเปิดในเบราว์เซอร์แล้วแตะ **เปิดในแอปมือถือ** - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **โปรดทราบ**: คุณจะไม่สามารถกู้คืนหรือเปลี่ยนรหัสผ่านได้หากคุณทำรหัสผ่านหาย @@ -332,11 +330,6 @@ **แนะนำ**: โทเค็นอุปกรณ์และการแจ้งเตือนจะถูกส่งไปยังเซิร์ฟเวอร์การแจ้งเตือนของ SimpleX Chat แต่ไม่ใช่เนื้อหาข้อความ ขนาด หรือผู้ที่ส่ง No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **สแกนคิวอาร์โค้ด**: เพื่อเชื่อมต่อกับผู้ติดต่อของคุณด้วยตนเองหรือผ่านการสนทนาทางวิดีโอ - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **คำเตือน**: การแจ้งเตือนแบบพุชทันทีจำเป็นต้องบันทึกรหัสผ่านไว้ใน Keychain @@ -431,11 +424,6 @@ 1 สัปดาห์ time interval - - 1-time link - ลิงก์สำหรับใช้ 1 ครั้ง - No comment provided by engineer. - 5 minutes 5 นาที @@ -549,6 +537,10 @@ เพิ่มที่อยู่ลงในโปรไฟล์ของคุณ เพื่อให้ผู้ติดต่อของคุณสามารถแชร์กับผู้อื่นได้ การอัปเดตโปรไฟล์จะถูกส่งไปยังผู้ติดต่อของคุณ No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers เพิ่มเซิร์ฟเวอร์ที่ตั้งไว้ล่วงหน้า @@ -943,6 +935,10 @@ โทร No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! ไม่สามารถลบโปรไฟล์ผู้ใช้ได้! @@ -1059,6 +1055,10 @@ การแชทหยุดทํางานแล้ว No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences ค่ากําหนดในการแชท @@ -1194,11 +1194,6 @@ This is your own one-time link! เชื่อมต่อผ่านลิงก์ No comment provided by engineer. - - Connect via link / QR code - เชื่อมต่อผ่านลิงค์ / คิวอาร์โค้ด - No comment provided by engineer. - Connect via one-time link No comment provided by engineer. @@ -1364,11 +1359,6 @@ This is your own one-time link! Create new profile in [desktop app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - สร้างลิงก์เชิญแบบใช้ครั้งเดียว - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1393,6 +1383,10 @@ This is your own one-time link! สร้างเมื่อ %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode รหัสผ่านปัจจุบัน @@ -1932,6 +1926,10 @@ This cannot be undone! เปิดใช้งานการลบข้อความอัตโนมัติ? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all เปิดใช้งานสําหรับทุกคน @@ -1995,6 +1993,10 @@ This cannot be undone! ข้อความที่ encrypt หรือเหตุการณ์อื่น notification + + Encrypted message: app is stopped + notification + Encrypted message: database error ข้อความที่ encrypt: ความผิดพลาดในฐานข้อมูล @@ -2218,6 +2220,10 @@ This cannot be undone! โหลดเซิร์ฟเวอร์ %@ ผิดพลาด No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file เกิดข้อผิดพลาดในการรับไฟล์ @@ -2258,6 +2264,10 @@ This cannot be undone! เกิดข้อผิดพลาดในการบันทึกรหัสผ่านผู้ใช้ No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email เกิดข้อผิดพลาดในการส่งอีเมล @@ -2726,11 +2736,6 @@ This cannot be undone! หากคุณไม่สามารถพบกันในชีวิตจริงได้ ให้แสดงคิวอาร์โค้ดในวิดีโอคอล หรือแชร์ลิงก์ No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - หากคุณไม่สามารถพบปะด้วยตนเอง คุณสามารถ **สแกนคิวอาร์โค้ดผ่านการสนทนาทางวิดีโอ** หรือผู้ติดต่อของคุณสามารถแชร์ลิงก์เชิญได้ - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! หากคุณใส่รหัสผ่านนี้เมื่อเปิดแอป ข้อมูลแอปทั้งหมดจะถูกลบอย่างถาวร! @@ -2885,15 +2890,27 @@ This cannot be undone! อินเตอร์เฟซ No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link ลิงค์เชื่อมต่อไม่ถูกต้อง No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! ที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง! @@ -3007,10 +3024,18 @@ This is your link for group %@! กำลังจะเข้าร่วมกลุ่ม No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections รักษาการเชื่อมต่อของคุณ @@ -3093,6 +3118,11 @@ This is your link for group %@! ข้อความสด No comment provided by engineer. + + Local + ในเครื่อง + No comment provided by engineer. + Local name ชื่อภายในเครื่องเท่านั้น @@ -3331,6 +3361,10 @@ This is your link for group %@! รหัสผ่านใหม่ No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request คำขอติดต่อใหม่ @@ -3452,16 +3486,15 @@ This is your link for group %@! - ปิดการใช้งานสมาชิก (บทบาท "ผู้สังเกตการณ์") No comment provided by engineer. + + OK + No comment provided by engineer. + Off ปิด No comment provided by engineer. - - Off (Local) - ปิด (ในเครื่อง) - No comment provided by engineer. - Ok ตกลง @@ -3600,9 +3633,16 @@ This is your link for group %@! โปรโตคอลและโค้ดโอเพ่นซอร์ส – ใคร ๆ ก็สามารถเปิดใช้เซิร์ฟเวอร์ได้ No comment provided by engineer. - - Opening database… - กำลังเปิดฐานข้อมูล… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3645,11 +3685,6 @@ This is your link for group %@! รหัสผ่านที่จะแสดง No comment provided by engineer. - - Paste - แปะ - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3659,15 +3694,10 @@ This is your link for group %@! แปะภาพ No comment provided by engineer. - - Paste received link - แปะลิงก์ที่ได้รับ + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - placeholder - People can connect to you only via the links you share. ผู้คนสามารถเชื่อมต่อกับคุณผ่านลิงก์ที่คุณแบ่งปันเท่านั้น @@ -3703,6 +3733,11 @@ This is your link for group %@! โปรดตรวจสอบความต้องการของคุณและการตั้งค่าผู้ติดต่อ No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. โปรดติดต่อผู้ดูแลกลุ่ม @@ -3906,6 +3941,10 @@ This is your link for group %@! อ่านเพิ่มเติมใน[คู่มือผู้ใช้](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address) No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). อ่านเพิ่มเติมใน[คู่มือผู้ใช้](https://simplex.chat/docs/guide/readme.html#connect-to-friends) @@ -4112,6 +4151,10 @@ This is your link for group %@! กู้คืนข้อผิดพลาดของฐานข้อมูล No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal เปิดเผย @@ -4266,6 +4309,10 @@ This is your link for group %@! ค้นหา No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue คิวที่ปลอดภัย @@ -4537,9 +4584,8 @@ This is your link for group %@! แชร์ลิงก์ No comment provided by engineer. - - Share one-time invitation link - แชร์ลิงก์เชิญแบบใช้ครั้งเดียว + + Share this 1-time invite link No comment provided by engineer. @@ -4659,16 +4705,15 @@ This is your link for group %@! ใครบางคน notification title - - Start a new chat - เริ่มแชทใหม่ - No comment provided by engineer. - Start chat เริ่มแชท No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration เริ่มการย้ายข้อมูล @@ -4793,6 +4838,14 @@ This is your link for group %@! แตะเพื่อเข้าร่วมโหมดไม่ระบุตัวตน No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat แตะเพื่อเริ่มแชทใหม่ @@ -4856,6 +4909,10 @@ It can happen because of some bug or when the connection is compromised.ความพยายามในการเปลี่ยนรหัสผ่านของฐานข้อมูลไม่เสร็จสมบูรณ์ No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! การเชื่อมต่อที่คุณยอมรับจะถูกยกเลิก! @@ -4921,6 +4978,10 @@ It can happen because of some bug or when the connection is compromised.เซิร์ฟเวอร์สำหรับการเชื่อมต่อใหม่ของโปรไฟล์การแชทปัจจุบันของคุณ **%@** No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme ธีม @@ -5066,11 +5127,6 @@ You will be prompted to complete authentication before this feature is enabled.< ปิด No comment provided by engineer. - - Turn off notifications? - ปิดการแจ้งเตือนไหม? - No comment provided by engineer. - Turn on เปิด @@ -5265,6 +5321,10 @@ To connect, please ask your contact to create another connection link and check Use new incognito profile No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server ใช้เซิร์ฟเวอร์ @@ -5514,11 +5574,6 @@ Repeat join request? คุณสามารถรับสายจากหน้าจอล็อกโดยไม่ต้องมีการตรวจสอบสิทธิ์อุปกรณ์และแอป No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - คุณสามารถเชื่อมต่อได้โดยคลิกที่ลิงค์ หากเปิดในเบราว์เซอร์ ให้คลิกปุ่ม **เปิดในแอปมือถือ** - No comment provided by engineer. - You can create it later คุณสามารถสร้างได้ในภายหลัง @@ -5539,6 +5594,10 @@ Repeat join request? คุณสามารถซ่อนหรือปิดเสียงโปรไฟล์ผู้ใช้ - ปัดไปทางขวา No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ ตอนนี้คุณสามารถส่งข้อความถึง %@ @@ -5579,6 +5638,10 @@ Repeat join request? คุณสามารถใช้มาร์กดาวน์เพื่อจัดรูปแบบข้อความ: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! คุณไม่สามารถส่งข้อความได้! @@ -5762,13 +5825,6 @@ You can cancel this connection and remove the contact (and try later with a new ผู้ติดต่อของคุณสามารถอนุญาตให้ลบข้อความทั้งหมดได้ No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - ผู้ติดต่อของคุณใน SimpleX จะเห็น -คุณสามารถเปลี่ยนได้ในการตั้งค่า - No comment provided by engineer. - Your contacts will remain connected. ผู้ติดต่อของคุณจะยังคงเชื่อมต่ออยู่ diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index 4b2ad1548a..9f2e489bf3 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -5,25 +5,31 @@ - + + + No comment provided by engineer. - + + No comment provided by engineer. - + + No comment provided by engineer. - + + No comment provided by engineer. - + ( + ( No comment provided by engineer. @@ -343,8 +349,9 @@ 30 saniye No comment provided by engineer. - + : + : No comment provided by engineer. @@ -390,8 +397,9 @@ Abort changing address? No comment provided by engineer. - + About SimpleX + SimpleX Hakkında No comment provided by engineer. @@ -406,8 +414,9 @@ Accent color No comment provided by engineer. - + Accept + Kabul et accept contact request via notification accept incoming call via notification @@ -435,48 +444,57 @@ Add profile No comment provided by engineer. - + Add servers by scanning QR codes. + Karekod taratarak sunucuları ekleyin. No comment provided by engineer. - + Add server… + Sunucu ekle… No comment provided by engineer. Add to another device No comment provided by engineer. - + Add welcome message + Karşılama mesajı ekleyin No comment provided by engineer. - + Address + Adres No comment provided by engineer. - + Address change will be aborted. Old receiving address will be used. + Adres değişikliği iptal edilecek. Eski alıcı adresi kullanılacaktır. No comment provided by engineer. Admins can create the links to join groups. No comment provided by engineer. - + Advanced network settings + GGelişmiş ağ ayarları No comment provided by engineer. - + All app data is deleted. + Tüm uygulama verileri silinir. No comment provided by engineer. - + All chats and messages will be deleted - this cannot be undone! + Tüm konuşmalar ve mesajlar silinecektir. Bu, geri alınamaz! No comment provided by engineer. - + All data is erased when it is entered. + Kullanıldığında bütün veriler silinir. No comment provided by engineer. @@ -484,24 +502,29 @@ Tüm grup üyeleri bağlı kalacaktır. No comment provided by engineer. - + All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you. + Tüm mesajlar silinecektir. Bu, geri alınamaz! Mesajlar, YALNIZCA senin için silinecektir. No comment provided by engineer. - + All your contacts will remain connected. + Konuştuğun kişilerin tümü bağlı kalacaktır. No comment provided by engineer. - + All your contacts will remain connected. Profile update will be sent to your contacts. + Tüm kişileriniz bağlı kalacaktır. Profil güncellemesi kişilerinize gönderilecektir. No comment provided by engineer. - + Allow + İzin ver No comment provided by engineer. - + Allow calls only if your contact allows them. + Yalnızca irtibat kişiniz izin veriyorsa aramalara izin verin. No comment provided by engineer. @@ -512,8 +535,9 @@ Allow irreversible message deletion only if your contact allows it to you. No comment provided by engineer. - + Allow message reactions only if your contact allows them. + Yalnızca kişin mesaj tepkilerine izin veriyorsa sen de ver. No comment provided by engineer. @@ -525,32 +549,39 @@ Üyelere direkt mesaj göndermeye izin ver. No comment provided by engineer. - + Allow sending disappearing messages. + Kendiliğinden yok olan mesajlar göndermeye izin ver. No comment provided by engineer. - + Allow to irreversibly delete sent messages. + Gönderilen mesajların kalıcı olarak silinmesine izin ver. No comment provided by engineer. - + Allow to send files and media. + Dosya ve medya göndermeye izin ver. No comment provided by engineer. - + Allow to send voice messages. + Sesli mesaj göndermeye izin ver. No comment provided by engineer. - + Allow voice messages only if your contact allows them. + Yalnızca kişiniz sesli mesaj göndermeye izin veriyorsa sen de ver. No comment provided by engineer. - + Allow voice messages? + Sesli mesajlara izin ver? No comment provided by engineer. - + Allow your contacts adding message reactions. + Konuştuğun kişilerin mesajlarına tepki eklemesine izin ver. No comment provided by engineer. @@ -577,24 +608,28 @@ Always use relay No comment provided by engineer. - + An empty chat profile with the provided name is created, and the app opens as usual. + Verilen adla boş bir sohbet profili oluşturulur ve uygulama her zamanki gibi açılır. No comment provided by engineer. - + Answer call + Aramayı cevapla No comment provided by engineer. App build: %@ No comment provided by engineer. - + App icon + Uygulama simgesi No comment provided by engineer. - + App passcode + Uygulama erişim kodu No comment provided by engineer. @@ -4893,6 +4928,41 @@ SimpleX servers cannot see your profile. \~strike~ No comment provided by engineer. + + Accept connection request? + Bağlantı isteğini kabul et? + No comment provided by engineer. + + + # %@ + # %@ + copied message info title, # <title> + + + Already connecting! + Zaten bağlanılıyor! + No comment provided by engineer. + + + A few more things + Birkaç şey daha + No comment provided by engineer. + + + ## History + ## Geçmiş + copied message info + + + A new random profile will be shared. + Yeni bir rastgele profil paylaşılacak. + No comment provided by engineer. + + + Already joining the group! + Zaten gruba bağlanılıyor! + No comment provided by engineer. + diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index abd58231a9..2d219440f7 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -89,6 +89,7 @@ %@ and %@ + %@ та %@ No comment provided by engineer. @@ -103,6 +104,7 @@ %@ connected + %@ підключено No comment provided by engineer. @@ -132,6 +134,7 @@ %@, %@ and %lld members + %@, %@ та %lld учасників No comment provided by engineer. @@ -201,6 +204,7 @@ %lld group events + %lld групові заходи No comment provided by engineer. @@ -210,14 +214,17 @@ %lld messages blocked + %lld повідомлень заблоковано No comment provided by engineer. %lld messages marked deleted + %lld повідомлень позначено як видалені No comment provided by engineer. %lld messages moderated by %@ + %lld повідомлень модерує %@ No comment provided by engineer. @@ -227,6 +234,7 @@ %lld new interface languages + %lld нові мови інтерфейсу No comment provided by engineer. @@ -291,10 +299,12 @@ (new) + (новий) No comment provided by engineer. (this device v%@) + (цей пристрій v%@) No comment provided by engineer. @@ -302,14 +312,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **Додати новий контакт**: щоб створити одноразовий QR-код або посилання для свого контакту. No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **Створіть посилання / QR-код** для використання вашим контактом. + + **Create group**: to create a new group. No comment provided by engineer. @@ -322,11 +335,6 @@ **Найбільш приватний**: не використовуйте сервер сповіщень SimpleX Chat, періодично перевіряйте повідомлення у фоновому режимі (залежить від того, як часто ви користуєтесь додатком). No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **Вставте отримане посилання** або відкрийте його в браузері і натисніть **Відкрити в мобільному додатку**. - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **Зверніть увагу: ви НЕ зможете відновити або змінити пароль, якщо втратите його. @@ -337,11 +345,6 @@ **Рекомендується**: токен пристрою та сповіщення надсилаються на сервер сповіщень SimpleX Chat, але не вміст повідомлення, його розмір або від кого воно надійшло. No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **Відскануйте QR-код**: щоб з'єднатися з вашим контактом особисто або за допомогою відеодзвінка. - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **Попередження**: Для отримання миттєвих пуш-сповіщень потрібна парольна фраза, збережена у брелоку. @@ -371,6 +374,9 @@ - connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)! - delivery receipts (up to 20 members). - faster and more stable. + - підключитися до [сервера каталогів](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex. im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id. цибуля) (БЕТА)! +- підтвердження доставлення (до 20 учасників). +- швидше і стабільніше. No comment provided by engineer. @@ -386,6 +392,9 @@ - optionally notify deleted contacts. - profile names with spaces. - and more! + - опція сповіщати про видалені контакти. +- імена профілів з пробілами. +- та багато іншого! No comment provided by engineer. @@ -404,6 +413,7 @@ 0 sec + 0 сек time to disappear @@ -436,11 +446,6 @@ 1 тиждень time interval - - 1-time link - 1-разове посилання - No comment provided by engineer. - 5 minutes 5 хвилин @@ -556,6 +561,10 @@ Додайте адресу до свого профілю, щоб ваші контакти могли поділитися нею з іншими людьми. Повідомлення про оновлення профілю буде надіслано вашим контактам. No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers Додавання попередньо встановлених серверів @@ -633,6 +642,7 @@ All new messages from %@ will be hidden! + Всі нові повідомлення від %@ будуть приховані! No comment provided by engineer. @@ -742,10 +752,12 @@ Already connecting! + Вже підключаємось! No comment provided by engineer. Already joining the group! + Вже приєднуємося до групи! No comment provided by engineer. @@ -770,6 +782,7 @@ App encrypts new local files (except videos). + Додаток шифрує нові локальні файли (крім відео). No comment provided by engineer. @@ -869,6 +882,7 @@ Bad desktop address + Неправильна адреса робочого столу No comment provided by engineer. @@ -883,6 +897,7 @@ Better groups + Кращі групи No comment provided by engineer. @@ -892,18 +907,22 @@ Block + Блокувати No comment provided by engineer. Block group members + Учасники групи блокування No comment provided by engineer. Block member + Заблокувати користувача No comment provided by engineer. Block member? + Заблокувати користувача? No comment provided by engineer. @@ -933,6 +952,7 @@ Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! + Болгарською, фінською, тайською та українською мовами - завдяки користувачам та [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! No comment provided by engineer. @@ -950,6 +970,10 @@ Дзвінки No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! Не можу видалити профіль користувача! @@ -1066,6 +1090,10 @@ Чат зупинено No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences Налаштування чату @@ -1168,6 +1196,7 @@ Connect automatically + Підключення автоматично No comment provided by engineer. @@ -1177,24 +1206,31 @@ Connect to desktop + Підключення до комп'ютера No comment provided by engineer. Connect to yourself? + З'єднатися з самим собою? No comment provided by engineer. Connect to yourself? This is your own SimpleX address! + З'єднатися з самим собою? +Це ваша власна SimpleX-адреса! No comment provided by engineer. Connect to yourself? This is your own one-time link! + Підключитися до себе? +Це ваше власне одноразове посилання! No comment provided by engineer. Connect via contact address + Підключіться за контактною адресою No comment provided by engineer. @@ -1202,11 +1238,6 @@ This is your own one-time link! Підключіться за посиланням No comment provided by engineer. - - Connect via link / QR code - Підключитися за посиланням / QR-кодом - No comment provided by engineer. - Connect via one-time link Під'єднатися за одноразовим посиланням @@ -1214,10 +1245,12 @@ This is your own one-time link! Connect with %@ + Підключитися до %@ No comment provided by engineer. Connected desktop + Підключений робочий стіл No comment provided by engineer. @@ -1373,11 +1406,6 @@ This is your own one-time link! Create new profile in [desktop app](https://simplex.chat/downloads/). 💻 No comment provided by engineer. - - Create one-time invitation link - Створіть одноразове посилання-запрошення - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1402,6 +1430,10 @@ This is your own one-time link! Створено %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode Поточний пароль @@ -1942,6 +1974,10 @@ This cannot be undone! Увімкнути автоматичне видалення повідомлень? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all Увімкнути для всіх @@ -2005,6 +2041,10 @@ This cannot be undone! Зашифроване повідомлення або інша подія notification + + Encrypted message: app is stopped + notification + Encrypted message: database error Зашифроване повідомлення: помилка бази даних @@ -2228,6 +2268,10 @@ This cannot be undone! Помилка завантаження %@ серверів No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file Помилка отримання файлу @@ -2268,6 +2312,10 @@ This cannot be undone! Помилка збереження пароля користувача No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email Помилка надсилання електронного листа @@ -2736,11 +2784,6 @@ This cannot be undone! Якщо ви не можете зустрітися особисто, покажіть QR-код у відеодзвінку або поділіться посиланням. No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - Якщо ви не можете зустрітися особисто, ви можете **сканувати QR-код у відеодзвінку**, або ваш контакт може поділитися посиланням на запрошення. - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! Якщо ви введете цей пароль при відкритті програми, всі дані програми будуть безповоротно видалені! @@ -2896,15 +2939,27 @@ This cannot be undone! Інтерфейс No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link Неправильне посилання для підключення No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! Неправильна адреса сервера! @@ -3019,10 +3074,18 @@ This is your link for group %@! Приєднання до групи No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections Зберігайте свої зв'язки @@ -3105,6 +3168,11 @@ This is your link for group %@! Живі повідомлення No comment provided by engineer. + + Local + Локально + No comment provided by engineer. + Local name Місцева назва @@ -3344,6 +3412,10 @@ This is your link for group %@! Новий пароль No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request Новий запит на контакт @@ -3466,16 +3538,15 @@ This is your link for group %@! - відключати користувачів (роль "спостерігач") No comment provided by engineer. + + OK + No comment provided by engineer. + Off Вимкнено No comment provided by engineer. - - Off (Local) - Вимкнено (локально) - No comment provided by engineer. - Ok Гаразд @@ -3614,9 +3685,16 @@ This is your link for group %@! Протокол і код з відкритим вихідним кодом - будь-хто може запускати сервери. No comment provided by engineer. - - Opening database… - Відкриття бази даних… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3659,11 +3737,6 @@ This is your link for group %@! Показати пароль No comment provided by engineer. - - Paste - Вставити - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3673,16 +3746,10 @@ This is your link for group %@! Вставити зображення No comment provided by engineer. - - Paste received link - Вставте отримане посилання + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - Вставте отримане посилання для зв'язку з вашим контактом. - placeholder - People can connect to you only via the links you share. Люди можуть зв'язатися з вами лише за посиланнями, якими ви ділитеся. @@ -3718,6 +3785,11 @@ This is your link for group %@! Будь ласка, перевірте свої та контактні налаштування. No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. Зверніться до адміністратора групи. @@ -3921,6 +3993,10 @@ This is your link for group %@! Читайте більше в [Посібнику користувача](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address). No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). Читайте більше в [Посібнику користувача](https://simplex.chat/docs/guide/readme.html#connect-to-friends). @@ -4129,6 +4205,10 @@ This is your link for group %@! Відновлення помилки бази даних No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal Показувати @@ -4283,6 +4363,10 @@ This is your link for group %@! Пошук No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue Безпечна черга @@ -4556,9 +4640,8 @@ This is your link for group %@! Поділіться посиланням No comment provided by engineer. - - Share one-time invitation link - Поділіться посиланням на одноразове запрошення + + Share this 1-time invite link No comment provided by engineer. @@ -4680,16 +4763,15 @@ This is your link for group %@! Хтось notification title - - Start a new chat - Почніть новий чат - No comment provided by engineer. - Start chat Почати чат No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration Почати міграцію @@ -4814,6 +4896,14 @@ This is your link for group %@! Натисніть, щоб приєднатися інкогніто No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat Натисніть, щоб почати новий чат @@ -4876,6 +4966,10 @@ It can happen because of some bug or when the connection is compromised.Спроба змінити пароль до бази даних не була завершена. No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! Прийняте вами з'єднання буде скасовано! @@ -4941,6 +5035,10 @@ It can happen because of some bug or when the connection is compromised.Сервери для нових підключень вашого поточного профілю чату **%@**. No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme Тема @@ -5088,11 +5186,6 @@ You will be prompted to complete authentication before this feature is enabled.< Вимкнути No comment provided by engineer. - - Turn off notifications? - Вимкнути сповіщення? - No comment provided by engineer. - Turn on Ввімкнути @@ -5289,6 +5382,10 @@ To connect, please ask your contact to create another connection link and check Використовуйте новий профіль інкогніто No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server Використовувати сервер @@ -5538,11 +5635,6 @@ Repeat join request? Ви можете приймати дзвінки з екрана блокування без автентифікації пристрою та програми. No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - Ви також можете підключитися за посиланням. Якщо воно відкриється в браузері, натисніть кнопку **Відкрити в мобільному додатку**. - No comment provided by engineer. - You can create it later Ви можете створити його пізніше @@ -5563,6 +5655,10 @@ Repeat join request? Ви можете приховати або вимкнути звук профілю користувача - проведіть по ньому вправо. No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ Тепер ви можете надсилати повідомлення на адресу %@ @@ -5603,6 +5699,10 @@ Repeat join request? Ви можете використовувати розмітку для форматування повідомлень: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! Ви не можете надсилати повідомлення! @@ -5787,13 +5887,6 @@ You can cancel this connection and remove the contact (and try later with a new Ваші контакти можуть дозволити повне видалення повідомлень. No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - Ваші контакти в SimpleX побачать це. -Ви можете змінити його в Налаштуваннях. - No comment provided by engineer. - Your contacts will remain connected. Ваші контакти залишаться на зв'язку. diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index d96537be3e..60434b1661 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -303,14 +303,17 @@ ) No comment provided by engineer. + + **Add contact**: to create a new invitation link, or connect via a link you received. + No comment provided by engineer. + **Add new contact**: to create your one-time QR Code or link for your contact. **添加新联系人**:为您的联系人创建一次性二维码或者链接。 No comment provided by engineer. - - **Create link / QR code** for your contact to use. - **创建链接 / 二维码** 给您的联系人使用。 + + **Create group**: to create a new group. No comment provided by engineer. @@ -323,11 +326,6 @@ **最私密**:不使用 SimpleX Chat 通知服务器,在后台定期检查消息(取决于您多经常使用应用程序)。 No comment provided by engineer. - - **Paste received link** or open it in the browser and tap **Open in mobile app**. - **粘贴收到的链接**或者在浏览器里打开并且点击**在移动应用程序里打开**。 - No comment provided by engineer. - **Please note**: you will NOT be able to recover or change passphrase if you lose it. **请注意**:如果您丢失密码,您将无法恢复或者更改密码。 @@ -338,11 +336,6 @@ **推荐**:设备令牌和通知会发送至 SimpleX Chat 通知服务器,但是消息内容、大小或者发送人不会。 No comment provided by engineer. - - **Scan QR code**: to connect to your contact in person or via video call. - **扫描二维码**:见面或者通过视频通话来连接您的联系人。 - No comment provided by engineer. - **Warning**: Instant push notifications require passphrase saved in Keychain. **警告**:及时推送通知需要保存在钥匙串的密码。 @@ -440,11 +433,6 @@ 1周 time interval - - 1-time link - 一次性链接 - No comment provided by engineer. - 5 minutes 5分钟 @@ -560,6 +548,10 @@ 将地址添加到您的个人资料,以便您的联系人可以与其他人共享。个人资料更新将发送给您的联系人。 No comment provided by engineer. + + Add contact + No comment provided by engineer. + Add preset servers 添加预设服务器 @@ -956,6 +948,10 @@ 通话 No comment provided by engineer. + + Camera not available + No comment provided by engineer. + Can't delete user profile! 无法删除用户个人资料! @@ -1072,6 +1068,10 @@ 聊天已停止 No comment provided by engineer. + + Chat is stopped. If you already used this database on another device, you should transfer it back before starting chat. + No comment provided by engineer. + Chat preferences 聊天偏好设置 @@ -1208,11 +1208,6 @@ This is your own one-time link! 通过链接连接 No comment provided by engineer. - - Connect via link / QR code - 通过群组链接/二维码连接 - No comment provided by engineer. - Connect via one-time link 通过一次性链接连接 @@ -1380,11 +1375,6 @@ This is your own one-time link! 在[桌面应用程序](https://simplex.chat/downloads/)中创建新的个人资料。 💻 No comment provided by engineer. - - Create one-time invitation link - 创建一次性邀请链接 - No comment provided by engineer. - Create profile No comment provided by engineer. @@ -1409,6 +1399,10 @@ This is your own one-time link! 创建于 %@ No comment provided by engineer. + + Creating link… + No comment provided by engineer. + Current Passcode 当前密码 @@ -1950,6 +1944,10 @@ This cannot be undone! 启用自动删除消息? No comment provided by engineer. + + Enable camera access + No comment provided by engineer. + Enable for all 全部启用 @@ -2015,6 +2013,10 @@ This cannot be undone! 加密消息或其他事件 notification + + Encrypted message: app is stopped + notification + Encrypted message: database error 加密消息:数据库错误 @@ -2240,6 +2242,10 @@ This cannot be undone! 加载 %@ 服务器错误 No comment provided by engineer. + + Error opening chat + No comment provided by engineer. + Error receiving file 接收文件错误 @@ -2280,6 +2286,10 @@ This cannot be undone! 保存用户密码时出错 No comment provided by engineer. + + Error scanning code: %@ + No comment provided by engineer. + Error sending email 发送电邮错误 @@ -2749,11 +2759,6 @@ This cannot be undone! 如果您不能亲自见面,可以在视频通话中展示二维码,或分享链接。 No comment provided by engineer. - - If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link. - 如果您不能亲自见面,您可以**扫描视频通话中的二维码**,或者您的联系人可以分享邀请链接。 - No comment provided by engineer. - If you enter this passcode when opening the app, all app data will be irreversibly removed! 如果您在打开应用时输入该密码,所有应用程序数据将被不可撤回地删除! @@ -2909,15 +2914,27 @@ This cannot be undone! 界面 No comment provided by engineer. + + Invalid QR code + No comment provided by engineer. + Invalid connection link 无效的连接链接 No comment provided by engineer. + + Invalid link + No comment provided by engineer. + Invalid name! No comment provided by engineer. + + Invalid response + No comment provided by engineer. + Invalid server address! 无效的服务器地址! @@ -3032,10 +3049,18 @@ This is your link for group %@! 加入群组中 No comment provided by engineer. + + Keep + No comment provided by engineer. + Keep the app open to use it from desktop No comment provided by engineer. + + Keep unused invitation? + No comment provided by engineer. + Keep your connections 保持连接 @@ -3118,6 +3143,11 @@ This is your link for group %@! 实时消息 No comment provided by engineer. + + Local + 本地 + No comment provided by engineer. + Local name 本地名称 @@ -3357,6 +3387,10 @@ This is your link for group %@! 新密码 No comment provided by engineer. + + New chat + No comment provided by engineer. + New contact request 新联系人请求 @@ -3480,16 +3514,15 @@ This is your link for group %@! - 禁用成员(“观察员”角色) No comment provided by engineer. + + OK + No comment provided by engineer. + Off 关闭 No comment provided by engineer. - - Off (Local) - 关闭(本地) - No comment provided by engineer. - Ok 好的 @@ -3629,9 +3662,16 @@ This is your link for group %@! 开源协议和代码——任何人都可以运行服务器。 No comment provided by engineer. - - Opening database… - 打开数据库中…… + + Opening app… + No comment provided by engineer. + + + Or scan QR code + No comment provided by engineer. + + + Or show this code No comment provided by engineer. @@ -3674,11 +3714,6 @@ This is your link for group %@! 显示密码 No comment provided by engineer. - - Paste - 粘贴 - No comment provided by engineer. - Paste desktop address No comment provided by engineer. @@ -3688,16 +3723,10 @@ This is your link for group %@! 粘贴图片 No comment provided by engineer. - - Paste received link - 粘贴收到的链接 + + Paste the link you received No comment provided by engineer. - - Paste the link you received to connect with your contact. - 将您收到的链接粘贴到下面的框中以与您的联系人联系。 - placeholder - People can connect to you only via the links you share. 人们只能通过您共享的链接与您建立联系。 @@ -3733,6 +3762,11 @@ This is your link for group %@! 请检查您和您的联系人偏好设置。 No comment provided by engineer. + + Please contact developers. +Error: %@ + No comment provided by engineer. + Please contact group admin. 请联系群组管理员。 @@ -3936,6 +3970,10 @@ This is your link for group %@! 在 [用户指南](https://simplex.chat/docs/guide/app-settings.html#your-simplex-contact-address) 中阅读更多内容。 No comment provided by engineer. + + Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + No comment provided by engineer. + Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends). 在 [用户指南](https://simplex.chat/docs/guide/readme.html#connect-to-friends) 中阅读更多内容。 @@ -4144,6 +4182,10 @@ This is your link for group %@! 恢复数据库错误 No comment provided by engineer. + + Retry + No comment provided by engineer. + Reveal 揭示 @@ -4298,6 +4340,10 @@ This is your link for group %@! 搜索 No comment provided by engineer. + + Search or paste SimpleX link + No comment provided by engineer. + Secure queue 保护队列 @@ -4572,9 +4618,8 @@ This is your link for group %@! 分享链接 No comment provided by engineer. - - Share one-time invitation link - 分享一次性邀请链接 + + Share this 1-time invite link No comment provided by engineer. @@ -4697,16 +4742,15 @@ This is your link for group %@! 某人 notification title - - Start a new chat - 开始新聊天 - No comment provided by engineer. - Start chat 开始聊天 No comment provided by engineer. + + Start chat? + No comment provided by engineer. + Start migration 开始迁移 @@ -4831,6 +4875,14 @@ This is your link for group %@! 点击以加入隐身聊天 No comment provided by engineer. + + Tap to paste link + No comment provided by engineer. + + + Tap to scan + No comment provided by engineer. + Tap to start a new chat 点击开始一个新聊天 @@ -4893,6 +4945,10 @@ It can happen because of some bug or when the connection is compromised.更改数据库密码的尝试未完成。 No comment provided by engineer. + + The code you scanned is not a SimpleX link QR code. + No comment provided by engineer. + The connection you accepted will be cancelled! 您接受的连接将被取消! @@ -4958,6 +5014,10 @@ It can happen because of some bug or when the connection is compromised.您当前聊天资料 **%@** 的新连接服务器。 No comment provided by engineer. + + The text you pasted is not a SimpleX link. + No comment provided by engineer. + Theme 主题 @@ -5106,11 +5166,6 @@ You will be prompted to complete authentication before this feature is enabled.< 关闭 No comment provided by engineer. - - Turn off notifications? - 关闭通知? - No comment provided by engineer. - Turn on 打开 @@ -5307,6 +5362,10 @@ To connect, please ask your contact to create another connection link and check 使用新的隐身配置文件 No comment provided by engineer. + + Use only local notifications? + No comment provided by engineer. + Use server 使用服务器 @@ -5556,11 +5615,6 @@ Repeat join request? 您可以从锁屏上接听电话,无需设备和应用程序的认证。 No comment provided by engineer. - - You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button. - 您也可以通过点击链接进行连接。如果在浏览器中打开,请点击“在移动应用程序中打开”按钮。 - No comment provided by engineer. - You can create it later 您可以以后创建它 @@ -5581,6 +5635,10 @@ Repeat join request? 您可以隐藏或静音用户个人资料——只需向右滑动。 No comment provided by engineer. + + You can make it visible to your SimpleX contacts via Settings. + No comment provided by engineer. + You can now send messages to %@ 您现在可以给 %@ 发送消息 @@ -5621,6 +5679,10 @@ Repeat join request? 您可以使用 markdown 来编排消息格式: No comment provided by engineer. + + You can view invitation link again in connection details. + No comment provided by engineer. + You can't send messages! 您无法发送消息! @@ -5805,13 +5867,6 @@ You can cancel this connection and remove the contact (and try later with a new 您的联系人可以允许完全删除消息。 No comment provided by engineer. - - Your contacts in SimpleX will see it. -You can change it in Settings. - 您的 SimpleX 的联系人会看到它。 -您可以在设置中更改它。 - No comment provided by engineer. - Your contacts will remain connected. 与您的联系人保持连接。 diff --git a/apps/ios/SimpleX Localizations/zh-Hant.xcloc/Localized Contents/zh-Hant.xliff b/apps/ios/SimpleX Localizations/zh-Hant.xcloc/Localized Contents/zh-Hant.xliff index 821db2620f..03a108d112 100644 --- a/apps/ios/SimpleX Localizations/zh-Hant.xcloc/Localized Contents/zh-Hant.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hant.xcloc/Localized Contents/zh-Hant.xliff @@ -5868,6 +5868,36 @@ It can happen because of some bug or when the connection is compromised.你和你的聯絡人可以新增訊息互動。 No comment provided by engineer. + + %@ connected + %@ 已連接 + No comment provided by engineer. + + + # %@ + # %@ + copied message info title, # <title> + + + %@ and %@ + %@ 和 %@ + No comment provided by engineer. + + + ## History + 紀錄 + copied message info + + + ## In reply to + 回覆 + copied message info + + + %@ and %@ connected + %@ 和 %@ 已連接 + No comment provided by engineer. + diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 801116bf80..2167d4beee 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415323A4082FC92887F906 /* WebRTCClient.swift */; }; 18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415FD2E36F13F596A45BB4 /* CIVideoView.swift */; }; 18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1841516F0CE5992B0EDFB377 /* GroupWelcomeView.swift */; }; - 3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */; }; 3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */; }; 3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4727FF621E00354CDD /* CILinkView.swift */; }; 5C00164428A26FBC0094D739 /* ContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C00164328A26FBC0094D739 /* ContextMenu.swift */; }; @@ -43,11 +42,11 @@ 5C3F1D562842B68D00EC8A82 /* IntegrityErrorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */; }; 5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */; }; 5C4B3B0A285FB130003915F2 /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4B3B09285FB130003915F2 /* DatabaseView.swift */; }; - 5C4E80DA2B3CCD090080FAE2 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80D52B3CCD090080FAE2 /* libgmp.a */; }; - 5C4E80DB2B3CCD090080FAE2 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80D62B3CCD090080FAE2 /* libffi.a */; }; - 5C4E80DC2B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80D72B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a */; }; - 5C4E80DD2B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80D82B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a */; }; - 5C4E80DE2B3CCD090080FAE2 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80D92B3CCD090080FAE2 /* libgmpxx.a */; }; + 5C4E80E42B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80DF2B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a */; }; + 5C4E80E52B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80E02B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a */; }; + 5C4E80E62B40A96C0080FAE2 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80E12B40A96C0080FAE2 /* libgmp.a */; }; + 5C4E80E72B40A96C0080FAE2 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80E22B40A96C0080FAE2 /* libgmpxx.a */; }; + 5C4E80E82B40A96C0080FAE2 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C4E80E32B40A96C0080FAE2 /* libffi.a */; }; 5C5346A827B59A6A004DF848 /* ChatHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5346A727B59A6A004DF848 /* ChatHelp.swift */; }; 5C55A91F283AD0E400C4E99E /* CallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A91E283AD0E400C4E99E /* CallManager.swift */; }; 5C55A921283CCCB700C4E99E /* IncomingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A920283CCCB700C4E99E /* IncomingCallView.swift */; }; @@ -61,7 +60,6 @@ 5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5F2B6F27EBC704006A9D5F /* ProfileImage.swift */; }; 5C65DAF929D0CC20003CEE45 /* DeveloperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */; }; 5C65F343297D45E100B67AF3 /* VersionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C65F341297D3F3600B67AF3 /* VersionView.swift */; }; - 5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6AD81227A834E300348BD7 /* NewChatButton.swift */; }; 5C6BA667289BD954009B8ECC /* DismissSheets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6BA666289BD954009B8ECC /* DismissSheets.swift */; }; 5C7031162953C97F00150A12 /* CIFeaturePreferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7031152953C97F00150A12 /* CIFeaturePreferenceView.swift */; }; 5C7505A227B65FDB00BE3227 /* CIMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7505A127B65FDB00BE3227 /* CIMetaView.swift */; }; @@ -98,8 +96,6 @@ 5CB0BA92282713FD00B3292C /* CreateProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA91282713FD00B3292C /* CreateProfile.swift */; }; 5CB0BA9A2827FD8800B3292C /* HowItWorks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB0BA992827FD8800B3292C /* HowItWorks.swift */; }; 5CB2084F28DA4B4800D024EC /* RTCServers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2084E28DA4B4800D024EC /* RTCServers.swift */; }; - 5CB2085128DB64CA00D024EC /* CreateLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2085028DB64CA00D024EC /* CreateLinkView.swift */; }; - 5CB2085328DB7CAF00D024EC /* ConnectViaLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB2085228DB7CAF00D024EC /* ConnectViaLinkView.swift */; }; 5CB346E52868AA7F001FD2EF /* SuspendChat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E42868AA7F001FD2EF /* SuspendChat.swift */; }; 5CB346E72868D76D001FD2EF /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E62868D76D001FD2EF /* NotificationsView.swift */; }; 5CB346E92869E8BA001FD2EF /* PushEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB346E82869E8BA001FD2EF /* PushEnvironment.swift */; }; @@ -121,8 +117,6 @@ 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */; }; 5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */; }; 5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; }; - 5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; }; - 5CCD403727A5F9A200368C90 /* ScanToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */; }; 5CD67B8F2B0E858A00C510B1 /* hs_init.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD67B8D2B0E858A00C510B1 /* hs_init.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5CD67B902B0E858A00C510B1 /* hs_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CD67B8E2B0E858A00C510B1 /* hs_init.c */; }; 5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDCAD472818589900503DA2 /* NotificationService.swift */; }; @@ -157,6 +151,8 @@ 5CFA59D12864782E00863A68 /* ChatArchiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFA59CF286477B400863A68 /* ChatArchiveView.swift */; }; 5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; }; 5CFE0922282EEAF60002594B /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */; }; + 640417CD2B29B8C200CCB412 /* NewChatMenuButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */; }; + 640417CE2B29B8C200CCB412 /* NewChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640417CC2B29B8C200CCB412 /* NewChatView.swift */; }; 6407BA83295DA85D0082BA18 /* CIInvalidJSONView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */; }; 6419EC562AB8BC8B004A607A /* ContextInvitingContactMemberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */; }; 6419EC582AB97507004A607A /* CIMemberCreatedContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */; }; @@ -263,7 +259,6 @@ 18415B08031E8FB0F7FC27F9 /* CallViewRenderers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallViewRenderers.swift; sourceTree = ""; }; 18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerView.swift; sourceTree = ""; }; 18415FD2E36F13F596A45BB4 /* CIVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIVideoView.swift; sourceTree = ""; }; - 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteToConnectView.swift; sourceTree = ""; }; 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeLinkView.swift; sourceTree = ""; }; 3CDBCF4727FF621E00354CDD /* CILinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CILinkView.swift; sourceTree = ""; }; 5C00164328A26FBC0094D739 /* ContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenu.swift; sourceTree = ""; }; @@ -294,11 +289,11 @@ 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettings.swift; sourceTree = ""; }; 5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = ""; }; 5C4B3B09285FB130003915F2 /* DatabaseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseView.swift; sourceTree = ""; }; - 5C4E80D52B3CCD090080FAE2 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; - 5C4E80D62B3CCD090080FAE2 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 5C4E80D72B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a"; sourceTree = ""; }; - 5C4E80D82B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a"; sourceTree = ""; }; - 5C4E80D92B3CCD090080FAE2 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 5C4E80DF2B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a"; sourceTree = ""; }; + 5C4E80E02B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a"; sourceTree = ""; }; + 5C4E80E12B40A96C0080FAE2 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; + 5C4E80E22B40A96C0080FAE2 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; + 5C4E80E32B40A96C0080FAE2 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; 5C5346A727B59A6A004DF848 /* ChatHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatHelp.swift; sourceTree = ""; }; 5C55A91E283AD0E400C4E99E /* CallManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallManager.swift; sourceTree = ""; }; 5C55A920283CCCB700C4E99E /* IncomingCallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallView.swift; sourceTree = ""; }; @@ -324,7 +319,6 @@ 5C65DAED29CB8908003CEE45 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; 5C65DAF829D0CC20003CEE45 /* DeveloperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperView.swift; sourceTree = ""; }; 5C65F341297D3F3600B67AF3 /* VersionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionView.swift; sourceTree = ""; }; - 5C6AD81227A834E300348BD7 /* NewChatButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatButton.swift; sourceTree = ""; }; 5C6BA666289BD954009B8ECC /* DismissSheets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DismissSheets.swift; sourceTree = ""; }; 5C6D183229E93FBA00D430B3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = "pl.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; }; 5C6D183329E93FBA00D430B3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -381,8 +375,6 @@ 5CB0BA91282713FD00B3292C /* CreateProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateProfile.swift; sourceTree = ""; }; 5CB0BA992827FD8800B3292C /* HowItWorks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HowItWorks.swift; sourceTree = ""; }; 5CB2084E28DA4B4800D024EC /* RTCServers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RTCServers.swift; sourceTree = ""; }; - 5CB2085028DB64CA00D024EC /* CreateLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateLinkView.swift; sourceTree = ""; }; - 5CB2085228DB7CAF00D024EC /* ConnectViaLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectViaLinkView.swift; sourceTree = ""; }; 5CB2085428DE647400D024EC /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 5CB346E42868AA7F001FD2EF /* SuspendChat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuspendChat.swift; sourceTree = ""; }; 5CB346E62868D76D001FD2EF /* NotificationsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsView.swift; sourceTree = ""; }; @@ -408,8 +400,6 @@ 5CC2C0FE2809BF11000C35E3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ru.lproj/SimpleX--iOS--InfoPlist.strings"; sourceTree = ""; }; 5CC868F229EB540C0017BBFD /* CIRcvDecryptionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIRcvDecryptionError.swift; sourceTree = ""; }; 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = ""; }; - 5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = ""; }; - 5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanToConnectView.swift; sourceTree = ""; }; 5CD67B8D2B0E858A00C510B1 /* hs_init.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = hs_init.h; sourceTree = ""; }; 5CD67B8E2B0E858A00C510B1 /* hs_init.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hs_init.c; sourceTree = ""; }; 5CDCAD452818589900503DA2 /* SimpleX NSE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SimpleX NSE.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -444,6 +434,8 @@ 5CFA59C32860BC6200863A68 /* MigrateToAppGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrateToAppGroupView.swift; sourceTree = ""; }; 5CFA59CF286477B400863A68 /* ChatArchiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatArchiveView.swift; sourceTree = ""; }; 5CFE0920282EEAF60002594B /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ZoomableScrollView.swift; path = Shared/Views/ZoomableScrollView.swift; sourceTree = SOURCE_ROOT; }; + 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatMenuButton.swift; sourceTree = ""; }; + 640417CC2B29B8C200CCB412 /* NewChatView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewChatView.swift; sourceTree = ""; }; 6407BA82295DA85D0082BA18 /* CIInvalidJSONView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIInvalidJSONView.swift; sourceTree = ""; }; 6419EC552AB8BC8B004A607A /* ContextInvitingContactMemberView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextInvitingContactMemberView.swift; sourceTree = ""; }; 6419EC572AB97507004A607A /* CIMemberCreatedContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIMemberCreatedContactView.swift; sourceTree = ""; }; @@ -519,13 +511,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C4E80DD2B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a in Frameworks */, + 5C4E80E72B40A96C0080FAE2 /* libgmpxx.a in Frameworks */, 5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */, - 5C4E80DA2B3CCD090080FAE2 /* libgmp.a in Frameworks */, - 5C4E80DC2B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a in Frameworks */, + 5C4E80E62B40A96C0080FAE2 /* libgmp.a in Frameworks */, 5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */, - 5C4E80DB2B3CCD090080FAE2 /* libffi.a in Frameworks */, - 5C4E80DE2B3CCD090080FAE2 /* libgmpxx.a in Frameworks */, + 5C4E80E82B40A96C0080FAE2 /* libffi.a in Frameworks */, + 5C4E80E52B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a in Frameworks */, + 5C4E80E42B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -587,11 +579,11 @@ 5C764E5C279C70B7000C6508 /* Libraries */ = { isa = PBXGroup; children = ( - 5C4E80D62B3CCD090080FAE2 /* libffi.a */, - 5C4E80D52B3CCD090080FAE2 /* libgmp.a */, - 5C4E80D92B3CCD090080FAE2 /* libgmpxx.a */, - 5C4E80D82B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5-ghc9.6.3.a */, - 5C4E80D72B3CCD090080FAE2 /* libHSsimplex-chat-5.4.2.1-FP1oxJSttEYhorN1FRfI5.a */, + 5C4E80E32B40A96C0080FAE2 /* libffi.a */, + 5C4E80E12B40A96C0080FAE2 /* libgmp.a */, + 5C4E80E22B40A96C0080FAE2 /* libgmpxx.a */, + 5C4E80E02B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ-ghc9.6.3.a */, + 5C4E80DF2B40A96C0080FAE2 /* libHSsimplex-chat-5.5.0.0-FwZXD1cMpkc1VLQMq43OyQ.a */, ); path = Libraries; sourceTree = ""; @@ -737,14 +729,10 @@ 5CB924DD27A8622200ACCCDD /* NewChat */ = { isa = PBXGroup; children = ( - 5C6AD81227A834E300348BD7 /* NewChatButton.swift */, - 5CCD403327A5F6DF00368C90 /* AddContactView.swift */, - 5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */, - 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */, + 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */, + 640417CC2B29B8C200CCB412 /* NewChatView.swift */, 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */, 6442E0B9287F169300CEC0F9 /* AddGroupView.swift */, - 5CB2085028DB64CA00D024EC /* CreateLinkView.swift */, - 5CB2085228DB7CAF00D024EC /* ConnectViaLinkView.swift */, 64D0C2C529FAC1EC00B38D5F /* AddContactLearnMore.swift */, ); path = NewChat; @@ -1113,8 +1101,8 @@ buildActionMask = 2147483647; files = ( 64C06EB52A0A4A7C00792D4D /* ChatItemInfoView.swift in Sources */, + 640417CE2B29B8C200CCB412 /* NewChatView.swift in Sources */, 6440CA03288AECA70062C672 /* AddGroupMembersView.swift in Sources */, - 5C6AD81327A834E300348BD7 /* NewChatButton.swift in Sources */, 5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */, 5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */, 5C93292F29239A170090FFF9 /* ProtocolServersView.swift in Sources */, @@ -1161,13 +1149,11 @@ 5C063D2727A4564100AEC577 /* ChatPreviewView.swift in Sources */, 5CC868F329EB540C0017BBFD /* CIRcvDecryptionError.swift in Sources */, 5C35CFCB27B2E91D00FB6C6D /* NtfManager.swift in Sources */, - 3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */, 5C9D13A3282187BB00AB8B43 /* WebRTC.swift in Sources */, 5C9A5BDB2871E05400A5B906 /* SetNotificationsMode.swift in Sources */, 5CB0BA8E2827126500B3292C /* OnboardingView.swift in Sources */, 6442E0BE2880182D00CEC0F9 /* GroupChatInfoView.swift in Sources */, 5C2E261227A30FEA00F70299 /* TerminalView.swift in Sources */, - 5CB2085128DB64CA00D024EC /* CreateLinkView.swift in Sources */, 5C9FD96E27A5D6ED0075386C /* SendMessageView.swift in Sources */, 5CA7DFC329302AF000F7FDDE /* AppSheet.swift in Sources */, 64E972072881BB22008DBC02 /* CIGroupInvitationView.swift in Sources */, @@ -1176,8 +1162,8 @@ 5CB9250D27A9432000ACCCDD /* ChatListNavLink.swift in Sources */, 649BCDA0280460FD00C3A862 /* ComposeImageView.swift in Sources */, 5CA059ED279559F40002BEB4 /* ContentView.swift in Sources */, - 5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */, 5C05DF532840AA1D00C683F9 /* CallSettings.swift in Sources */, + 640417CD2B29B8C200CCB412 /* NewChatMenuButton.swift in Sources */, 5CFE0921282EEAF60002594B /* ZoomableScrollView.swift in Sources */, 5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */, 5C7505A527B679EE00BE3227 /* NavLinkPlain.swift in Sources */, @@ -1212,7 +1198,6 @@ 6448BBB628FA9D56000D2AB9 /* GroupLinkView.swift in Sources */, 5CB346E92869E8BA001FD2EF /* PushEnvironment.swift in Sources */, 5C55A91F283AD0E400C4E99E /* CallManager.swift in Sources */, - 5CCD403727A5F9A200368C90 /* ScanToConnectView.swift in Sources */, 5CFA59D12864782E00863A68 /* ChatArchiveView.swift in Sources */, 649BCDA22805D6EF00C3A862 /* CIImageView.swift in Sources */, 8C05382E2B39887E006436DC /* VideoUtils.swift in Sources */, @@ -1235,7 +1220,6 @@ 5C93293F2928E0FD0090FFF9 /* AudioRecPlay.swift in Sources */, 5C029EA82837DBB3004A9677 /* CICallItemView.swift in Sources */, 5CE4407227ADB1D0007B033A /* Emoji.swift in Sources */, - 5CB2085328DB7CAF00D024EC /* ConnectViaLinkView.swift in Sources */, 5C9CC7A928C532AB00BEF955 /* DatabaseErrorView.swift in Sources */, 5C1A4C1E27A715B700EAD5AD /* ChatItemView.swift in Sources */, 64AA1C6927EE10C800AC7277 /* ContextItemView.swift in Sources */, @@ -1518,7 +1502,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1540,7 +1524,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -1561,7 +1545,7 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; @@ -1583,7 +1567,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app; PRODUCT_NAME = SimpleX; SDKROOT = iphoneos; @@ -1642,7 +1626,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1655,7 +1639,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1674,7 +1658,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GENERATE_INFOPLIST_FILE = YES; @@ -1687,7 +1671,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1706,7 +1690,7 @@ APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1730,7 +1714,7 @@ "$(inherited)", "$(PROJECT_DIR)/Libraries/sim", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; @@ -1752,7 +1736,7 @@ APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 186; + CURRENT_PROJECT_VERSION = 187; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1776,7 +1760,7 @@ "$(inherited)", "$(PROJECT_DIR)/Libraries/sim", ); - MARKETING_VERSION = 5.4.2; + MARKETING_VERSION = 5.5; PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index a545d3508c..96281a5013 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -616,8 +616,8 @@ public enum ChatFeature: String, Decodable, Feature { } case .fullDelete: switch allowed { - case .always: return "Allow your contacts to irreversibly delete sent messages." - case .yes: return "Allow irreversible message deletion only if your contact allows it to you." + case .always: return "Allow your contacts to irreversibly delete sent messages. (24 hours)" + case .yes: return "Allow irreversible message deletion only if your contact allows it to you. (24 hours)" case .no: return "Contacts can mark messages for deletion; you will be able to view them." } case .reactions: @@ -653,11 +653,11 @@ public enum ChatFeature: String, Decodable, Feature { : "Disappearing messages are prohibited in this chat." case .fullDelete: return enabled.forUser && enabled.forContact - ? "Both you and your contact can irreversibly delete sent messages." + ? "Both you and your contact can irreversibly delete sent messages. (24 hours)" : enabled.forUser - ? "Only you can irreversibly delete messages (your contact can mark them for deletion)." + ? "Only you can irreversibly delete messages (your contact can mark them for deletion). (24 hours)" : enabled.forContact - ? "Only your contact can irreversibly delete messages (you can mark them for deletion)." + ? "Only your contact can irreversibly delete messages (you can mark them for deletion). (24 hours)" : "Irreversible message deletion is prohibited in this chat." case .reactions: return enabled.forUser && enabled.forContact @@ -694,6 +694,7 @@ public enum GroupFeature: String, Decodable, Feature { case reactions case voice case files + case history public var id: Self { self } @@ -712,6 +713,7 @@ public enum GroupFeature: String, Decodable, Feature { case .reactions: return NSLocalizedString("Message reactions", comment: "chat feature") case .voice: return NSLocalizedString("Voice messages", comment: "chat feature") case .files: return NSLocalizedString("Files and media", comment: "chat feature") + case .history: return NSLocalizedString("Visible history", comment: "chat feature") } } @@ -723,6 +725,7 @@ public enum GroupFeature: String, Decodable, Feature { case .reactions: return "face.smiling" case .voice: return "mic" case .files: return "doc" + case .history: return "clock" } } @@ -734,6 +737,7 @@ public enum GroupFeature: String, Decodable, Feature { case .reactions: return "face.smiling.fill" case .voice: return "mic.fill" case .files: return "doc.fill" + case .history: return "clock.fill" } } @@ -759,7 +763,7 @@ public enum GroupFeature: String, Decodable, Feature { } case .fullDelete: switch enabled { - case .on: return "Allow to irreversibly delete sent messages." + case .on: return "Allow to irreversibly delete sent messages. (24 hours)" case .off: return "Prohibit irreversible message deletion." } case .reactions: @@ -777,6 +781,11 @@ public enum GroupFeature: String, Decodable, Feature { case .on: return "Allow to send files and media." case .off: return "Prohibit sending files and media." } + case .history: + switch enabled { + case .on: return "Send up to 100 last messages to new members." + case .off: return "Do not send history to new members." + } } } else { switch self { @@ -792,7 +801,7 @@ public enum GroupFeature: String, Decodable, Feature { } case .fullDelete: switch enabled { - case .on: return "Group members can irreversibly delete sent messages." + case .on: return "Group members can irreversibly delete sent messages. (24 hours)" case .off: return "Irreversible message deletion is prohibited in this group." } case .reactions: @@ -810,6 +819,11 @@ public enum GroupFeature: String, Decodable, Feature { case .on: return "Group members can send files and media." case .off: return "Files and media are prohibited in this group." } + case .history: + switch enabled { + case .on: return "Up to 100 last messages are sent to new members." + case .off: return "History is not sent to new members." + } } } } @@ -949,6 +963,7 @@ public struct FullGroupPreferences: Decodable, Equatable { public var reactions: GroupPreference public var voice: GroupPreference public var files: GroupPreference + public var history: GroupPreference public init( timedMessages: TimedMessagesGroupPreference, @@ -956,7 +971,8 @@ public struct FullGroupPreferences: Decodable, Equatable { fullDelete: GroupPreference, reactions: GroupPreference, voice: GroupPreference, - files: GroupPreference + files: GroupPreference, + history: GroupPreference ) { self.timedMessages = timedMessages self.directMessages = directMessages @@ -964,6 +980,7 @@ public struct FullGroupPreferences: Decodable, Equatable { self.reactions = reactions self.voice = voice self.files = files + self.history = history } public static let sampleData = FullGroupPreferences( @@ -972,7 +989,8 @@ public struct FullGroupPreferences: Decodable, Equatable { fullDelete: GroupPreference(enable: .off), reactions: GroupPreference(enable: .on), voice: GroupPreference(enable: .on), - files: GroupPreference(enable: .on) + files: GroupPreference(enable: .on), + history: GroupPreference(enable: .on) ) } @@ -983,14 +1001,16 @@ public struct GroupPreferences: Codable { public var reactions: GroupPreference? public var voice: GroupPreference? public var files: GroupPreference? + public var history: GroupPreference? public init( - timedMessages: TimedMessagesGroupPreference?, - directMessages: GroupPreference?, - fullDelete: GroupPreference?, - reactions: GroupPreference?, - voice: GroupPreference?, - files: GroupPreference? + timedMessages: TimedMessagesGroupPreference? = nil, + directMessages: GroupPreference? = nil, + fullDelete: GroupPreference? = nil, + reactions: GroupPreference? = nil, + voice: GroupPreference? = nil, + files: GroupPreference? = nil, + history: GroupPreference? = nil ) { self.timedMessages = timedMessages self.directMessages = directMessages @@ -998,6 +1018,7 @@ public struct GroupPreferences: Codable { self.reactions = reactions self.voice = voice self.files = files + self.history = history } public static let sampleData = GroupPreferences( @@ -1006,7 +1027,8 @@ public struct GroupPreferences: Codable { fullDelete: GroupPreference(enable: .off), reactions: GroupPreference(enable: .on), voice: GroupPreference(enable: .on), - files: GroupPreference(enable: .on) + files: GroupPreference(enable: .on), + history: GroupPreference(enable: .on) ) } @@ -1017,7 +1039,8 @@ public func toGroupPreferences(_ fullPreferences: FullGroupPreferences) -> Group fullDelete: fullPreferences.fullDelete, reactions: fullPreferences.reactions, voice: fullPreferences.voice, - files: fullPreferences.files + files: fullPreferences.files, + history: fullPreferences.history ) } @@ -3108,6 +3131,10 @@ extension MsgContent: Encodable { public struct FormattedText: Decodable { public var text: String public var format: Format? + + public var isSecret: Bool { + if case .secret = format { true } else { false } + } } public enum Format: Decodable, Equatable { @@ -3121,6 +3148,15 @@ public enum Format: Decodable, Equatable { case simplexLink(linkType: SimplexLinkType, simplexUri: String, smpHosts: [String]) case email case phone + + public var isSimplexLink: Bool { + get { + switch (self) { + case .simplexLink: return true + default: return false + } + } + } } public enum SimplexLinkType: String, Decodable { diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index 5a704457d1..bf911b55f7 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -1959,6 +1959,9 @@ /* No comment provided by engineer. */ "Live messages" = "Съобщения на живо"; +/* No comment provided by engineer. */ +"Local" = "Локално"; + /* No comment provided by engineer. */ "Local name" = "Локално име"; @@ -2222,9 +2225,6 @@ /* No comment provided by engineer. */ "Off" = "Изключено"; -/* No comment provided by engineer. */ -"Off (Local)" = "Изключено (Локално)"; - /* feature offered item */ "offered %@" = "предлага %@"; @@ -2315,9 +2315,6 @@ /* No comment provided by engineer. */ "Open-source protocol and code – anybody can run the servers." = "Протокол и код с отворен код – всеки може да оперира собствени сървъри."; -/* No comment provided by engineer. */ -"Opening database…" = "Отваряне на база данни…"; - /* member role */ "owner" = "собственик"; @@ -3218,9 +3215,6 @@ /* No comment provided by engineer. */ "Turn off" = "Изключи"; -/* No comment provided by engineer. */ -"Turn off notifications?" = "Изключи известията?"; - /* No comment provided by engineer. */ "Turn on" = "Включи"; @@ -3641,9 +3635,6 @@ /* No comment provided by engineer. */ "Your contacts can allow full message deletion." = "Вашите контакти могат да позволят пълното изтриване на съобщението."; -/* No comment provided by engineer. */ -"Your contacts in SimpleX will see it.\nYou can change it in Settings." = "Вашите контакти в SimpleX ще го видят.\nМожете да го промените в Настройки."; - /* No comment provided by engineer. */ "Your contacts will remain connected." = "Вашите контакти ще останат свързани."; diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index 26469bea98..ef7eff477d 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -1956,6 +1956,9 @@ /* No comment provided by engineer. */ "Live messages" = "Živé zprávy"; +/* No comment provided by engineer. */ +"Local" = "Místní"; + /* No comment provided by engineer. */ "Local name" = "Místní název"; @@ -2219,9 +2222,6 @@ /* No comment provided by engineer. */ "Off" = "Vypnout"; -/* No comment provided by engineer. */ -"Off (Local)" = "Vypnuto (místní)"; - /* feature offered item */ "offered %@" = "nabídl %@"; @@ -2312,9 +2312,6 @@ /* No comment provided by engineer. */ "Open-source protocol and code – anybody can run the servers." = "Protokol a kód s otevřeným zdrojovým kódem - servery může provozovat kdokoli."; -/* No comment provided by engineer. */ -"Opening database…" = "Otvírání databáze…"; - /* member role */ "owner" = "vlastník"; @@ -3215,9 +3212,6 @@ /* No comment provided by engineer. */ "Turn off" = "Vypnout"; -/* No comment provided by engineer. */ -"Turn off notifications?" = "Vypnout upozornění?"; - /* No comment provided by engineer. */ "Turn on" = "Zapnout"; @@ -3638,9 +3632,6 @@ /* No comment provided by engineer. */ "Your contacts can allow full message deletion." = "Vaše kontakty mohou povolit úplné mazání zpráv."; -/* No comment provided by engineer. */ -"Your contacts in SimpleX will see it.\nYou can change it in Settings." = "Vaše kontakty v SimpleX ji uvidí.\nMůžete ji změnit v Nastavení."; - /* No comment provided by engineer. */ "Your contacts will remain connected." = "Vaše kontakty zůstanou připojeny."; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index febd4c06a5..12e4e8de78 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -2163,6 +2163,9 @@ /* No comment provided by engineer. */ "Live messages" = "Live Nachrichten"; +/* No comment provided by engineer. */ +"Local" = "Lokal"; + /* No comment provided by engineer. */ "Local name" = "Lokaler Name"; @@ -2432,9 +2435,6 @@ /* No comment provided by engineer. */ "Off" = "Aus"; -/* No comment provided by engineer. */ -"Off (Local)" = "Aus (Lokal)"; - /* feature offered item */ "offered %@" = "angeboten %@"; @@ -2528,9 +2528,6 @@ /* No comment provided by engineer. */ "Open-source protocol and code – anybody can run the servers." = "Open-Source-Protokoll und -Code – Jede Person kann ihre eigenen Server aufsetzen und nutzen."; -/* No comment provided by engineer. */ -"Opening database…" = "Öffne Datenbank …"; - /* member role */ "owner" = "Eigentümer"; @@ -3467,9 +3464,6 @@ /* No comment provided by engineer. */ "Turn off" = "Abschalten"; -/* No comment provided by engineer. */ -"Turn off notifications?" = "Benachrichtigungen abschalten?"; - /* No comment provided by engineer. */ "Turn on" = "Einschalten"; @@ -3959,9 +3953,6 @@ /* No comment provided by engineer. */ "Your contacts can allow full message deletion." = "Ihre Kontakte können die unwiederbringliche Löschung von Nachrichten erlauben."; -/* No comment provided by engineer. */ -"Your contacts in SimpleX will see it.\nYou can change it in Settings." = "Ihre Kontakte in SimpleX werden es sehen.\nSie können es in den Einstellungen ändern."; - /* No comment provided by engineer. */ "Your contacts will remain connected." = "Ihre Kontakte bleiben verbunden."; diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index d9b14eddbd..714692843d 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -25,6 +25,9 @@ /* 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. */ +"- optionally notify deleted contacts.\n- profile names with spaces.\n- and more!" = "- notificar opcionalmente a los contactos eliminados.\n- nombres de perfil con espacios.\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."; @@ -43,6 +46,12 @@ /* No comment provided by engineer. */ "(" = "("; +/* No comment provided by engineer. */ +"(new)" = "(nuevo)"; + +/* No comment provided by engineer. */ +"(this device v%@)" = "(este dispositivo v%@)"; + /* No comment provided by engineer. */ ")" = ")"; @@ -118,12 +127,18 @@ /* No comment provided by engineer. */ "%@ %@" = "%@ %@"; +/* No comment provided by engineer. */ +"%@ and %@" = "%@ y %@"; + /* No comment provided by engineer. */ "%@ and %@ connected" = "%@ y %@ conectados"; /* copied message info, at