From 9f15ee85f662d4042f3b2f0aedf793269a043a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20B=C3=B6ttger?= Date: Wed, 11 Feb 2026 21:04:07 +0100 Subject: [PATCH] Improve toast view --- QuickDrop/Localizable.xcstrings | 699 ++++++++++++++++++ QuickDrop/Util/SendToExtension.swift | 7 +- .../View/Introduction/IntroductionView.swift | 7 +- QuickDrop/View/Toast/QuickDropToastView.swift | 37 +- QuickDrop/ViewModel/ReceiveModel.swift | 43 +- 5 files changed, 778 insertions(+), 15 deletions(-) diff --git a/QuickDrop/Localizable.xcstrings b/QuickDrop/Localizable.xcstrings index b5acb27..4617a87 100644 --- a/QuickDrop/Localizable.xcstrings +++ b/QuickDrop/Localizable.xcstrings @@ -234,6 +234,239 @@ } } }, + "AcceptOnce" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "قبول مرة واحدة" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accepta una vegada" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Přijmout jednorázově" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accepter én gang" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einmal akzeptieren" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αποδοχή Μια Φορά" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accept Once" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accept Once" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accept Once" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accept Once" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceptar una vez" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceptar una vez" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hyväksy kerran" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accepter une fois" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accepter une fois" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "קבל פעם אחת" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "एक बार स्वीकार करें" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prihvati jednom" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Egyszeri elfogadás" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terima Sekali" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Accetta una volta" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1回だけ許可" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "한 번 허용" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Terima Sekali" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Godta én gang" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eenmalig accepteren" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zaakceptuj jednorazowo" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceitar uma vez" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aceitar uma vez" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acceptă o dată" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Принять один раз" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Acceptera en gång" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "อนุญาตครั้งเดียว" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bir Kez Kabul Et" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Прийняти один раз" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chấp nhận một lần" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "仅接受一次" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "僅接受一次" + } + } + } + }, "Acknowledgements" : { "localizations" : { "ar" : { @@ -30728,6 +30961,239 @@ } } }, + "ShareExtensionDisabledDescriptionLegacy" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لمشاركة هذا المحتوى مع جهاز آخر، افتح تفضيلات النظام في جهاز Mac وانتقل إلى الإضافات.\n\nفعّل زر QuickDrop وحاول مرة أخرى." + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per compartir aquest contingut amb un altre dispositiu, obre les Preferències del sistema del teu Mac i ves a Extensions.\n\nActiva l'interruptor de QuickDrop i torna-ho a intentar." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chcete-li tento obsah sdílet s jiným zařízením, otevřete Předvolby systému Macu a přejděte do sekce Rozšíření.\n\nZapněte přepínač pro QuickDrop a zkuste to znovu." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "For at dele dette indhold med en anden enhed, skal du åbne Systemindstillinger på din Mac og gå til Udvidelser.\n\nAktivér QuickDrop og prøv igen." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um diesen Inhalt mit einem anderen Gerät zu teilen, öffne die Systemeinstellungen deines Macs und gehe zu Erweiterungen.\n\nAktiviere den Schalter für QuickDrop und versuche es erneut." + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Για να μοιραστείτε αυτό το περιεχόμενο με άλλη συσκευή, ανοίξτε τις Προτιμήσεις Συστήματος του Mac σας και πηγαίνετε στις Επεκτάσεις.\n\nΕνεργοποιήστε τον διακόπτη για το QuickDrop και δοκιμάστε ξανά." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "To share this content with another device, open your Mac’s System Preferences and navigate to Extensions.\n\nEnable the toggle for QuickDrop and try again." + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "To share this content with another device, open your Mac’s System Preferences and navigate to Extensions.\n\nEnable the toggle for QuickDrop and try again." + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "To share this content with another device, open your Mac’s System Preferences and navigate to Extensions.\n\nEnable the toggle for QuickDrop and try again." + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "To share this content with another device, open your Mac’s System Preferences and navigate to Extensions.\n\nEnable the toggle for QuickDrop and try again." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para compartir este contenido con otro dispositivo, abre las Preferencias del Sistema en tu Mac y ve a Extensiones.\n\nActiva el interruptor para QuickDrop e inténtalo de nuevo." + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para compartir este contenido con otro dispositivo, abre las Preferencias del Sistema de tu Mac y ve a Extensiones.\n\nActiva el interruptor para QuickDrop e inténtalo de nuevo." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jos haluat jakaa tämän sisällön toiselle laitteelle, avaa Macin Järjestelmäasetukset ja siirry Laajennukset-osioon.\n\nOta QuickDrop käyttöön ja yritä uudelleen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour partager ce contenu avec un autre appareil, ouvrez les Préférences Système de votre Mac puis allez dans Extensions.\n\nActivez l’interrupteur pour QuickDrop et réessayez." + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour partager ce contenu avec un autre appareil, ouvrez les Préférences Système de votre Mac et allez dans Extensions.\n\nActivez l’interrupteur pour QuickDrop et réessayez." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כדי לשתף תוכן זה עם מכשיר אחר, פתח את העדפות המערכת במק שלך וגש להרחבות.\n\nאפשר את המתג עבור QuickDrop ונסה שוב." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "इस सामग्री को दूसरे डिवाइस के साथ साझा करने के लिए, अपने Mac की System Preferences में जाएँ और Extensions खोलें।\n\nQuickDrop का टॉगल चालू करें और फिर से प्रयास करें।" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Za dijeljenje ovog sadržaja s drugim uređajem otvorite Postavke sustava na Macu i idite na Proširenja.\n\nOmogućite QuickDrop prekidač i pokušajte ponovno." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha ezt a tartalmat másik eszközzel szeretnéd megosztani, nyisd meg a Mac rendszerbeállításait, majd keresd meg a Bővítmények részt.\n\nKapcsold be a QuickDrop-ot, és próbáld újra." + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untuk membagikan konten ini ke perangkat lain, buka Preferensi Sistem di Mac Anda lalu buka Ekstensi.\n\nAktifkan tombol QuickDrop lalu coba lagi." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per condividere questo contenuto con un altro dispositivo, apri le Preferenze di Sistema del Mac e vai su Estensioni.\n\nAttiva l'interruttore per QuickDrop e riprova." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このコンテンツを他のデバイスと共有するには、Macの「システム環境設定」を開き、「機能拡張」に移動してください。\n\nQuickDropのトグルを有効にして、再度お試しください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 콘텐츠를 다른 기기와 공유하려면 Mac의 시스템 환경설정에서 확장 프로그램으로 이동하세요.\n\nQuickDrop 토글을 활성화한 후 다시 시도하세요." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untuk kongsikan kandungan ini dengan peranti lain, buka Keutamaan Sistem Mac anda dan pergi ke Sambungan.\n\nAktifkan togol untuk QuickDrop dan cuba lagi." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "For å dele dette innholdet med en annen enhet, åpne Systemvalg på Mac-en og gå til Utvidelser.\n\nAktiver bryteren for QuickDrop og prøv igjen." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Om deze inhoud met een ander apparaat te delen, open je de Systeemvoorkeuren van je Mac en ga naar Extensies.\n\nSchakel de schakelaar voor QuickDrop in en probeer het opnieuw." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby udostępnić tę zawartość innemu urządzeniu, otwórz Preferencje systemowe Maca i przejdź do sekcji Rozszerzenia.\n\nWłącz przełącznik dla QuickDrop, a następnie spróbuj ponownie." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para compartilhar este conteúdo com outro dispositivo, abra as Preferências do Sistema do seu Mac e vá até Extensões.\n\nAtive o QuickDrop e tente novamente." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para partilhar este conteúdo com outro dispositivo, abra as Preferências do Sistema do seu Mac e vá a Extensões.\n\nAtive a opção para o QuickDrop e tente novamente." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pentru a partaja acest conținut cu un alt dispozitiv, deschide Preferințele de sistem ale Mac-ului și mergi la Extensii.\n\nActivează comutatorul pentru QuickDrop și încearcă din nou." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Чтобы поделиться этим контентом с другим устройством, откройте Системные настройки Mac и перейдите в раздел «Расширения».\n\nВключите переключатель для QuickDrop и попробуйте снова." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "För att dela detta innehåll med en annan enhet, öppna Systeminställningar på din Mac och gå till Tillägg.\n\nAktivera QuickDrop-växeln och försök igen." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เพื่อแชร์เนื้อหานี้กับอุปกรณ์อื่น ให้เปิดการตั้งค่าระบบของ Mac ของคุณแล้วไปที่ ส่วนเสริม\n\nเปิดสวิตช์สำหรับ QuickDrop แล้วลองใหม่อีกครั้ง" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu içeriği başka bir cihazla paylaşmak için Mac’inizin Sistem Tercihleri’ni açın ve Uzantılar bölümüne gidin.\n\nQuickDrop’u etkinleştirin ve tekrar deneyin." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Щоб поділитися цим контентом з іншим пристроєм, відкрийте Системні налаштування Mac і перейдіть до Розширень.\n\nУвімкніть перемикач для QuickDrop і спробуйте ще раз." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Để chia sẻ nội dung này với thiết bị khác, hãy mở Tùy chọn Hệ thống trên Mac và đi tới Tiện ích Mở rộng.\n\nBật chuyển đổi cho QuickDrop và thử lại." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "要与其他设备共享此内容,请打开 Mac 的系统偏好设置并进入扩展。\n\n启用 QuickDrop 的开关后重试。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "若要將此內容分享至其他裝置,請開啟您的 Mac「系統偏好設定」,前往「擴充功能」。\n\n啟用 QuickDrop 開關後再試一次。" + } + } + } + }, "ShareExtensionDisabledTitle" : { "extractionState" : "manual", "localizations" : { @@ -38882,6 +39348,239 @@ } } }, + "introduction_enable_share_extension_description_legacy" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "لإرسال ملفات من هذا الـMac، يمكنك تفعيل امتداد المشاركة الاختياري. انقر على \"%@\"، اختر \"المزيد\"، ثم انزل للأسفل وفعّل زر QuickDrop." + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per enviar fitxers des d'aquest Mac, pots activar l'extensió de compartició opcional. Fes clic a \"%@\", selecciona \"Més\", desplaça't cap avall i activa l'interruptor de QuickDrop." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chcete-li odesílat soubory z tohoto Macu, můžete povolit volitelné rozšíření pro sdílení. Klikněte na „%@“, vyberte „Více“, sjeďte dolů a zapněte přepínač pro QuickDrop." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "For at sende filer fra denne Mac kan du aktivere den valgfrie delingsudvidelse. Klik på \"%@\", vælg \"Mere\", rul ned og aktiver QuickDrop." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Um Dateien von diesem Mac zu senden, kannst du die optionale Share-Erweiterung aktivieren. Klicke auf „%@“, wähle „Mehr“, scrolle nach unten und aktiviere den Schalter für QuickDrop." + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Για να στείλετε αρχεία από αυτό το Mac, μπορείτε να ενεργοποιήσετε την προαιρετική επέκταση κοινής χρήσης. Κάντε κλικ στο \"%@\", επιλέξτε \"Περισσότερα\", μετακινηθείτε προς τα κάτω και ενεργοποιήστε τον διακόπτη για το QuickDrop." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "To send files from this Mac, you may enable the optional share extension. Click on \"%@\" choose \"More\", scroll down, and enable the toggle for QuickDrop." + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "To send files from this Mac, you may enable the optional share extension. Click on \"%@\", choose \"More\", scroll down, and enable the toggle for QuickDrop." + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "To send files from this Mac, you may enable the optional share extension. Click on \"%@\", choose \"More\", scroll down, and enable the toggle for QuickDrop." + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "To send files from this Mac, you may enable the optional share extension. Click on \"%@\" choose \"More\", scroll down, and enable the toggle for QuickDrop." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para enviar archivos desde este Mac, puedes habilitar la extensión de compartir opcional. Haz clic en \"%@\", elige \"Más\", desplázate hacia abajo y activa el interruptor de QuickDrop." + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para enviar archivos desde esta Mac, puedes habilitar la extensión para compartir opcional. Haz clic en \"%@\", selecciona \"Más\", desplázate hacia abajo y activa el interruptor de QuickDrop." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jos haluat lähettää tiedostoja tältä Macilta, voit ottaa käyttöön valinnaisen jakolaajennuksen. Napsauta \"%@\", valitse \"Lisää\", vieritä alas ja ota QuickDrop käyttöön." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour envoyer des fichiers depuis ce Mac, vous pouvez activer l’extension de partage optionnelle. Cliquez sur « %@ », choisissez « Plus », faites défiler vers le bas et activez l’interrupteur pour QuickDrop." + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour envoyer des fichiers depuis ce Mac, vous pouvez activer l’extension de partage optionnelle. Cliquez sur « %@ », choisissez « Plus », faites défiler vers le bas et activez QuickDrop." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "כדי לשלוח קבצים מהמחשב הזה, תוכל לאפשר את הרחבת השיתוף האופציונלית. לחץ על \"%@\", בחר \"עוד\", גלול למטה ואפשר את מתג QuickDrop." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "इस Mac से फ़ाइलें भेजने के लिए, आप वैकल्पिक शेयर एक्सटेंशन सक्षम कर सकते हैं। \"%@\" पर क्लिक करें, \"More\" चुनें, नीचे स्क्रॉल करें, और QuickDrop का टॉगल चालू करें।" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Za slanje datoteka s ovog Maca možete omogućiti opcionalni dodatak za dijeljenje. Kliknite na „%@“, odaberite „Više“, skrolajte dolje i uključite QuickDrop prekidač." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ha fájlokat szeretnél küldeni erről a Mac-ről, engedélyezheted az opcionális megosztási bővítményt. Kattints a \"%@\"-ra, válaszd a \"Több\" lehetőséget, görgess le, és kapcsold be a QuickDrop-ot." + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untuk mengirim file dari Mac ini, Anda dapat mengaktifkan ekstensi berbagi opsional. Klik \"%@\", pilih \"Lainnya\", gulir ke bawah, lalu aktifkan QuickDrop." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Per inviare file da questo Mac, puoi abilitare l'estensione di condivisione opzionale. Clicca su \"%@\", scegli \"Altro\", scorri in basso e attiva l'interruttore per QuickDrop." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "このMacからファイルを送信するには、オプションの共有機能拡張を有効にしてください。 \"%@\" をクリックし、「その他」を選択、下にスクロールしてQuickDropのトグルをオンにします。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이 Mac에서 파일을 보내려면 선택적 공유 확장 기능을 활성화할 수 있습니다. \"%@\"를 클릭하고 \"더 보기\"를 선택한 다음 아래로 스크롤하여 QuickDrop 토글을 켜세요." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Untuk hantar fail dari Mac ini, anda boleh aktifkan sambungan perkongsian pilihan. Klik pada \"%@\", pilih \"Lagi\", skrol ke bawah, dan aktifkan togol untuk QuickDrop." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "For å sende filer fra denne Mac-en, kan du aktivere den valgfrie delingsutvidelsen. Klikk på «%@», velg «Mer», bla ned og aktiver bryteren for QuickDrop." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Om bestanden vanaf deze Mac te verzenden, kun je de optionele deel-extensie inschakelen. Klik op \"%@\", kies \"Meer\", scroll naar beneden en schakel QuickDrop in." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby wysyłać pliki z tego Maca, możesz włączyć opcjonalne rozszerzenie udostępniania. Kliknij „%@”, wybierz „Więcej”, przewiń w dół i włącz przełącznik dla QuickDrop." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para enviar arquivos deste Mac, você pode ativar a extensão de compartilhamento opcional. Clique em \"%@\", escolha \"Mais\", role para baixo e ative o QuickDrop." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Para enviar ficheiros a partir deste Mac, pode ativar a extensão de partilha opcional. Clique em \"%@\", escolha \"Mais\", desça e ative a opção para o QuickDrop." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pentru a trimite fișiere de pe acest Mac, poți activa extensia opțională de partajare. Fă clic pe \"%@\", alege „Mai multe”, derulează în jos și activează comutatorul pentru QuickDrop." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Чтобы отправлять файлы с этого Mac, вы можете включить дополнительное расширение для обмена. Нажмите «%@», выберите «Ещё», пролистайте вниз и включите переключатель для QuickDrop." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "För att skicka filer från denna Mac kan du aktivera det valfria delningstillägget. Klicka på \"%@\", välj \"Mer\", scrolla ner och slå på växeln för QuickDrop." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "หากต้องการส่งไฟล์จาก Mac เครื่องนี้ คุณสามารถเปิดใช้งานส่วนขยายการแชร์ เลือก \"%@\" เลือก \"เพิ่มเติม\" เลื่อนลง แล้วเปิดสวิตช์สำหรับ QuickDrop" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bu Mac’ten dosya göndermek için, isteğe bağlı paylaşım uzantısını etkinleştirebilirsiniz. \"%@\" simgesine tıklayın, \"Diğer\"i seçin, aşağı kaydırın ve QuickDrop’u etkinleştirin." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Щоб надсилати файли з цього Mac, ви можете ввімкнути додатковий розширювач спільного доступу. Натисніть на «%@», виберіть «Ще», прокрутіть вниз і увімкніть перемикач для QuickDrop." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Để gửi tệp từ máy Mac này, bạn có thể bật tiện ích chia sẻ tùy chọn. Nhấp vào \"%@\", chọn \"Thêm\", cuộn xuống và bật chuyển đổi cho QuickDrop." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "如果要从此 Mac 发送文件,可以启用可选的分享扩展。在“%@”中点击“更多”,向下滚动并启用 QuickDrop 的开关。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "若要從此 Mac 傳送檔案,您可以啟用選用的分享擴充功能。請點擊「%@」,選擇「更多」,往下捲動並啟用 QuickDrop 開關。" + } + } + } + }, "introduction_finished" : { "extractionState" : "manual", "localizations" : { diff --git a/QuickDrop/Util/SendToExtension.swift b/QuickDrop/Util/SendToExtension.swift index ce4a921..fed53e8 100644 --- a/QuickDrop/Util/SendToExtension.swift +++ b/QuickDrop/Util/SendToExtension.swift @@ -19,7 +19,12 @@ func sendToSharingService(items: [Any]) { let alert = NSAlert() alert.alertStyle = .critical alert.messageText = "ShareExtensionDisabledTitle".localized() - alert.informativeText = "ShareExtensionDisabledDescription".localized() + if #available(macOS 13.0, *) { + alert.informativeText = "ShareExtensionDisabledDescription".localized() + } + else { + alert.informativeText = "ShareExtensionDisabledDescriptionLegacy".localized() + } alert.addButton(withTitle: "CloseAlert".localized()) alert.runModal() } diff --git a/QuickDrop/View/Introduction/IntroductionView.swift b/QuickDrop/View/Introduction/IntroductionView.swift index 761789d..72bec46 100644 --- a/QuickDrop/View/Introduction/IntroductionView.swift +++ b/QuickDrop/View/Introduction/IntroductionView.swift @@ -251,7 +251,12 @@ enum IntroductionPage: CaseIterable { case .localNetworkAccess: return "introduction_local_network_access_description".localized(with: "introduction_continue".localized()) case .enableShareExtension: - return "introduction_enable_share_extension_description".localized(with: "EnableQuickDropExtension".localized()) + if #available(macOS 13.0, *) { + return "introduction_enable_share_extension_description".localized(with: "EnableQuickDropExtension".localized()) + } + else { + return "introduction_enable_share_extension_description_legacy".localized(with: "EnableQuickDropExtension".localized()) + } case .finished: return "introduction_finished_description" } diff --git a/QuickDrop/View/Toast/QuickDropToastView.swift b/QuickDrop/View/Toast/QuickDropToastView.swift index a9ada5f..3ba10dc 100644 --- a/QuickDrop/View/Toast/QuickDropToastView.swift +++ b/QuickDrop/View/Toast/QuickDropToastView.swift @@ -153,7 +153,7 @@ struct QuickDropToastView: View { ActionButtonRow { if consent.allowsTrust { QuickDropToastViewMenuButton(title: "Accept") { - Button("Accept".localized()) { + Button("AcceptOnce".localized()) { consent.acceptAction(false) } Button("AutoAcceptFromThisDevice".localized()) { @@ -249,6 +249,8 @@ struct QuickDropToastView: View { .transition(.opacity.combined(with: .scale(scale: 0.95))) } } + .shadow(color: Color.black.opacity(colorScheme.isLight ? 0.16 : 0.30), radius: 10, x: 0, y: 5) + .shadow(color: Color.black.opacity(colorScheme.isLight ? 0.06 : 0.14), radius: 2, x: 0, y: 1) .frame(maxWidth: .infinity) } } @@ -287,7 +289,7 @@ fileprivate struct QuickDropToastViewButton: View { var body: some View { Button(action: action) { - ToastButtonLabel(title: title) + ToastButtonLabel(title: title, fillsWidth: true) } .buttonStyle(.plain) // prevents blue macOS button look } @@ -301,7 +303,7 @@ fileprivate struct QuickDropToastViewMenuButton: View { Menu { content() } label: { - ToastButtonLabel(title: title) + ToastButtonLabel(title: title, fillsWidth: false) } .menuStyle(.borderlessButton) } @@ -309,13 +311,14 @@ fileprivate struct QuickDropToastViewMenuButton: View { fileprivate struct ToastButtonLabel: View { let title: String + let fillsWidth: Bool var body: some View { Text(title.localized()) .font(.system(size: 12.5, weight: .medium)) .foregroundColor(.mainColor.opacity(0.75)) .lineLimit(1) - .frame(maxWidth: .infinity, maxHeight: .infinity) + .frame(maxWidth: fillsWidth ? .infinity : nil, maxHeight: .infinity) .padding(.horizontal, 14) .padding(.vertical, 8) .contentShape(Rectangle()) @@ -451,6 +454,31 @@ struct QuickDropToastView_Previews: PreviewProvider { } } } + + struct ConsentDemo2: View { + @State var model = ReceiveModel(controlPlusScreen: { _ in }) + + var body: some View { + QuickDropToastView( + receiveModel: model, + onCancel: { } + ) + .frame(width: toastViewSize.width, height: toastViewSize.height) + .clipped() + .padding(100) + //.background(QuickDropToastView_Previews.previewWallpaper) + .onAppear { + model.consentState = .init( + transferID: "preview", + pinCodeMessage: "PIN: 1233", + message: "45 images from Pixel 6 Pro", + allowsTrust: false, + acceptAction: { _ in }, + declineAction: { } + ) + } + } + } struct ProgressDemo: View { @State var model = ReceiveModel(controlPlusScreen: { _ in }) @@ -503,6 +531,7 @@ struct QuickDropToastView_Previews: PreviewProvider { static var previews: some View { Group { ConsentDemo() + ConsentDemo2() ProgressDemo() CompletedDemo() } diff --git a/QuickDrop/ViewModel/ReceiveModel.swift b/QuickDrop/ViewModel/ReceiveModel.swift index 790c781..f86470c 100644 --- a/QuickDrop/ViewModel/ReceiveModel.swift +++ b/QuickDrop/ViewModel/ReceiveModel.swift @@ -70,14 +70,11 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { let mainMessage = transfer.getDescription(deviceName: device.name ?? "UnknownDevice".localized()) let pinCodeMessage = transfer.getPinCodeMessage() let transferID = transfer.id - - let title = "QuickDrop - \(pinCodeMessage)" - let primaryButtonTitle = "Accept".localized() + let primaryButtonAction = { (trustDevice: Bool) in NearbyConnectionManager.shared.submitUserConsent(transferID: transferID, accept: true, trustDevice: trustDevice) } - - let secondaryButtonTitle = "Decline".localized() + let secondaryButtonAction = { NearbyConnectionManager.shared.submitUserConsent(transferID: transferID, accept: false, trustDevice: false) } #if os(macOS) @@ -107,6 +104,11 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { self.showQuickDropToast(for: transferID) } #else + + let title = "QuickDrop - \(pinCodeMessage)" + let primaryButtonTitle = "Accept".localized() + let secondaryButtonTitle = "Decline".localized() + // iOS let alwaysAcceptLabel = transfer.allowsToBeAddedAsTrustedDevice ? "AlwaysAccept".localized() : nil ProgressAlert.shared.askForUserPermission(title: title, message: mainMessage, acceptLabel: primaryButtonTitle, acceptAlwaysLabel: alwaysAcceptLabel, rejectLabel: secondaryButtonTitle) { accepted in @@ -479,10 +481,33 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { let targetY = visible.maxY - toastViewSize.height - marginFromTop - extraTopInset let windowWidth = visible.maxX - targetX let targetFrame = CGRect(x: targetX, y: targetY, width: windowWidth, height: toastViewSize.height) + + // Expand the borderless window so SwiftUI shadow can render without clipping. + // Keep the toast anchored at the same screen position by offsetting hostingView + // inside a clear container view. + let shadowInsetLeft: CGFloat = 22 + let shadowInsetTop: CGFloat = 18 + let shadowInsetBottom: CGFloat = 24 + let windowFrame = CGRect( + x: targetFrame.minX - shadowInsetLeft, + y: targetFrame.minY - shadowInsetBottom, + width: targetFrame.width + shadowInsetLeft, + height: targetFrame.height + shadowInsetTop + shadowInsetBottom + ) + + let containerView = NSView(frame: CGRect(origin: .zero, size: windowFrame.size)) + containerView.wantsLayer = true + containerView.layer?.backgroundColor = NSColor.clear.cgColor + + hostingView.frame = CGRect( + x: shadowInsetLeft, + y: shadowInsetBottom, + width: targetFrame.width, + height: targetFrame.height + ) + containerView.addSubview(hostingView) - hostingView.frame.size = targetFrame.size - - let window = NSWindow(contentRect: targetFrame, + let window = NSWindow(contentRect: windowFrame, styleMask: [.borderless], backing: .buffered, defer: false) @@ -493,7 +518,7 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { window.hasShadow = false window.level = .statusBar window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] - window.contentView = hostingView + window.contentView = containerView window.ignoresMouseEvents = false window.alphaValue = 1 window.makeKeyAndOrderFront(nil)