diff --git a/QuickDrop.xcodeproj/project.pbxproj b/QuickDrop.xcodeproj/project.pbxproj index cda9785..cd39ac2 100644 --- a/QuickDrop.xcodeproj/project.pbxproj +++ b/QuickDrop.xcodeproj/project.pbxproj @@ -111,6 +111,9 @@ EB5C383F2E38C49D0052EFD7 /* LaunchAtLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5C383E2E38C49D0052EFD7 /* LaunchAtLogin.swift */; }; EB5C38402E38C49D0052EFD7 /* LaunchAtLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5C383E2E38C49D0052EFD7 /* LaunchAtLogin.swift */; }; EB5C38412E38C49D0052EFD7 /* LaunchAtLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB5C383E2E38C49D0052EFD7 /* LaunchAtLogin.swift */; }; + EB6E6AB42ECBA46D00E71D57 /* PhotoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBBEE1452EC9D92F00AA7831 /* PhotoManager.swift */; }; + EB6E6B212ECBA95000E71D57 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = EB6E6B202ECBA95000E71D57 /* InfoPlist.xcstrings */; }; + EB6E6B222ECBA95000E71D57 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = EB6E6B202ECBA95000E71D57 /* InfoPlist.xcstrings */; }; EB6F62D72D91F4AF00534EC2 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB6F62D62D91F4AC00534EC2 /* SettingsView.swift */; }; EB704A822E4A7BB3008E608F /* DistributionDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB704A812E4A7BAE008E608F /* DistributionDetector.swift */; }; EB704A832E4B10D4008E608F /* DistributionDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB704A812E4A7BAE008E608F /* DistributionDetector.swift */; }; @@ -342,6 +345,7 @@ EB5C37E22E377C2E0052EFD7 /* QuickDropiOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QuickDropiOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; EB5C38382E38C1F60052EFD7 /* justMaybe.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = justMaybe.mp3; sourceTree = ""; }; EB5C383E2E38C49D0052EFD7 /* LaunchAtLogin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchAtLogin.swift; sourceTree = ""; }; + EB6E6B202ECBA95000E71D57 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; EB6F62D62D91F4AC00534EC2 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; EB704A812E4A7BAE008E608F /* DistributionDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DistributionDetector.swift; sourceTree = ""; }; EB721F232E75AFA900F2099F /* QuickDropIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = QuickDropIcon.icon; sourceTree = ""; }; @@ -493,6 +497,7 @@ EBC05C6B2E33B57100EECC18 /* Util */, EBC05C702E33B57D00EECC18 /* Plus */, 69DA9A1329E0BF5200A442DA /* Assets.xcassets */, + EB6E6B202ECBA95000E71D57 /* InfoPlist.xcstrings */, EB5C36922E34EBBD0052EFD7 /* Localizable.xcstrings */, 69DA9A1829E0BF5200A442DA /* QuickDrop.entitlements */, ); @@ -874,6 +879,7 @@ 699DEBA92AB0573200115D22 /* ShareViewController.xib in Resources */, EB96ED8D2D7F7EA3004B3FF1 /* Assets.xcassets in Resources */, EB5C383A2E38C1F60052EFD7 /* justMaybe.mp3 in Resources */, + EB6E6B212ECBA95000E71D57 /* InfoPlist.xcstrings in Resources */, EB950B5A2E52065A002D68FA /* timeIsNow.mp3 in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -888,6 +894,7 @@ EBC05C8C2E33B59E00EECC18 /* timeIsNow.mp3 in Resources */, EB721F252E75AFA900F2099F /* QuickDropIcon.icon in Resources */, EB5C38392E38C1F60052EFD7 /* justMaybe.mp3 in Resources */, + EB6E6B222ECBA95000E71D57 /* InfoPlist.xcstrings in Resources */, EB7654782E525ACC006B4AA3 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1011,6 +1018,7 @@ EB7F54122D78E96000989564 /* TutorialView.swift in Sources */, EB704A822E4A7BB3008E608F /* DistributionDetector.swift in Sources */, EB9925812E45D53E00357055 /* sharing_enums.pb.swift in Sources */, + EB6E6AB42ECBA46D00E71D57 /* PhotoManager.swift in Sources */, EB96ED8F2D7F8105004B3FF1 /* Localized.swift in Sources */, EB7CD1452D6FB0C300CB0CB5 /* Logger.swift in Sources */, EB16B77A2E59BAA1007D9792 /* AppGroup.swift in Sources */, @@ -1150,6 +1158,7 @@ 699DEBAF2AB0573200115D22 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + AUTOMATION_APPLE_EVENTS = NO; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -1158,9 +1167,15 @@ CURRENT_PROJECT_VERSION = "${SHARED_BUILD}"; DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; - ENABLE_HARDENED_RUNTIME = YES; + ENABLE_HARDENED_RUNTIME = NO; ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; ENABLE_USER_SELECTED_FILES = readonly; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShareExtension/Info.plist; @@ -1178,6 +1193,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; REGISTER_APP_GROUPS = YES; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) EXTENSION"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -1188,6 +1209,7 @@ 699DEBB02AB0573200115D22 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + AUTOMATION_APPLE_EVENTS = NO; CODE_SIGN_ENTITLEMENTS = ShareExtension/ShareExtension.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; @@ -1196,9 +1218,15 @@ CURRENT_PROJECT_VERSION = "${SHARED_BUILD}"; DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; - ENABLE_HARDENED_RUNTIME = YES; + ENABLE_HARDENED_RUNTIME = NO; ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; ENABLE_USER_SELECTED_FILES = readonly; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShareExtension/Info.plist; @@ -1216,6 +1244,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; REGISTER_APP_GROUPS = YES; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = EXTENSION; "SWIFT_ACTIVE_COMPILATION_CONDITIONS[arch=*]" = ""; @@ -1362,6 +1396,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = QuickDropIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + AUTOMATION_APPLE_EVENTS = NO; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = QuickDrop/QuickDrop.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -1372,18 +1407,28 @@ DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; - ENABLE_HARDENED_RUNTIME = YES; + ENABLE_HARDENED_RUNTIME = NO; ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = NO; ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = QuickDrop/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = QuickDrop; - INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_LSUIElement = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Leon Böttger"; INFOPLIST_KEY_NSMainNibFile = MainMenu; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "The add photos permission is required to save received photos and videos to your photo library."; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The photo library permission is required to save received photos and videos to your photo library."; INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1396,6 +1441,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; REGISTER_APP_GROUPS = YES; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1408,6 +1459,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = QuickDropIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + AUTOMATION_APPLE_EVENTS = NO; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = QuickDrop/QuickDrop.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -1418,18 +1470,28 @@ DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite; - ENABLE_HARDENED_RUNTIME = YES; + ENABLE_HARDENED_RUNTIME = NO; ENABLE_INCOMING_NETWORK_CONNECTIONS = YES; ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES; + ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO; + ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO; + ENABLE_RESOURCE_ACCESS_CALENDARS = NO; + ENABLE_RESOURCE_ACCESS_CAMERA = NO; + ENABLE_RESOURCE_ACCESS_CONTACTS = NO; + ENABLE_RESOURCE_ACCESS_LOCATION = NO; + ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO; + ENABLE_RESOURCE_ACCESS_PRINTING = NO; + ENABLE_RESOURCE_ACCESS_USB = NO; ENABLE_USER_SELECTED_FILES = readwrite; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = QuickDrop/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = QuickDrop; - INFOPLIST_KEY_ITSAppUsesNonExemptEncryption = NO; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_LSUIElement = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Leon Böttger"; INFOPLIST_KEY_NSMainNibFile = MainMenu; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "The add photos permission is required to save received photos and videos to your photo library."; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "The photo library permission is required to save received photos and videos to your photo library."; INFOPLIST_KEY_NSPrincipalClass = NSApplication; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -1442,6 +1504,12 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; REGISTER_APP_GROUPS = YES; + RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO; + RUNTIME_EXCEPTION_ALLOW_JIT = NO; + RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO; + RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO; + RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO; + RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; diff --git a/QuickDrop/InfoPlist.xcstrings b/QuickDrop/InfoPlist.xcstrings new file mode 100644 index 0000000..47763f3 --- /dev/null +++ b/QuickDrop/InfoPlist.xcstrings @@ -0,0 +1,1179 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "CFBundleDisplayName" : { + "comment" : "Bundle display name", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ca" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "cs" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "da" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "el" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "QuickDrop" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "he" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hu" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ms" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ro" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "sv" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "th" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + } + }, + "shouldTranslate" : false + }, + "CFBundleName" : { + "comment" : "Bundle name", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ca" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "cs" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "da" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "el" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "QuickDrop" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "he" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hu" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ms" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ro" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "sv" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "th" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + } + }, + "shouldTranslate" : false + }, + "NSHumanReadableCopyright" : { + "comment" : "Copyright (human-readable)", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ca" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "cs" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "da" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "el" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "he" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "hu" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ms" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ro" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "sv" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "th" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "" + } + } + }, + "shouldTranslate" : false + }, + "NSPhotoLibraryAddUsageDescription" : { + "comment" : "Privacy - Photo Library Additions Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "إذن الوصول إلى مكتبة الصور مطلوب لحفظ الصور والفيديوهات المستلمة في مكتبتك." + } + }, + "ca" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Es necessita permís a la biblioteca de fotos per desar les fotos i vídeos rebuts a la teva biblioteca." + } + }, + "cs" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Oprávnění k fotkám je potřeba pro ukládání přijatých fotek a videí do vaší knihovny." + } + }, + "da" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tilladelse til fotobibliotek er nødvendig for at gemme modtagne fotos og videoer i dit fotobibliotek." + } + }, + "de" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Die Berechtigung für die Fotomediathek wird benötigt, um empfangene Fotos und Videos in deiner Mediathek zu speichern." + } + }, + "el" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Η άδεια πρόσβασης στη βιβλιοθήκη φωτογραφιών απαιτείται για να αποθηκεύετε ληφθείσες φωτογραφίες και βίντεο στη βιβλιοθήκη σας." + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The add photos permission is required to save received photos and videos to your photo library." + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Permission to access your photo library is needed to save received photos and videos to your photo library." + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "es" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Se necesita permiso para la biblioteca de fotos para guardar las fotos y videos recibidos en tu galería." + } + }, + "es-419" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Se requiere el permiso para acceder a la fototeca para guardar las fotos y videos recibidos en tu biblioteca." + } + }, + "fi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Valokuvakirjaston käyttöoikeus tarvitaan, jotta vastaanotetut kuvat ja videot voidaan tallentaa kirjastoon." + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "L’accès à la photothèque est nécessaire pour enregistrer les photos et vidéos reçues dans votre photothèque." + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "L'autorisation d’accès à la photothèque est requise pour enregistrer les photos et vidéos reçues dans votre photothèque." + } + }, + "he" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "נדרש אישור לספריית התמונות כדי לשמור תמונות וסרטונים שהתקבלו בספריית התמונות שלך." + } + }, + "hi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "प्राप्त फ़ोटो और वीडियो को आपकी फोटो लाइब्रेरी में सहेजने के लिए फोटो लाइब्रेरी अनुमति आवश्यक है।" + } + }, + "hr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Dozvola za pristup galeriji potrebna je za spremanje primljenih fotografija i videozapisa u vašu galeriju." + } + }, + "hu" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "A fotókönyvtár engedélye szükséges a fogadott fotók és videók mentéséhez a fotókönyvtárba." + } + }, + "id" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Izin akses galeri foto diperlukan untuk menyimpan foto dan video yang diterima ke galeri Anda." + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Il permesso alla libreria foto è necessario per salvare le foto e i video ricevuti nella tua libreria." + } + }, + "ja" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "受信した写真や動画をフォトライブラリに保存するには、フォトライブラリの権限が必要です。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "수신한 사진과 동영상을 사진 보관함에 저장하려면 사진 보관함 권한이 필요합니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Kebenaran pustaka foto diperlukan untuk menyimpan foto dan video yang diterima ke pustaka foto anda." + } + }, + "nb" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Tillatelse til bildebibliotek kreves for å lagre mottatte bilder og videoer i bildebiblioteket ditt." + } + }, + "nl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Toestemming voor de fotobibliotheek is vereist om ontvangen foto’s en video’s op te slaan in je fotobibliotheek." + } + }, + "pl" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Uprawnienia do galerii zdjęć są wymagane, aby zapisywać odebrane zdjęcia i filmy w Twojej bibliotece." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "A permissão da biblioteca de fotos é necessária para salvar fotos e vídeos recebidos na sua galeria." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "A permissão para a fototeca é necessária para guardar as fotos e vídeos recebidos na sua fototeca." + } + }, + "ro" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Permisiunea pentru biblioteca foto este necesară pentru a salva fotografii și videoclipuri primite în biblioteca ta foto." + } + }, + "ru" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Для сохранения полученных фото и видео в фотогалерею требуется доступ к медиатеке." + } + }, + "sv" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Behörighet till bildbiblioteket krävs för att spara mottagna foton och videor till ditt bildbibliotek." + } + }, + "th" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "จำเป็นต้องขออนุญาตเข้าถึงคลังภาพเพื่อบันทึกรูปภาพและวิดีโอที่ได้รับไปยังคลังภาพของคุณ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Alınan fotoğraf ve videoları fotoğraf kütüphanenize kaydetmek için fotoğraf kütüphanesi izni gereklidir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Доступ до фототеки потрібен для збереження отриманих фото та відео у вашу фототеку." + } + }, + "vi" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "Quyền truy cập thư viện ảnh là cần thiết để lưu ảnh và video nhận được vào thư viện ảnh của bạn." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "需要相册权限以将接收到的照片和视频保存到您的相册。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "needs_review", + "value" : "需要相簿權限才能將接收到的照片和影片儲存至您的相簿。" + } + } + } + }, + "NSPhotoLibraryUsageDescription" : { + "comment" : "Privacy - Photo Library Usage Description", + "extractionState" : "extracted_with_value", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "إذن الوصول إلى مكتبة الصور مطلوب لحفظ الصور ومقاطع الفيديو المستلمة في مكتبة الصور الخاصة بك." + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es necessita el permís de la biblioteca de fotos per desar les fotos i vídeos rebuts a la teva biblioteca." + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oprávnění k fotoknihovně je nutné pro ukládání přijatých fotek a videí do vaší fotoknihovny." + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilladelse til foto­bibliotek er påkrævet for at gemme modtagne fotos og videoer i dit foto­bibliotek." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Die Berechtigung für die Fotomediathek ist erforderlich, um empfangene Fotos und Videos in deiner Mediathek zu speichern." + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Η άδεια πρόσβασης στη βιβλιοθήκη φωτογραφιών απαιτείται για να αποθηκεύετε τις ληφθείσες φωτογραφίες και βίντεο στη βιβλιοθήκη σας." + } + }, + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "The photo library permission is required to save received photos and videos to your photo library." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se requiere permiso para acceder a la fototeca y poder guardar fotos y videos recibidos." + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "El permiso para la biblioteca de fotos es necesario para guardar fotos y videos recibidos en tu biblioteca." + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kuvakirjaston lupa vaaditaan, jotta vastaanotetut kuvat ja videot voidaan tallentaa kuvakirjastoosi." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'autorisation d'accès à la photothèque est requise pour enregistrer les photos et vidéos reçues dans votre photothèque." + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "L’autorisation d’accéder à la photothèque est requise pour enregistrer les photos et vidéos reçues dans votre photothèque." + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "נדרש אישור לספריית התמונות כדי לשמור תמונות וסרטונים שהתקבלו בספריית התמונות שלך." + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "प्राप्त फ़ोटो और वीडियो को आपकी फोटो लाइब्रेरी में सहेजने के लिए फोटो लाइब्रेरी की अनुमति आवश्यक है।" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dozvola za pristup fototeci potrebna je za spremanje primljenih fotografija i videozapisa u vašu fototeku." + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "A fotókönyvtár engedélye szükséges az érkezett képek és videók mentéséhez a fotókönyvtárba." + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Izin akses perpustakaan foto diperlukan untuk menyimpan foto dan video yang diterima ke perpustakaan foto Anda." + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'autorizzazione alla libreria foto è necessaria per salvare foto e video ricevuti nella tua libreria." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "受信した写真や動画を写真ライブラリに保存するために、写真ライブラリへのアクセス許可が必要です。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "사진 및 동영상 저장을 위해 사진 라이브러리 접근 권한이 필요합니다." + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kebenaran perpustakaan foto diperlukan untuk menyimpan foto dan video yang diterima ke perpustakaan foto anda." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tillatelse til å bruke bildebiblioteket er nødvendig for å lagre mottatte bilder og videoer i bildebiblioteket ditt." + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toestemming voor de fotobibliotheek is vereist om ontvangen foto's en video's in je bibliotheek op te slaan." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uprawnienie do biblioteki zdjęć jest wymagane, aby zapisywać otrzymane zdjęcia i filmy w Twojej galerii." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "A permissão da biblioteca de fotos é necessária para salvar fotos e vídeos recebidos na sua galeria." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "A permissão para aceder à biblioteca de fotos é necessária para guardar fotos e vídeos recebidos na sua biblioteca." + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Permisiunea pentru biblioteca foto este necesară pentru a salva fotografiile și videoclipurile primite în biblioteca ta foto." + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Разрешение на доступ к фотобиблиотеке нужно для сохранения полученных фото и видео в вашу фотогалерею." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Behörighet till fotobiblioteket krävs för att spara mottagna bilder och videor i ditt fotobibliotek." + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "ต้องอนุญาตเข้าถึงคลังรูปภาพเพื่อบันทึกรูปภาพและวิดีโอที่ได้รับไปยังคลังรูปภาพของคุณ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Alınan fotoğraf ve videoları fotoğraf galerine kaydetmek için fotoğraf galerisi izni gereklidir." + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Дозвіл на доступ до фототеки необхідний для збереження отриманих фото та відео у вашу фототеку." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn cần cấp quyền truy cập thư viện ảnh để lưu ảnh và video nhận được vào thư viện ảnh của bạn." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要照片库权限才能将接收的照片和视频保存到您的照片库。" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "需要相簿權限才能將接收的照片和影片儲存到您的相簿。" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/QuickDrop/Localizable.xcstrings b/QuickDrop/Localizable.xcstrings index 18574d3..8f7bab3 100644 --- a/QuickDrop/Localizable.xcstrings +++ b/QuickDrop/Localizable.xcstrings @@ -16544,229 +16544,462 @@ "ar" : { "stringUnit" : { "state" : "translated", - "value" : "عرض الملفات" + "value" : "افتح في الملفات" } }, "ca" : { "stringUnit" : { "state" : "translated", - "value" : "Mostra fitxers" + "value" : "Obre a Fitxers" } }, "cs" : { "stringUnit" : { "state" : "translated", - "value" : "Zobrazit soubory" + "value" : "Otevřít ve Souborech" } }, "da" : { "stringUnit" : { "state" : "translated", - "value" : "Vis filer" + "value" : "Åbn i Filer" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Dateien anzeigen" + "value" : "In Dateien öffnen" } }, "el" : { "stringUnit" : { "state" : "translated", - "value" : "Εμφάνιση αρχείων" + "value" : "Άνοιγμα στα Αρχεία" } }, "en" : { "stringUnit" : { "state" : "translated", - "value" : "Show Files" + "value" : "Open in Files" } }, "en-AU" : { "stringUnit" : { "state" : "translated", - "value" : "Show Files" + "value" : "Open in Files" } }, "en-CA" : { "stringUnit" : { "state" : "translated", - "value" : "Show Files" + "value" : "Open in Files" } }, "en-GB" : { "stringUnit" : { "state" : "translated", - "value" : "Show Files" + "value" : "Open in Files" } }, "es" : { "stringUnit" : { "state" : "translated", - "value" : "Mostrar archivos" + "value" : "Abrir en Archivos" } }, "es-419" : { "stringUnit" : { "state" : "translated", - "value" : "Mostrar archivos" + "value" : "Abrir en Archivos" } }, "fi" : { "stringUnit" : { "state" : "translated", - "value" : "Näytä tiedostot" + "value" : "Avaa Tiedostoissa" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Afficher les fichiers" + "value" : "Ouvrir dans Fichiers" } }, "fr-CA" : { "stringUnit" : { "state" : "translated", - "value" : "Afficher les fichiers" + "value" : "Ouvrir dans Fichiers" } }, "he" : { "stringUnit" : { "state" : "translated", - "value" : "הצג קבצים" + "value" : "פתח בקבצים" } }, "hi" : { "stringUnit" : { "state" : "translated", - "value" : "फ़ाइलें दिखाएं" + "value" : "Files में खोलें" } }, "hr" : { "stringUnit" : { "state" : "translated", - "value" : "Prikaži datoteke" + "value" : "Otvori u Datotekama" } }, "hu" : { "stringUnit" : { "state" : "translated", - "value" : "Fájlok megjelenítése" + "value" : "Megnyitás a Fájlokban" } }, "id" : { "stringUnit" : { "state" : "translated", - "value" : "Tampilkan File" + "value" : "Buka di File" } }, "it" : { "stringUnit" : { "state" : "translated", - "value" : "Mostra file" + "value" : "Apri in File" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ファイルを表示" + "value" : "ファイルで開く" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "파일 보기" + "value" : "파일에서 열기" } }, "ms" : { "stringUnit" : { "state" : "translated", - "value" : "Tunjuk Fail" + "value" : "Buka dalam Fail" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Vis filer" + "value" : "Åpne i Filer" } }, "nl" : { "stringUnit" : { "state" : "translated", - "value" : "Bestanden tonen" + "value" : "Openen in Bestanden" } }, "pl" : { "stringUnit" : { "state" : "translated", - "value" : "Pokaż pliki" + "value" : "Otwórz w Plikach" } }, "pt-BR" : { "stringUnit" : { "state" : "translated", - "value" : "Mostrar Arquivos" + "value" : "Abrir no Arquivos" } }, "pt-PT" : { "stringUnit" : { "state" : "translated", - "value" : "Mostrar Ficheiros" + "value" : "Abrir em Ficheiros" } }, "ro" : { "stringUnit" : { "state" : "translated", - "value" : "Afișează fișierele" + "value" : "Deschide în Fișiere" } }, "ru" : { "stringUnit" : { "state" : "translated", - "value" : "Показать файлы" + "value" : "Открыть в Файлах" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Visa filer" + "value" : "Öppna i Filer" } }, "th" : { "stringUnit" : { "state" : "translated", - "value" : "แสดงไฟล์" + "value" : "เปิดในไฟล์" } }, "tr" : { "stringUnit" : { "state" : "translated", - "value" : "Dosyaları Göster" + "value" : "Dosyalarda Aç" } }, "uk" : { "stringUnit" : { "state" : "translated", - "value" : "Показати файли" + "value" : "Відкрити у Файлах" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Hiển thị Tệp" + "value" : "Mở trong Tệp" } }, "zh-Hans" : { "stringUnit" : { "state" : "translated", - "value" : "显示文件" + "value" : "在文件中打开" } }, "zh-Hant" : { "stringUnit" : { "state" : "translated", - "value" : "顯示檔案" + "value" : "在檔案中開啟" + } + } + } + }, + "OpenInFinder" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "translated", + "value" : "افتح في Finder" + } + }, + "ca" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obre al Finder" + } + }, + "cs" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otevřít ve Finderu" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åbn i Finder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Im Finder öffnen" + } + }, + "el" : { + "stringUnit" : { + "state" : "translated", + "value" : "Άνοιγμα στο Finder" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open in Finder" + } + }, + "en-AU" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open in Finder" + } + }, + "en-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open in Finder" + } + }, + "en-GB" : { + "stringUnit" : { + "state" : "translated", + "value" : "Open in Finder" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir en Finder" + } + }, + "es-419" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir en Finder" + } + }, + "fi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avaa Finderissa" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir dans le Finder" + } + }, + "fr-CA" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir dans le Finder" + } + }, + "he" : { + "stringUnit" : { + "state" : "translated", + "value" : "פתח ב-Finder" + } + }, + "hi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finder में खोलें" + } + }, + "hr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvori u Finderu" + } + }, + "hu" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megnyitás Finderben" + } + }, + "id" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buka di Finder" + } + }, + "it" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apri in Finder" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finderで開く" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finder에서 열기" + } + }, + "ms" : { + "stringUnit" : { + "state" : "translated", + "value" : "Buka dalam Finder" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åpne i Finder" + } + }, + "nl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Openen in Finder" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otwórz w Finderze" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir no Finder" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "translated", + "value" : "Abrir no Finder" + } + }, + "ro" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deschide în Finder" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Открыть в Finder" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öppna i Finder" + } + }, + "th" : { + "stringUnit" : { + "state" : "translated", + "value" : "เปิดใน Finder" + } + }, + "tr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finder'da Aç" + } + }, + "uk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Відкрити у Finder" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mở trong Finder" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "在访达中打开" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "translated", + "value" : "在 Finder 中開啟" } } } @@ -21431,231 +21664,687 @@ "extractionState" : "manual", "localizations" : { "ar" : { - "stringUnit" : { - "state" : "translated", - "value" : "لقد منعت تطبيق QuickDrop من حفظ المحتوى في معرض الصور الخاص بك. لتغيير ذلك، افتح تطبيق الإعدادات، وابحث عن \"QuickDrop\"، وغيّر إعداد \"الصور\" إلى \"إضافة الصور فقط\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "لقد منعت QuickDrop من حفظ المحتوى في معرض الصور لديك. لتغيير ذلك، افتح إعدادات النظام ثم انتقل إلى \"الخصوصية والأمان\" > \"الصور\"، وفعّل خيار QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "لقد منعت QuickDrop من حفظ المحتوى في معرض الصور لديك. لتغيير ذلك، افتح تطبيق الإعدادات، وابحث عن \"QuickDrop\"، ثم غيّر إعداد \"الصور\" إلى \"إضافة الصور فقط\"." + } + } + } } }, "ca" : { - "stringUnit" : { - "state" : "translated", - "value" : "Has denegat a QuickDrop l'accés per desar contingut a la galeria. Per canviar-ho, obre l'app Configuració, busca \"QuickDrop\" i canvia l'opció \"Fotos\" a \"Només afegir fotos\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Has denegat a QuickDrop l'accés per desar contingut a la teva galeria. Per canviar-ho, obre la configuració del sistema, ves a «Privacitat i seguretat» > «Fotos» i activa l'opció per a QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Has denegat a QuickDrop l'accés per desar contingut a la teva galeria. Per canviar-ho, obre l'app de configuració, busca \"QuickDrop\" i canvia l'opció «Fotos» a «Només afegir fotos»." + } + } + } } }, "cs" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odepřeli jste aplikaci QuickDrop přístup k ukládání obsahu do vaší galerie. Chcete-li to změnit, otevřete aplikaci Nastavení, vyhledejte \"QuickDrop\" a změňte nastavení \"Fotky\" na \"Přidávat pouze fotky\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odepřeli jste aplikaci QuickDrop přístup k ukládání obsahu do vaší galerie. Chcete-li to změnit, otevřete Systémová nastavení, přejděte na „Soukromí a zabezpečení“ > „Fotky“ a povolte přepínač pro QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odepřeli jste aplikaci QuickDrop přístup k ukládání obsahu do vaší galerie. Chcete-li to změnit, otevřete aplikaci Nastavení, vyhledejte „QuickDrop“ a nastavte možnost „Fotky“ na „Přidat pouze fotky“." + } + } + } } }, "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du har nægtet QuickDrop adgang til at gemme indhold i dit galleri. For at ændre dette, åbn appen Indstillinger, søg efter \"QuickDrop\", og skift indstillingen \"Fotos\" til \"Tilføj kun fotos\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du har nægtet QuickDrop adgang til at gemme indhold i dit galleri. For at ændre dette skal du åbne Systemindstillinger, gå til \"Privatliv & sikkerhed\" > \"Billeder\", og aktivere QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du har nægtet QuickDrop adgang til at gemme indhold i dit galleri. For at ændre dette skal du åbne Indstillinger, søge efter \"QuickDrop\" og sætte \"Billeder\" til \"Kun tilføj billeder\"." + } + } + } } }, "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du hast QuickDrop den Zugriff verweigert, Inhalte in deiner Galerie zu speichern. Um dies zu ändern, öffne die Einstellungen, suche nach „QuickDrop“ und setze die Einstellung „Fotos“ auf „Nur Fotos hinzufügen“." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du hast QuickDrop den Zugriff zum Speichern von Inhalten in deiner Galerie verweigert. Um das zu ändern, öffne die Systemeinstellungen, gehe zu „Datenschutz & Sicherheit“ > „Fotos“ und aktiviere den Schalter für QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du hast QuickDrop den Zugriff zum Speichern von Inhalten in deiner Galerie verweigert. Um das zu ändern, öffne die Einstellungen, suche nach „QuickDrop“ und setze die Option „Fotos“ auf „Nur Fotos hinzufügen“." + } + } + } } }, "el" : { - "stringUnit" : { - "state" : "translated", - "value" : "Αρνηθήκατε στην εφαρμογή QuickDrop πρόσβαση για αποθήκευση περιεχομένου στη συλλογή σας. Για να το αλλάξετε, ανοίξτε την εφαρμογή Ρυθμίσεις, βρείτε το \"QuickDrop\" και αλλάξτε τη ρύθμιση \"Φωτογραφίες\" σε \"Μόνο προσθήκη φωτογραφιών\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αρνηθήκατε στην QuickDrop την πρόσβαση για αποθήκευση περιεχομένου στη συλλογή σας. Για να το αλλάξετε, ανοίξτε τις Ρυθμίσεις συστήματος, πηγαίνετε στο \"Απόρρητο & Ασφάλεια\" > \"Φωτογραφίες\" και ενεργοποιήστε τον διακόπτη για το QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Αρνηθήκατε στην QuickDrop την πρόσβαση για αποθήκευση περιεχομένου στη συλλογή σας. Για να το αλλάξετε, ανοίξτε την εφαρμογή Ρυθμίσεις, αναζητήστε \"QuickDrop\" και αλλάξτε την επιλογή \"Φωτογραφίες\" σε \"Μόνο προσθήκη φωτογραφιών\"." + } + } + } } }, "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the System Settings app, go to \"Privacy & Security\" > \"Photos\", and enable the toggle for QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + } + } + } } }, "en-AU" : { - "stringUnit" : { - "state" : "translated", - "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the System Settings app, go to \"Privacy & Security\" > \"Photos\", and enable the toggle for QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + } + } + } } }, "en-CA" : { - "stringUnit" : { - "state" : "translated", - "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop,\" and change the setting \"Photos\" to \"Add Photos Only.\"" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the System Settings app, go to \"Privacy & Security\" > \"Photos\", and enable the toggle for QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + } + } + } } }, "en-GB" : { - "stringUnit" : { - "state" : "translated", - "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the System Settings app, go to \"Privacy & Security\" > \"Photos\", and enable the toggle for QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "You denied QuickDrop access to save content to your gallery. To change this, open the Settings app, search for \"QuickDrop\", and change the setting \"Photos\" to \"Add Photos Only\"." + } + } + } } }, "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Denegaste a QuickDrop el acceso para guardar contenido en tu galería. Para cambiarlo, abre la app de Configuración, busca \"QuickDrop\" y cambia el ajuste de \"Fotos\" a \"Solo añadir fotos\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Has denegado a QuickDrop el acceso para guardar contenido en tu galería. Para cambiar esto, abre la app de Configuración del Sistema, ve a \"Privacidad y seguridad\" > \"Fotos\" y activa la opción para QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Has denegado a QuickDrop el acceso para guardar contenido en tu galería. Para cambiar esto, abre la app Configuración, busca \"QuickDrop\" y cambia el ajuste \"Fotos\" a \"Solo añadir fotos\"." + } + } + } } }, "es-419" : { - "stringUnit" : { - "state" : "translated", - "value" : "Denegaste el acceso de QuickDrop para guardar contenido en tu galería. Para cambiar esto, abre la app de Configuración, busca \"QuickDrop\" y cambia la opción de \"Fotos\" a \"Solo agregar fotos\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denegaste a QuickDrop el acceso para guardar contenido en tu galería. Para cambiar esto, abre la app de Configuración del Sistema, ve a \"Privacidad y Seguridad\" > \"Fotos\" y activa QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Denegaste a QuickDrop el acceso para guardar contenido en tu galería. Para cambiar esto, abre la app de Configuración, busca \"QuickDrop\" y cambia la opción \"Fotos\" a \"Solo añadir fotos\"." + } + } + } } }, "fi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kieltäydyit antamasta QuickDropille lupaa tallentaa sisältöä galleriaasi. Muuttaaksesi tätä, avaa Asetukset-sovellus, etsi \"QuickDrop\" ja muuta \"Kuvat\"-asetukseksi \"Lisää vain kuvia\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estät QuickDropin tallentamasta sisältöä galleriaasi. Voit muuttaa tämän avaamalla Järjestelmäasetukset > \"Tietosuoja ja turvallisuus\" > \"Kuvat\" ja ottamalla QuickDropin käyttöön." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Estät QuickDropin tallentamasta sisältöä galleriaasi. Voit muuttaa tämän avaamalla Asetukset, hakemalla \"QuickDrop\" ja muuttamalla \"Kuvat\"-asetuksen muotoon \"Lisää vain kuvia\"." + } + } + } } }, "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous avez refusé à QuickDrop l'accès pour enregistrer du contenu dans votre galerie. Pour changer cela, ouvrez l'application Réglages, cherchez « QuickDrop », puis changez l'option « Photos » en « Ajouter des photos uniquement »." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez refusé à QuickDrop l'accès pour enregistrer du contenu dans votre galerie. Pour modifier cela, ouvrez l'app Réglages système, allez dans « Confidentialité et sécurité » > « Photos », et activez le bouton pour QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez refusé à QuickDrop l'accès pour enregistrer du contenu dans votre galerie. Pour modifier cela, ouvrez l'app Réglages, recherchez « QuickDrop », puis changez le réglage « Photos » en « Ajouter des photos uniquement »." + } + } + } } }, "fr-CA" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous avez refusé à QuickDrop l'accès pour enregistrer du contenu dans votre galerie. Pour modifier cela, ouvrez l'application Réglages, cherchez « QuickDrop », puis changez l'option « Photos » à « Ajouter des photos seulement »." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez refusé à QuickDrop l'accès pour sauvegarder du contenu dans votre galerie. Pour modifier cela, ouvrez l’app Réglages système, allez à « Confidentialité et sécurité » > « Photos » et activez QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez refusé à QuickDrop l'accès pour sauvegarder du contenu dans votre galerie. Pour changer cela, ouvrez l’application Réglages, cherchez « QuickDrop », puis changez le réglage « Photos » à « Ajouter des photos uniquement »." + } + } + } } }, "he" : { - "stringUnit" : { - "state" : "translated", - "value" : "סירבת לאפליקציית QuickDrop גישה לשמירת תוכן בגלריה שלך. כדי לשנות זאת, פתח את אפליקציית ההגדרות, חפש \"QuickDrop\", ושנה את ההגדרה \"תמונות\" ל-\"הוספת תמונות בלבד\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "סירבת ל-QuickDrop גישה לשמירת תוכן לגלריה שלך. כדי לשנות זאת, פתח את אפליקציית הגדרות המערכת, עבור ל\"פרטיות ואבטחה\" > \"תמונות\", והפעל את האפשרות עבור QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "סירבת ל-QuickDrop גישה לשמירת תוכן לגלריה שלך. כדי לשנות זאת, פתח את אפליקציית ההגדרות, חפש \"QuickDrop\" ושנה את ההגדרה \"תמונות\" ל\"הוספת תמונות בלבד\"." + } + } + } } }, "hi" : { - "stringUnit" : { - "state" : "translated", - "value" : "आपने QuickDrop को अपनी गैलरी में सामग्री सुरक्षित करने की अनुमति नहीं दी है। इसे बदलने के लिए, सेटिंग्स ऐप खोलें, \"QuickDrop\" सर्च करें, और \"Photos\" सेटिंग को \"Add Photos Only\" पर बदलें।" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "आपने QuickDrop को अपनी गैलरी में सामग्री सहेजने की अनुमति नहीं दी। इसे बदलने के लिए, सिस्टम सेटिंग्स ऐप खोलें, \"प्राइवेसी और सुरक्षा\" > \"फोटो\" में जाएँ, और QuickDrop के लिए टॉगल चालू करें।" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "आपने QuickDrop को अपनी गैलरी में सामग्री सहेजने की अनुमति नहीं दी। इसे बदलने के लिए, सेटिंग्स ऐप खोलें, \"QuickDrop\" खोजें और \"Photos\" सेटिंग को \"Add Photos Only\" पर बदलें।" + } + } + } } }, "hr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odbili ste dopuštenje QuickDropu za spremanje sadržaja u vašu galeriju. Da to promijenite, otvorite aplikaciju Postavke, potražite \"QuickDrop\" i postavite opciju \"Fotografije\" na \"Samo dodaj fotografije\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odbili ste QuickDropu pristup za spremanje sadržaja u vašu galeriju. Da biste to promijenili, otvorite Sustavne postavke, idite na \"Privatnost i sigurnost\" > \"Fotografije\" i omogućite QuickDropu pristup." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odbili ste QuickDropu pristup za spremanje sadržaja u vašu galeriju. Da biste to promijenili, otvorite aplikaciju Postavke, potražite \"QuickDrop\" i postavite opciju \"Fotografije\" na \"Samo dodavanje fotografija\"." + } + } + } } }, "hu" : { - "stringUnit" : { - "state" : "translated", - "value" : "Megtagadtad a QuickDrop számára a galéria elérését. A módosításhoz nyisd meg a Beállítások alkalmazást, keresd meg a „QuickDrop”-ot, majd a „Fotók” beállítást állítsd „Csak fotók hozzáadása” lehetőségre." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megtagadtad a QuickDrop számára a hozzáférést a galériádhoz való tartalom mentéséhez. Ehhez nyisd meg a Rendszerbeállítások alkalmazást, menj a „Adatvédelem és biztonság” > „Fotók” részhez, és engedélyezd a QuickDrop lehetőséget." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Megtagadtad a QuickDrop számára a hozzáférést a galériádhoz való tartalom mentéséhez. Ehhez nyisd meg a Beállítások alkalmazást, keresd meg a „QuickDrop”-ot, és állítsd a „Fotók” beállítást „Csak fotók hozzáadása” értékre." + } + } + } } }, "id" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anda menolak izin QuickDrop untuk menyimpan konten ke galeri Anda. Untuk mengubahnya, buka aplikasi Pengaturan, cari \"QuickDrop\", dan ubah pengaturan \"Foto\" menjadi \"Hanya Tambah Foto\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anda menolak izin QuickDrop untuk menyimpan konten ke galeri Anda. Untuk mengubahnya, buka aplikasi Pengaturan Sistem, masuk ke \"Privasi & Keamanan\" > \"Foto\", lalu aktifkan sakelar untuk QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anda menolak izin QuickDrop untuk menyimpan konten ke galeri Anda. Untuk mengubahnya, buka aplikasi Pengaturan, cari \"QuickDrop\", lalu ubah pengaturan \"Foto\" ke \"Hanya Tambahkan Foto\"." + } + } + } } }, "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hai negato a QuickDrop l'accesso per salvare contenuti nella tua galleria. Per modificare questa impostazione, apri l'app Impostazioni, cerca \"QuickDrop\" e cambia l'impostazione \"Foto\" su \"Solo aggiunta di foto\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hai negato a QuickDrop l'accesso per salvare contenuti nella tua galleria. Per modificare questa impostazione, apri l'app Impostazioni di Sistema, vai su \"Privacy e Sicurezza\" > \"Foto\" e attiva l'opzione per QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hai negato a QuickDrop l'accesso per salvare contenuti nella tua galleria. Per modificare questa impostazione, apri l'app Impostazioni, cerca \"QuickDrop\" e imposta \"Foto\" su \"Solo aggiungi foto\"." + } + } + } } }, "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "QuickDropがギャラリーにコンテンツを保存するアクセス権を拒否しました。これを変更するには、設定アプリを開き、「QuickDrop」を検索し、「写真」の設定を「写真の追加のみに許可」に変更してください。" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDropがギャラリーへの保存アクセスを拒否されました。変更するには、「システム設定」アプリを開き、「プライバシーとセキュリティ」>「写真」に進み、QuickDropの切り替えをオンにしてください。" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDropがギャラリーへの保存アクセスを拒否されました。変更するには、「設定」アプリを開き、「QuickDrop」で検索し、「写真」の設定を「写真の追加のみ」に変更してください。" + } + } + } } }, "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "QuickDrop이 갤러리에 콘텐츠를 저장하는 접근 권한이 거부되었습니다. 이를 변경하려면 설정 앱을 열고 \"QuickDrop\"을 검색한 후 \"사진\" 설정을 \"사진 추가만 허용\"으로 변경하세요." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDrop이(가) 갤러리에 콘텐츠를 저장하는 권한이 거부되었습니다. 이를 변경하려면 시스템 설정 앱을 열고 \"개인 정보 보호 및 보안\" > \"사진\"으로 이동하여 QuickDrop의 토글을 활성화하세요." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDrop이(가) 갤러리에 콘텐츠를 저장하는 권한이 거부되었습니다. 이를 변경하려면 설정 앱을 열고, \"QuickDrop\"을 검색한 후 \"사진\" 설정을 \"사진만 추가\"로 변경하세요." + } + } + } } }, "ms" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anda telah menolak akses QuickDrop untuk menyimpan kandungan ke galeri anda. Untuk mengubah ini, buka aplikasi Tetapan, cari \"QuickDrop\", dan tukar tetapan \"Foto\" kepada \"Tambah Foto Sahaja\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anda telah menolak akses QuickDrop untuk menyimpan kandungan ke galeri anda. Untuk menukar ini, buka aplikasi Tetapan Sistem, pergi ke \"Privasi & Keselamatan\" > \"Foto\", dan aktifkan togol untuk QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anda telah menolak akses QuickDrop untuk menyimpan kandungan ke galeri anda. Untuk menukar ini, buka aplikasi Tetapan, cari \"QuickDrop\", dan tukar tetapan \"Foto\" kepada \"Tambah Foto Sahaja\"." + } + } + } } }, "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du har nektet QuickDrop tilgang til å lagre innhold i galleriet. For å endre dette, åpne Innstillinger-appen, søk etter \"QuickDrop\", og endre innstillingen \"Bilder\" til \"Legg til bilder kun\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du nektet QuickDrop tilgang til å lagre innhold i galleriet ditt. For å endre dette, åpne Systeminnstillinger, gå til «Personvern og sikkerhet» > «Bilder», og aktiver bryteren for QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du nektet QuickDrop tilgang til å lagre innhold i galleriet ditt. For å endre dette, åpne Innstillinger-appen, søk etter «QuickDrop» og endre innstillingen «Bilder» til «Kun legg til bilder»." + } + } + } } }, "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Je hebt QuickDrop geen toegang gegeven om inhoud in je galerij op te slaan. Open de app Instellingen, zoek naar \"QuickDrop\" en wijzig de instelling \"Foto's\" naar \"Alleen foto's toevoegen\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Je hebt QuickDrop geen toegang gegeven om inhoud in je galerij op te slaan. Om dit te wijzigen, open je de app Systeeminstellingen, ga naar \"Privacy & Beveiliging\" > \"Foto’s\" en zet de schakelaar voor QuickDrop aan." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Je hebt QuickDrop geen toegang gegeven om inhoud in je galerij op te slaan. Om dit te wijzigen, open de app Instellingen, zoek naar \"QuickDrop\" en wijzig de instelling \"Foto's\" in \"Alleen foto’s toevoegen\"." + } + } + } } }, "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odmówiłeś aplikacji QuickDrop dostępu do zapisywania zawartości w galerii. Aby to zmienić, otwórz aplikację Ustawienia, wyszukaj \"QuickDrop\" i ustaw opcję \"Zdjęcia\" na \"Dodaj tylko zdjęcia\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odmówiłeś aplikacji QuickDrop dostępu do zapisywania treści w galerii. Aby to zmienić, otwórz aplikację Ustawienia systemowe, przejdź do \"Prywatność i bezpieczeństwo\" > \"Zdjęcia\" i włącz przełącznik dla QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odmówiłeś aplikacji QuickDrop dostępu do zapisywania treści w galerii. Aby to zmienić, otwórz aplikację Ustawienia, wyszukaj \"QuickDrop\" i zmień ustawienie \"Zdjęcia\" na \"Dodaj tylko zdjęcia\"." + } + } + } } }, "pt-BR" : { - "stringUnit" : { - "state" : "translated", - "value" : "Você negou ao QuickDrop acesso para salvar conteúdo na sua galeria. Para alterar isso, abra o app Ajustes, procure por \"QuickDrop\" e altere a configuração \"Fotos\" para \"Adicionar Fotos Apenas\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você negou o acesso do QuickDrop para salvar conteúdo na sua galeria. Para mudar isso, abra o app Ajustes do Sistema, vá em \"Privacidade e Segurança\" > \"Fotos\" e ative a opção para o QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Você negou o acesso do QuickDrop para salvar conteúdo na sua galeria. Para mudar isso, abra o app Ajustes, pesquise por \"QuickDrop\" e altere a configuração \"Fotos\" para \"Apenas adicionar fotos\"." + } + } + } } }, "pt-PT" : { - "stringUnit" : { - "state" : "translated", - "value" : "Negaste ao QuickDrop o acesso para guardar conteúdos na tua galeria. Para alterar isto, abre a aplicação Definições, procura por \"QuickDrop\" e muda a definição \"Fotografias\" para \"Apenas Adicionar Fotografias\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Negaste ao QuickDrop o acesso para guardar conteúdo na tua galeria. Para alterar isto, abre a aplicação Definições do Sistema, vai a \"Privacidade e Segurança\" > \"Fotografias\" e ativa o QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Negaste ao QuickDrop o acesso para guardar conteúdo na tua galeria. Para alterar isto, abre a aplicação Definições, procura \"QuickDrop\" e altera a definição \"Fotografias\" para \"Apenas Adicionar Fotografias\"." + } + } + } } }, "ro" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ai refuzat accesul QuickDrop pentru a salva conținut în galerie. Pentru a schimba acest lucru, deschide aplicația Configurări, caută „QuickDrop” și setează „Fotografii” pe „Doar adăugare fotografii”." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ați refuzat accesul QuickDrop pentru a salva conținut în galerie. Pentru a schimba acest lucru, deschideți aplicația Configurări sistem, accesați „Confidențialitate și securitate” > „Fotografii” și activați opțiunea pentru QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ați refuzat accesul QuickDrop pentru a salva conținut în galerie. Pentru a schimba acest lucru, deschideți aplicația Setări, căutați „QuickDrop” și schimbați setarea „Fotografii” pe „Doar adăugare fotografii” ." + } + } + } } }, "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Вы запретили QuickDrop сохранять контент в вашу галерею. Чтобы изменить это, откройте приложение \"Настройки\", найдите \"QuickDrop\" и измените настройку \"Фото\" на \"Только добавление\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы запретили QuickDrop сохранять файлы в галерею. Чтобы изменить это, откройте Системные настройки, перейдите в «Конфиденциальность и безопасность» > «Фото» и включите переключатель для QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Вы запретили QuickDrop сохранять файлы в галерею. Чтобы изменить это, откройте настройки, найдите «QuickDrop» и установите для параметра «Фото» значение «Добавлять только фото»." + } + } + } } }, "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Du har nekat QuickDrop åtkomst att spara innehåll i ditt galleri. För att ändra detta, öppna appen Inställningar, sök efter \"QuickDrop\" och ändra inställningen \"Bilder\" till \"Lägg till endast\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du har nekat QuickDrop åtkomst att spara innehåll i ditt galleri. För att ändra detta, öppna Systeminställningar, gå till \"Integritet & säkerhet\" > \"Foton\" och aktivera QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Du har nekat QuickDrop åtkomst att spara innehåll i ditt galleri. För att ändra detta, öppna appen Inställningar, sök efter \"QuickDrop\" och ändra inställningen \"Foton\" till \"Lägg bara till foton\"." + } + } + } } }, "th" : { - "stringUnit" : { - "state" : "translated", - "value" : "คุณได้ปฏิเสธการเข้าถึงแกลเลอรี่ของ QuickDrop ในการเปลี่ยนแปลง ให้เปิดแอปการตั้งค่า ค้นหา \"QuickDrop\" และเปลี่ยนการตั้งค่า \"รูปภาพ\" เป็น \"เพิ่มรูปภาพเท่านั้น\"" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "คุณได้ปฏิเสธไม่ให้ QuickDrop บันทึกไฟล์ลงในคลังรูปภาพ หากต้องการเปลี่ยนแปลง ให้เปิดแอปการตั้งค่าระบบ ไปที่ \"ความเป็นส่วนตัวและความปลอดภัย\" > \"รูปภาพ\" และเปิดสวิตช์สำหรับ QuickDrop" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "คุณได้ปฏิเสธไม่ให้ QuickDrop บันทึกไฟล์ลงในคลังรูปภาพ หากต้องการเปลี่ยนแปลง ให้เปิดแอปการตั้งค่า ค้นหา \"QuickDrop\" แล้วเปลี่ยนการตั้งค่า \"รูปภาพ\" เป็น \"อนุญาตเฉพาะการเพิ่มรูปภาพ\"" + } + } + } } }, "tr" : { - "stringUnit" : { - "state" : "translated", - "value" : "QuickDrop'un galerinize içerik kaydetme iznini reddettiniz. Bunu değiştirmek için Ayarlar uygulamasını açın, \"QuickDrop\"u arayın ve \"Fotoğraflar\" ayarını \"Yalnızca Fotoğraf Ekle\" olarak değiştirin." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDrop'un galerine içerik kaydetme erişimini reddettin. Bunu değiştirmek için Sistem Ayarları uygulamasını aç, \"Gizlilik ve Güvenlik\" > \"Fotoğraflar\" bölümüne git ve QuickDrop için seçeneği etkinleştir." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "QuickDrop'un galerine içerik kaydetme erişimini reddettin. Bunu değiştirmek için Ayarlar uygulamasını aç, \"QuickDrop\"u ara ve \"Fotoğraflar\" ayarını \"Sadece Fotoğraf Ekle\" olarak değiştir." + } + } + } } }, "uk" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ви заборонили QuickDrop зберігати контент у вашу галерею. Щоб змінити це, відкрийте додаток Налаштування, знайдіть \"QuickDrop\" і змініть опцію \"Фото\" на \"Додавати лише фото\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ви заборонили QuickDrop зберігати контент у вашій галереї. Щоб змінити це, відкрийте Системні налаштування, перейдіть у \"Конфіденційність і безпека\" > \"Фото\" та увімкніть перемикач для QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ви заборонили QuickDrop зберігати контент у вашій галереї. Щоб змінити це, відкрийте додаток Налаштування, знайдіть \"QuickDrop\" і змініть параметр \"Фото\" на \"Додавати тільки фото\"." + } + } + } } }, "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạn đã từ chối quyền cho QuickDrop lưu nội dung vào thư viện của mình. Để thay đổi, hãy mở ứng dụng Cài đặt, tìm \"QuickDrop\" và chuyển tùy chọn \"Ảnh\" thành \"Chỉ thêm ảnh\"." + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn đã từ chối cho QuickDrop quyền lưu nội dung vào thư viện của mình. Để thay đổi điều này, hãy mở ứng dụng Cài đặt Hệ thống, vào \"Quyền riêng tư & Bảo mật\" > \"Ảnh\", và bật công tắc cho QuickDrop." + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn đã từ chối cho QuickDrop quyền lưu nội dung vào thư viện của mình. Để thay đổi, hãy mở ứng dụng Cài đặt, tìm \"QuickDrop\" và đổi mục \"Ảnh\" thành \"Chỉ Thêm Ảnh\"." + } + } + } } }, "zh-Hans" : { - "stringUnit" : { - "state" : "translated", - "value" : "你已拒绝QuickDrop保存内容到图库的权限。要更改此设置,请打开“设置”应用,搜索“QuickDrop”,并将“照片”权限设置为“仅添加照片”。" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "你已拒绝QuickDrop保存内容到图库的权限。要更改此设置,请打开系统设置,前往“隐私与安全” > “照片”,并为QuickDrop开启开关。" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "你已拒绝QuickDrop保存内容到图库的权限。要更改此设置,请打开设置,搜索“QuickDrop”,并将“照片”权限更改为“仅添加照片”。" + } + } + } } }, "zh-Hant" : { - "stringUnit" : { - "state" : "translated", - "value" : "你已拒絕QuickDrop存取相簿的權限。若要更改,請開啟「設定」App,搜尋「QuickDrop」,然後將「相片」權限設為「僅加入相片」。" + "variations" : { + "device" : { + "mac" : { + "stringUnit" : { + "state" : "translated", + "value" : "你已拒絕 QuickDrop 儲存內容到你的相簿。要更改此設定,請打開「系統設定」App,前往「隱私權與安全性」>「照片」,然後啟用 QuickDrop 的權限。" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "你已拒絕 QuickDrop 儲存內容到你的相簿。如需更改,請打開「設定」App,搜尋「QuickDrop」,將「照片」權限設定為「僅新增照片」。" + } + } + } } } } diff --git a/QuickDrop/View/QuickDropToastView.swift b/QuickDrop/View/QuickDropToastView.swift index c9497e6..ddb0be0 100644 --- a/QuickDrop/View/QuickDropToastView.swift +++ b/QuickDrop/View/QuickDropToastView.swift @@ -8,21 +8,29 @@ import SwiftUI import AppKit - let toastViewSize = CGSize(width: 400, height: 100) struct QuickDropToastView: View { @ObservedObject var settings = Settings.shared @ObservedObject var receiveModel: ReceiveModel - public var onCancel: () -> Void = {} + + @State var autoHider: DispatchWorkItem? = nil - init(receiveModel: ReceiveModel, - onCancel: @escaping () -> Void = {}) { + /// Cancel while receiving. + public var onCancel: () -> Void + + init( + receiveModel: ReceiveModel, + onCancel: @escaping () -> Void = {} + ) { self.receiveModel = receiveModel self.onCancel = onCancel } public var body: some View { + + let isDone = receiveModel.toastActions != nil + VStack(spacing: 12) { HStack(spacing: 12) { ZStack(alignment: .bottomLeading) { @@ -36,7 +44,8 @@ struct QuickDropToastView: View { VStack(alignment: .leading, spacing: 2) { Text(String("QuickDrop")) .font(.system(size: 16, weight: .semibold)) - Text("Receiving") + + Text(isDone ? "FileTransferCompleted" : "Receiving") .font(.system(size: 13)) .foregroundColor(.secondary) .lineLimit(1) @@ -46,17 +55,54 @@ struct QuickDropToastView: View { Spacer(minLength: 12) } - HStack() { - - CapsuleProgress(value: receiveModel.progress ?? 1.0) + ZStack { + if let actions = receiveModel.toastActions { + HStack(spacing: 8) { + + QuickDropToastViewButton(title: "OpenInFinder") { + actions.openFilesAction() + actions.closeToastAction() + } - Button(action: onCancel) { - Image(systemName: "xmark") - .font(.system(size: 10, weight: .semibold)) - .foregroundColor(.secondary) - .frame(width: 18, height: 18) + if let onImportToPhotos = actions.importPhotosAction { + QuickDropToastViewButton(title: "ImportToPhotos") { + onImportToPhotos() + actions.closeToastAction() + } + } + + Spacer() + + QuickDropToastViewButton(title: "Done", action: actions.closeToastAction) + .onAppear { + self.autoHider = DispatchWorkItem(block: { + actions.closeToastAction() + }) + + DispatchQueue.main.asyncAfter(deadline: .now() + 10) { + self.autoHider?.perform() + } + } + .onDisappear { + self.autoHider?.cancel() + } + } + .buttonStyle(.bordered) + .controlSize(.small) } - .buttonStyle(PlainButtonStyle()) + + HStack { + CapsuleProgress(value: receiveModel.progress ?? 1.0) + + Button(action: onCancel) { + Image(systemName: "xmark") + .font(.system(size: 10, weight: .semibold)) + .foregroundColor(.secondary) + .frame(width: 18, height: 18) + } + .buttonStyle(PlainButtonStyle()) + } + .opacity(isDone ? 0 : 1) } } .padding(16) @@ -75,6 +121,25 @@ struct QuickDropToastView: View { } +fileprivate struct QuickDropToastViewButton: View { + let title: String + let action: () -> Void + + var body: some View { + Button(action: action) { + Text(title.localized()) + .padding(.horizontal, 12) + .padding(.vertical, 4) + .background( + Color.gray.opacity(0.15) + .clipShape(RoundedRectangle(cornerRadius: 8, style: .continuous)) + ) + } + .buttonStyle(.plain) // prevents blue macOS button look + } +} + + // NSVisualEffectView wrapper for macOS 11 compatible blur/vibrancy struct VisualEffectView: NSViewRepresentable { var material: NSVisualEffectView.Material = .hudWindow @@ -110,7 +175,7 @@ struct CapsuleProgress: View { ZStack(alignment: .leading) { Capsule() .fill(track) - Capsule() // Use a plain rectangle + Capsule() .fill(fill) .mask( Capsule() @@ -128,20 +193,22 @@ struct CapsuleProgress: View { // MARK: - Preview struct QuickDropToastView_Previews: PreviewProvider { struct Demo: View { - @State var model = ReceiveModel(controlPlusScreen: { _ in }) - + @State var done = false + var body: some View { QuickDropToastView( receiveModel: model, onCancel: { } ) - .padding() .frame(width: toastViewSize.width, height: toastViewSize.height) + .padding(100) + .background(Color.white.opacity(0.2)) .onAppear { model.progress = 0.01 } } } + static var previews: some View { Demo() } } diff --git a/QuickDrop/ViewModel/ReceiveModel.swift b/QuickDrop/ViewModel/ReceiveModel.swift index 08a1576..cd69a36 100644 --- a/QuickDrop/ViewModel/ReceiveModel.swift +++ b/QuickDrop/ViewModel/ReceiveModel.swift @@ -22,6 +22,7 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { #if os(macOS) @Published var progress: Double? = nil + @Published var toastActions: ToastViewAction? = nil private var toastWindow: NSWindow? private var toastHosting: NSHostingView? #endif @@ -163,6 +164,7 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { }, completion: {}) #else DispatchQueue.main.async { + self.toastActions = nil self.progress = averageProgress self.showQuickDropToast(for: connectionID) } @@ -176,8 +178,6 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { #if os(macOS) DispatchQueue.main.async { - self.hideQuickDropToast() - if self.processes.isEmpty { self.progress = nil } @@ -200,8 +200,12 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { controlPlusScreen(false) ErrorAlertHandler.shared.showErrorAlert(for: device.name ?? "Android", error: error) - } else { + DispatchQueue.main.async { + self.hideQuickDropToast() + } + } else { + #if os(iOS) doubleVibration() if !savedFiles.isEmpty { @@ -227,10 +231,42 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { #if os(macOS) - // Show received files if wanted - if !savedFiles.isEmpty, Settings.shared.openFinderAfterReceiving { - log("[SaveFilesManager] Opening \(self.downloadedFiles.count) file(s) in Finder.") - NSWorkspace.shared.activateFileViewerSelecting(self.downloadedFiles) + let openFilesAction = { + if !savedFiles.isEmpty { + log("[SaveFilesManager] Opening \(savedFiles.count) file(s) in Finder.") + NSWorkspace.shared.activateFileViewerSelecting(savedFiles) + } + } + + let hasPhotoOrVideos = PhotoManager.hasPhotosOrVideos(at: savedFiles) + let importPhotosAction: (()->())? = hasPhotoOrVideos ? { + Task { + do { + try await PhotoManager.saveMediaToPhotoLibrary(from: savedFiles) + } + catch { + DispatchQueue.main.async { + let alert = NSAlert() + alert.alertStyle = .critical + alert.messageText = "CouldNotSaveMediaToPhotoLibrary".localized() + alert.informativeText = error.localizedDescription + alert.addButton(withTitle: "CloseAlert".localized()) + + alert.runModal() + } + } + } + } : nil + + DispatchQueue.main.async { + withAnimation { + self.toastActions = ToastViewAction(openFilesAction: openFilesAction, importPhotosAction: importPhotosAction, closeToastAction: self.hideQuickDropToast) + } + + // Show received files if wanted + if Settings.shared.openFinderAfterReceiving { + self.toastActions?.openFilesAction() + } } // If distributed directly, do not request review here as it does not work @@ -336,7 +372,15 @@ class ReceiveModel: ObservableObject, InboundAppDelegate { window.orderOut(nil) self.toastWindow = nil self.toastHosting = nil + self.toastActions = nil }) } + + + struct ToastViewAction { + let openFilesAction: () -> () + let importPhotosAction: (() -> ())? + let closeToastAction: () -> () + } #endif } diff --git a/QuickDropiOS/InfoPlist.xcstrings b/QuickDropiOS/InfoPlist.xcstrings index 0edba4a..4b8f742 100644 --- a/QuickDropiOS/InfoPlist.xcstrings +++ b/QuickDropiOS/InfoPlist.xcstrings @@ -5,233 +5,11 @@ "comment" : "Bundle display name", "extractionState" : "extracted_with_value", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ca" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "cs" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "da" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "de" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "el" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, "en" : { "stringUnit" : { "state" : "new", "value" : "QuickDrop" } - }, - "en-AU" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es-419" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "he" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hu" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "id" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "it" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ja" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ms" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nb" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ro" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ru" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "sv" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "th" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "tr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "uk" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "vi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } } } }, @@ -239,233 +17,11 @@ "comment" : "Bundle name", "extractionState" : "extracted_with_value", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ca" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "cs" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "da" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "de" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "el" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, "en" : { "stringUnit" : { "state" : "new", "value" : "QuickDropiOS" } - }, - "en-AU" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es-419" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "he" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hu" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "id" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "it" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ja" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ms" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nb" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ro" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ru" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "sv" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "th" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "tr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "uk" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "vi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } } } }, @@ -473,233 +29,11 @@ "comment" : "Copyright (human-readable)", "extractionState" : "extracted_with_value", "localizations" : { - "ar" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ca" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "cs" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "da" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "de" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "el" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, "en" : { "stringUnit" : { "state" : "new", "value" : "" } - }, - "en-AU" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "en-GB" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "es-419" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "fr-CA" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "he" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "hu" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "id" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "it" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ja" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ms" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nb" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "nl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pl" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-BR" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "pt-PT" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ro" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "ru" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "sv" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "th" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "tr" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "uk" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "vi" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hans" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } - }, - "zh-Hant" : { - "stringUnit" : { - "state" : "new", - "value" : "" - } } } }, diff --git a/QuickDropiOS/View/PhotoManager.swift b/QuickDropiOS/View/PhotoManager.swift index 968c200..fd1760b 100644 --- a/QuickDropiOS/View/PhotoManager.swift +++ b/QuickDropiOS/View/PhotoManager.swift @@ -5,11 +5,15 @@ // Created by Leon Böttger on 16.11.25. // +#if os(iOS) import UIKit +#else +import AppKit +#endif + import Photos import UniformTypeIdentifiers - struct PhotoManager { /// Returns if there are photos or videos among the given URLs. @@ -44,7 +48,7 @@ struct PhotoManager { let exifDate = EXIFUtils.exifOriginalDate(from: sourceURL) imageItems.append(ImageItem(fileURL: sourceURL, creationDate: exifDate)) } else { - let videoDate = await getVideoCreationDate(from: sourceURL) + let videoDate = getVideoCreationDate(from: sourceURL) videoItems.append(VideoItem(fileURL: sourceURL, creationDate: videoDate)) } } @@ -96,10 +100,16 @@ struct PhotoManager { // Open the Photos app if openPhotosOnSuccess { - if let url = URL(string: "photos-redirect://") { - DispatchQueue.main.async { + DispatchQueue.main.async { + #if os(iOS) + if let url = URL(string: "photos-redirect://") { UIApplication.shared.open(url) } + #else + if let url = URL(string: "photos-navigation://album?name=recently-saved") { + NSWorkspace.shared.open(url) + } + #endif } } } @@ -126,23 +136,16 @@ struct PhotoManager { } - private static func getVideoCreationDate(from url: URL) async -> Date? { + private static func getVideoCreationDate(from url: URL) -> Date? { let asset = AVURLAsset(url: url) - - do { - // AVMetadataItem that typically contains an ISO‑8601 string - guard let item = try await asset.load(.creationDate), - let dateString = try await item.load(.stringValue) else { - return nil - } - - let formatter = ISO8601DateFormatter() - return formatter.date(from: dateString) - } - catch { - log("Failed to load creation date from \(url): \(error)") + // AVMetadataItem that typically contains an ISO‑8601 string + guard let item = asset.creationDate, + let dateString = item.stringValue else { return nil } + + let formatter = ISO8601DateFormatter() + return formatter.date(from: dateString) }