diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 95bca21bed..3fa07688c1 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -432,6 +432,8 @@ 851672D12BED1FC900592F24 /* AutocompleteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851672D02BED1FC900592F24 /* AutocompleteView.swift */; }; 851672D32BED23FE00592F24 /* AutocompleteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851672D22BED23FE00592F24 /* AutocompleteViewModel.swift */; }; 8517D98B221783A0006A8DD0 /* FindInPage.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8517D98A221783A0006A8DD0 /* FindInPage.xcassets */; }; + 851952682CE2522700578553 /* AutocompleteSuggestionsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851952672CE2522700578553 /* AutocompleteSuggestionsDataSource.swift */; }; + 8519526C2CE256BC00578553 /* AutocompleteSuggestionsDataSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8519526A2CE256A900578553 /* AutocompleteSuggestionsDataSourceTests.swift */; }; 851B1283221FE65E004781BC /* ImproveOnboardingExperiment1Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851B1281221FE64E004781BC /* ImproveOnboardingExperiment1Tests.swift */; }; 851B128822200575004781BC /* Onboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851B128722200575004781BC /* Onboarding.swift */; }; 851B12CC22369931004781BC /* AtbAndVariantCleanup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 850250B220D803F4002199C7 /* AtbAndVariantCleanup.swift */; }; @@ -507,7 +509,6 @@ 85864FBC24D31EF300E756FF /* SuggestionTrayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85864FBB24D31EF300E756FF /* SuggestionTrayViewController.swift */; }; 858650D12469BCDE00C36F8A /* DaxDialogs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858650D02469BCDE00C36F8A /* DaxDialogs.swift */; }; 858650D32469BFAD00C36F8A /* DaxDialogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858650D22469BFAD00C36F8A /* DaxDialogTests.swift */; }; - 858650D9246B0D3C00C36F8A /* DaxOnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858650D8246B0D3C00C36F8A /* DaxOnboardingViewController.swift */; }; 858650DB246B111900C36F8A /* DaxOnboarding.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 858650DA246B111900C36F8A /* DaxOnboarding.xcassets */; }; 8586A10D24CBA7070049720E /* FindInPageActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8586A10C24CBA7070049720E /* FindInPageActivity.swift */; }; 8586A10E24CBAF5B0049720E /* Core.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F143C2E41E4A4CD400CFDE3A /* Core.framework */; }; @@ -1740,6 +1741,8 @@ 851672D02BED1FC900592F24 /* AutocompleteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocompleteView.swift; sourceTree = ""; }; 851672D22BED23FE00592F24 /* AutocompleteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocompleteViewModel.swift; sourceTree = ""; }; 8517D98A221783A0006A8DD0 /* FindInPage.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = FindInPage.xcassets; sourceTree = ""; }; + 851952672CE2522700578553 /* AutocompleteSuggestionsDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocompleteSuggestionsDataSource.swift; sourceTree = ""; }; + 8519526A2CE256A900578553 /* AutocompleteSuggestionsDataSourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocompleteSuggestionsDataSourceTests.swift; sourceTree = ""; }; 851B1281221FE64E004781BC /* ImproveOnboardingExperiment1Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImproveOnboardingExperiment1Tests.swift; sourceTree = ""; }; 851B128722200575004781BC /* Onboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Onboarding.swift; sourceTree = ""; }; 851B128B2220483A004781BC /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; @@ -1815,7 +1818,6 @@ 85864FBB24D31EF300E756FF /* SuggestionTrayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestionTrayViewController.swift; sourceTree = ""; }; 858650D02469BCDE00C36F8A /* DaxDialogs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogs.swift; sourceTree = ""; }; 858650D22469BFAD00C36F8A /* DaxDialogTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxDialogTests.swift; sourceTree = ""; }; - 858650D8246B0D3C00C36F8A /* DaxOnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DaxOnboardingViewController.swift; sourceTree = ""; }; 858650DA246B111900C36F8A /* DaxOnboarding.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = DaxOnboarding.xcassets; sourceTree = ""; }; 8586A10C24CBA7070049720E /* FindInPageActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindInPageActivity.swift; sourceTree = ""; }; 8586A10F24CCCD040049720E /* TabsBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsBarViewController.swift; sourceTree = ""; }; @@ -4318,10 +4320,19 @@ children = ( 851672CE2BED1F9500592F24 /* HistoryMessageManager.swift */, 851672D22BED23FE00592F24 /* AutocompleteViewModel.swift */, + 851952672CE2522700578553 /* AutocompleteSuggestionsDataSource.swift */, ); name = Model; sourceTree = ""; }; + 851952692CE2569600578553 /* Autocomplete */ = { + isa = PBXGroup; + children = ( + 8519526A2CE256A900578553 /* AutocompleteSuggestionsDataSourceTests.swift */, + ); + name = Autocomplete; + sourceTree = ""; + }; 851DFD88212C5ED600D95F20 /* Main */ = { isa = PBXGroup; children = ( @@ -4431,7 +4442,6 @@ 984147CB24F02E9E00362052 /* DaxOnboarding.storyboard */, 858650D02469BCDE00C36F8A /* DaxDialogs.swift */, 858650DA246B111900C36F8A /* DaxOnboarding.xcassets */, - 858650D8246B0D3C00C36F8A /* DaxOnboardingViewController.swift */, 8524CC93246C5C8900E59D45 /* DaxDialogViewController.swift */, 8524CC99246DA81700E59D45 /* FullscreenDaxDialogViewController.swift */, F42EF9302614BABD00101FB9 /* ActionSheetDaxDialogViewController.swift */, @@ -5752,7 +5762,7 @@ F12D98401F266B30003C2EE3 /* DuckDuckGo */ = { isa = PBXGroup; children = ( - 6F03CAFF2C32ED22004179A8 /* NewTabPage */, + 851952692CE2569600578553 /* Autocomplete */, 6FF9157F2B88E04F0042AC87 /* AdAttribution */, F17669A21E411D63003D3222 /* Application */, 981FED7222045FFA008488D7 /* AutoClear */, @@ -5765,6 +5775,7 @@ 8588026724E4249800C24AB6 /* iPad */, 851DFD88212C5ED600D95F20 /* Main */, EE56DE3A2A6038F500375C41 /* NetworkProtection */, + 6F03CAFF2C32ED22004179A8 /* NewTabPage */, F1D477C71F2139210031ED49 /* OmniBar */, 9F23B8042C2BE20500950875 /* Onboarding */, 98EA2C3F218BB5140023E1DC /* Settings */, @@ -7373,6 +7384,7 @@ 8540BD5423D8D5080057FDD2 /* PreserveLoginsAlert.swift in Sources */, 1E87615928A1517200C7C5CE /* PrivacyDashboardViewController.swift in Sources */, 6F03CAFE2C32DD08004179A8 /* HomePageMessagesConfiguration.swift in Sources */, + 851952682CE2522700578553 /* AutocompleteSuggestionsDataSource.swift in Sources */, EE9D68D12AE00CF300B55EF4 /* NetworkProtectionVPNSettingsView.swift in Sources */, 319A371028299A850079FBCE /* PasswordHider.swift in Sources */, 982C87C42255559A00919035 /* UITableViewCellExtension.swift in Sources */, @@ -7746,7 +7758,6 @@ 9FF7E9862C23D10300902BE5 /* BrowsersComparisonChart.swift in Sources */, 6F64AA532C47E92600CF4489 /* FavoritesFaviconLoader.swift in Sources */, 4B274F602AFEAECC003F0745 /* NetworkProtectionWidgetRefreshModel.swift in Sources */, - 858650D9246B0D3C00C36F8A /* DaxOnboardingViewController.swift in Sources */, 312E5746283BB04A00C18FA0 /* AutofillEmptySearchView.swift in Sources */, 8565A34B1FC8D96B00239327 /* LaunchTabNotification.swift in Sources */, 311BD1AD2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift in Sources */, @@ -8027,6 +8038,7 @@ 310E79BD2949CAA5007C49E8 /* FireButtonReferenceTests.swift in Sources */, 4B62C4BA25B930DD008912C6 /* AppConfigurationFetchTests.swift in Sources */, 31C7D71C27515A6300A95D0A /* MockVoiceSearchHelper.swift in Sources */, + 8519526C2CE256BC00578553 /* AutocompleteSuggestionsDataSourceTests.swift in Sources */, 6F395BBB2CD2C87D00B92FC3 /* BoolFileMarkerTests.swift in Sources */, 8598F67B2405EB8D00FBC70C /* KeyboardSettingsTests.swift in Sources */, 98AAF8E4292EB46000DBDF06 /* BookmarksMigrationTests.swift in Sources */, @@ -9195,7 +9207,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9232,7 +9244,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9322,7 +9334,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9349,7 +9361,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9498,7 +9510,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9523,7 +9535,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9592,7 +9604,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -9626,7 +9638,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9659,7 +9671,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9689,7 +9701,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9999,7 +10011,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10030,7 +10042,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10058,7 +10070,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10091,7 +10103,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10121,7 +10133,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10154,11 +10166,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -10391,7 +10403,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10418,7 +10430,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10450,7 +10462,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10487,7 +10499,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10522,7 +10534,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10557,11 +10569,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -10734,11 +10746,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -10767,10 +10779,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/DuckDuckGo/AutocompleteSuggestionsDataSource.swift b/DuckDuckGo/AutocompleteSuggestionsDataSource.swift new file mode 100644 index 0000000000..73ac458f63 --- /dev/null +++ b/DuckDuckGo/AutocompleteSuggestionsDataSource.swift @@ -0,0 +1,100 @@ +// +// AutocompleteSuggestionsDataSource.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Core +import BrowserServicesKit +import Suggestions +import History +import Persistence +import Networking + +final class AutocompleteSuggestionsDataSource: SuggestionLoadingDataSource { + + typealias SuggestionsRequestCompletion = (Data?, Error?) -> Void + typealias SuggestionsRequest = (URLRequest, @escaping SuggestionsRequestCompletion) -> Void + + private let historyManager: HistoryManaging + private let bookmarksDatabase: CoreDataDatabase + private let featureFlagger: FeatureFlagger + private let tabsModel: TabsModel + + private var performSuggestionsRequest: SuggestionsRequest + + /// Specifically open tabs that do not have the same URL as the current tab so that we avoid shown them in the results. + private lazy var candidateOpenTabs: [BrowserTab] = { + tabsModel.tabs.compactMap { + guard let url = $0.link?.url, + tabsModel.currentTab?.link?.url != $0.link?.url + else { return nil } + + return OpenTab(title: $0.link?.displayTitle ?? "", url: url) + } + }() + + private lazy var cachedBookmarks: CachedBookmarks = { + CachedBookmarks(bookmarksDatabase) + }() + + var historyCoordinator: HistoryCoordinating { + historyManager.historyCoordinator + } + + var platform: Platform { + .mobile + } + + init(historyManager: HistoryManaging, bookmarksDatabase: CoreDataDatabase, featureFlagger: FeatureFlagger, tabsModel: TabsModel, performSuggestionsRequest: @escaping SuggestionsRequest) { + self.historyManager = historyManager + self.bookmarksDatabase = bookmarksDatabase + self.featureFlagger = featureFlagger + self.tabsModel = tabsModel + self.performSuggestionsRequest = performSuggestionsRequest + } + + func history(for suggestionLoading: Suggestions.SuggestionLoading) -> [HistorySuggestion] { + return historyCoordinator.history ?? [] + } + + func bookmarks(for suggestionLoading: Suggestions.SuggestionLoading) -> [Suggestions.Bookmark] { + return cachedBookmarks.all + } + + func internalPages(for suggestionLoading: Suggestions.SuggestionLoading) -> [Suggestions.InternalPage] { + return [] + } + + func openTabs(for suggestionLoading: any SuggestionLoading) -> [BrowserTab] { + if featureFlagger.isFeatureOn(.autcompleteTabs) { + return candidateOpenTabs + } + return [] + } + + func suggestionLoading(_ suggestionLoading: Suggestions.SuggestionLoading, suggestionDataFromUrl url: URL, withParameters parameters: [String: String], completion: @escaping (Data?, Error?) -> Void) { + var queryURL = url + parameters.forEach { + queryURL = queryURL.appendingParameter(name: $0.key, value: $0.value) + } + var request = URLRequest.developerInitiated(queryURL) + request.allHTTPHeaderFields = APIRequest.Headers().httpHeaders + + performSuggestionsRequest(request, completion) + } + +} diff --git a/DuckDuckGo/AutocompleteViewController.swift b/DuckDuckGo/AutocompleteViewController.swift index c358fe97cd..ba914b9418 100644 --- a/DuckDuckGo/AutocompleteViewController.swift +++ b/DuckDuckGo/AutocompleteViewController.swift @@ -40,36 +40,34 @@ class AutocompleteViewController: UIHostingController { weak var delegate: AutocompleteViewControllerDelegate? weak var presentationDelegate: AutocompleteViewControllerPresentationDelegate? - private let historyManager: HistoryManaging - var historyCoordinator: HistoryCoordinating { - historyManager.historyCoordinator - } - - private let bookmarksDatabase: CoreDataDatabase private let appSettings: AppSettings private let model: AutocompleteViewModel - private var task: URLSessionDataTask? - @Published private var query = "" private var queryDebounceCancellable: AnyCancellable? - private lazy var cachedBookmarks: CachedBookmarks = { - CachedBookmarks(bookmarksDatabase) - }() - - private lazy var openTabs: [BrowserTab] = { - tabsModel.tabs.compactMap { - guard let url = $0.link?.url else { return nil } - return OpenTab(title: $0.link?.displayTitle ?? "", url: url) - } - }() - private var lastResults: SuggestionResult? private var loader: SuggestionLoader? private var historyMessageManager: HistoryMessageManager - private var tabsModel: TabsModel private var featureFlagger: FeatureFlagger + private let historyManager: HistoryManaging + private let bookmarksDatabase: CoreDataDatabase + private let tabsModel: TabsModel + + private var task: URLSessionDataTask? + + lazy var dataSource: AutocompleteSuggestionsDataSource = { + return AutocompleteSuggestionsDataSource( + historyManager: historyManager, + bookmarksDatabase: bookmarksDatabase, + featureFlagger: featureFlagger, + tabsModel: tabsModel) { [weak self] request, completion in + self?.task = Self.session.dataTask(with: request) { data, _, error in + completion(data, error) + } + self?.task?.resume() + } + }() init(historyManager: HistoryManaging, bookmarksDatabase: CoreDataDatabase, @@ -81,6 +79,7 @@ class AutocompleteViewController: UIHostingController { self.tabsModel = tabsModel self.historyManager = historyManager self.bookmarksDatabase = bookmarksDatabase + self.appSettings = appSettings self.historyMessageManager = historyMessageManager self.featureFlagger = featureFlagger @@ -191,7 +190,7 @@ class AutocompleteViewController: UIHostingController { return url }) - loader?.getSuggestions(query: query, usingDataSource: self) { [weak self] result, error in + loader?.getSuggestions(query: query, usingDataSource: dataSource) { [weak self] result, error in guard let self, error == nil else { return } let updatedResults = result ?? .empty self.lastResults = updatedResults @@ -283,47 +282,6 @@ extension AutocompleteViewController: AutocompleteViewModelDelegate { } } -extension AutocompleteViewController: SuggestionLoadingDataSource { - - var platform: Platform { - .mobile - } - - func history(for suggestionLoading: Suggestions.SuggestionLoading) -> [HistorySuggestion] { - return historyCoordinator.history ?? [] - } - - func bookmarks(for suggestionLoading: Suggestions.SuggestionLoading) -> [Suggestions.Bookmark] { - return cachedBookmarks.all - } - - func internalPages(for suggestionLoading: Suggestions.SuggestionLoading) -> [Suggestions.InternalPage] { - return [] - } - - func openTabs(for suggestionLoading: any SuggestionLoading) -> [BrowserTab] { - if featureFlagger.isFeatureOn(.autcompleteTabs) { - return openTabs - } - return [] - } - - func suggestionLoading(_ suggestionLoading: Suggestions.SuggestionLoading, suggestionDataFromUrl url: URL, withParameters parameters: [String: String], completion: @escaping (Data?, Error?) -> Void) { - var queryURL = url - parameters.forEach { - queryURL = queryURL.appendingParameter(name: $0.key, value: $0.value) - } - - var request = URLRequest.developerInitiated(queryURL) - request.allHTTPHeaderFields = APIRequest.Headers().httpHeaders - task = Self.session.dataTask(with: request) { data, _, error in - completion(data, error) - } - task?.resume() - } - -} - private extension SuggestionResult { static let empty = SuggestionResult(topHits: [], duckduckgoSuggestions: [], localSuggestions: []) } diff --git a/DuckDuckGo/Base.lproj/DaxOnboarding.storyboard b/DuckDuckGo/Base.lproj/DaxOnboarding.storyboard index f95f44d472..0b72f7c384 100644 --- a/DuckDuckGo/Base.lproj/DaxOnboarding.storyboard +++ b/DuckDuckGo/Base.lproj/DaxOnboarding.storyboard @@ -1,149 +1,14 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -331,14 +196,6 @@ DuckDuckGo! - - - - - - - - @@ -348,7 +205,7 @@ DuckDuckGo! - + @@ -442,12 +299,10 @@ DuckDuckGo! - + - - diff --git a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Contents.json deleted file mode 100644 index 19cb768f2e..0000000000 --- a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Contents.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "images" : [ - { - "filename" : "Lighthouse.pdf", - "idiom" : "iphone" - }, - { - "filename" : "lighthouse-large.pdf", - "idiom" : "ipad" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Lighthouse.pdf b/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Lighthouse.pdf deleted file mode 100644 index dab3dccc1f..0000000000 Binary files a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/Lighthouse.pdf and /dev/null differ diff --git a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/lighthouse-large.pdf b/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/lighthouse-large.pdf deleted file mode 100644 index 5d648895d7..0000000000 Binary files a/DuckDuckGo/DaxOnboarding.xcassets/Lighthouse.imageset/lighthouse-large.pdf and /dev/null differ diff --git a/DuckDuckGo/DaxOnboardingViewController.swift b/DuckDuckGo/DaxOnboardingViewController.swift deleted file mode 100644 index 9fda073b4e..0000000000 --- a/DuckDuckGo/DaxOnboardingViewController.swift +++ /dev/null @@ -1,206 +0,0 @@ -// -// DaxOnboardingViewController.swift -// DuckDuckGo -// -// Copyright © 2020 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import UIKit - -class DaxOnboardingViewController: UIViewController, Onboarding { - - struct Constants { - - static let animationDelay = 1.4 - static let animationDuration = 0.4 - - } - - weak var delegate: OnboardingDelegate? - weak var daxDialog: DaxDialogViewController? - - @IBOutlet weak var welcomeMessage: UILabel! - @IBOutlet weak var daxDialogContainer: UIView! - @IBOutlet weak var daxDialogContainerHeight: NSLayoutConstraint! - @IBOutlet weak var daxIcon: UIView! - @IBOutlet weak var onboardingIcon: UIView! - @IBOutlet weak var transitionalIcon: UIView! - @IBOutlet weak var button: UIButton! - @IBOutlet weak var backgroundView: UIView! - - override var supportedInterfaceOrientations: UIInterfaceOrientationMask { - return isPad ? super.supportedInterfaceOrientations : [ .portrait ] - } - - override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { - return isPad ? super.preferredInterfaceOrientationForPresentation : .portrait - } - - override var shouldAutorotate: Bool { - return true - } - - private let pixelReporting: OnboardingIntroImpressionReporting - - init?(coder: NSCoder, pixelReporting: OnboardingIntroImpressionReporting) { - self.pixelReporting = pixelReporting - super.init(coder: coder) - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func viewDidLoad() { - super.viewDidLoad() - - welcomeMessage.setAttributedTextString(UserText.launchscreenWelcomeMessage) - daxDialog?.message = UserText.daxDialogOnboardingMessage - daxDialog?.reset() - daxDialogContainerHeight.constant = daxDialog?.calculateHeight() ?? 0 - button.displayDropShadow() - daxIcon.isHidden = true - - pixelReporting.trackOnboardingIntroImpression() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - guard !view.isHidden else { return } - - daxDialogContainerHeight.constant = daxDialog?.calculateHeight() ?? 0 - self.daxDialog?.reset() - - DispatchQueue.main.asyncAfter(deadline: .now() + Constants.animationDelay) { - self.transitionFromOnboarding() - } - } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - super.prepare(for: segue, sender: nil) - - if let daxDialog = segue.destination as? DaxDialogViewController { - self.daxDialog = daxDialog - view.addGestureRecognizer(daxDialog.tapToCompleteGestureRecognizer) - } else if let controller = segue.destination as? DaxOnboardingPadViewController { - controller.delegate = self - } else if let navController = segue.destination as? UINavigationController, - let controller = navController.viewControllers.first as? OnboardingViewController { - controller.delegate = self - } - - } - - func transitionFromOnboarding() { - - // using snapshots means the original views don't get messed up by their constraints when subsequent animations kick off - let transitionIconSS: UIView = self.transitionalIcon.snapshotView(afterScreenUpdates: true) ?? self.transitionalIcon - transitionIconSS.frame = self.transitionalIcon.frame - view.addSubview(transitionIconSS) - self.transitionalIcon.isHidden = true - - let onboardingIconSS: UIView = self.onboardingIcon.snapshotView(afterScreenUpdates: true) ?? self.onboardingIcon - onboardingIconSS.frame = self.onboardingIcon.frame - view.addSubview(onboardingIconSS) - self.onboardingIcon.isHidden = true - - UIView.animate(withDuration: 0.3, animations: { - - // the dax dialog icon is not exactly centered with or the same size as this icon so we need to account for this in the animation - onboardingIconSS.frame = CGRect(x: 0, y: 0, width: 76, height: 76) - onboardingIconSS.center = CGPoint(x: self.daxIcon.center.x, y: self.daxIcon.center.y - 2) - onboardingIconSS.alpha = 0.0 - - transitionIconSS.frame = self.daxIcon.frame - transitionIconSS.alpha = 1.0 - - self.backgroundView.alpha = 0.0 - }, completion: { _ in - self.daxIcon.isHidden = false - onboardingIconSS.isHidden = true - transitionIconSS.isHidden = true - - DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { - onboardingIconSS.removeFromSuperview() - transitionIconSS.removeFromSuperview() - self.transitionToDaxDialog() - } - - }) - - } - - func transitionToDaxDialog() { - - let snapshot: UIView = self.daxIcon.snapshotView(afterScreenUpdates: true) ?? self.daxIcon - snapshot.frame = self.daxIcon.frame - view.addSubview(snapshot) - self.daxIcon.isHidden = true - - UIView.animate(withDuration: Constants.animationDuration, animations: { - self.welcomeMessage.alpha = 0.0 - - if let frame = self.daxDialog?.icon.frame, - let localFrame = self.daxDialog?.icon.superview!.convert(frame, to: self.view) { - self.daxIcon.frame = localFrame - snapshot.frame = localFrame - } - - }, completion: { _ in - - // fade out while it's being shown again below, otherwise there's an abrupt change when the double dropshadow disappears - UIView.animate(withDuration: 1.0, animations: { - snapshot.alpha = 0.0 - }, completion: { _ in - snapshot.removeFromSuperview() - }) - - self.showDaxDialog { - self.daxDialog?.start() - } - }) - - } - - @IBAction func onTapButton() { - let segue = isPad ? "AddToHomeRow-iPad" : "AddToHomeRow" - performSegue(withIdentifier: segue, sender: self) - } - - func showDaxDialog(completion: @escaping () -> Void) { - daxDialogContainer.alpha = 0.0 - daxDialogContainer.isHidden = false - - button.alpha = 0.0 - button.isHidden = false - - UIView.animate(withDuration: Constants.animationDuration, animations: { - self.daxDialogContainer.alpha = 1.0 - self.button.alpha = 1.0 - }, completion: { _ in - completion() - }) - } - -} - -extension DaxOnboardingViewController: OnboardingDelegate { - func onboardingCompleted(controller: UIViewController) { - self.view.isHidden = true - controller.dismiss(animated: true) - self.delegate?.onboardingCompleted(controller: self) - } -} diff --git a/DuckDuckGo/EditableShortcutsView.swift b/DuckDuckGo/EditableShortcutsView.swift index 08ac409016..df40c9cbc8 100644 --- a/DuckDuckGo/EditableShortcutsView.swift +++ b/DuckDuckGo/EditableShortcutsView.swift @@ -28,7 +28,7 @@ struct EditableShortcutsView: View { private let haptics = UIImpactFeedbackGenerator() var body: some View { - NewTabPageGridView(geometry: geometry) { _ in + NewTabPageGridView(geometry: geometry, isUsingDynamicSpacing: true) { _ in ReorderableForEach(model.itemsSettings, id: \.item.id, isReorderingEnabled: true) { setting in let isEnabled = model.enabledItems.contains(setting.item) Button { diff --git a/DuckDuckGo/FavoritesView.swift b/DuckDuckGo/FavoritesView.swift index bb65db7939..a8a7620052 100644 --- a/DuckDuckGo/FavoritesView.swift +++ b/DuckDuckGo/FavoritesView.swift @@ -36,10 +36,12 @@ struct FavoritesView: View { var body: some View { VStack(alignment: .center, spacing: 24) { - let columns = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape) + let columns = NewTabPageGrid.columnsCount(for: horizontalSizeClass, + isLandscape: isLandscape, + isDynamic: model.isNewTabPageCustomizationEnabled) let result = model.prefixedFavorites(for: columns) - NewTabPageGridView(geometry: geometry) { _ in + NewTabPageGridView(geometry: geometry, isUsingDynamicSpacing: model.isNewTabPageCustomizationEnabled) { _ in ReorderableForEach(result.items) { item in viewFor(item) .previewShape() diff --git a/DuckDuckGo/FavoritesViewModel.swift b/DuckDuckGo/FavoritesViewModel.swift index babd8e20c2..fac9571bd4 100644 --- a/DuckDuckGo/FavoritesViewModel.swift +++ b/DuckDuckGo/FavoritesViewModel.swift @@ -54,7 +54,8 @@ class FavoritesViewModel: ObservableObject { private let favoriteDataSource: NewTabPageFavoriteDataSource private let pixelFiring: PixelFiring.Type private let dailyPixelFiring: DailyPixelFiring.Type - private let isNewTabPageCustomizationEnabled: Bool + + let isNewTabPageCustomizationEnabled: Bool var isEmpty: Bool { allFavorites.filter(\.isFavorite).isEmpty diff --git a/DuckDuckGo/MainViewController+Segues.swift b/DuckDuckGo/MainViewController+Segues.swift index bca512800e..8d91186009 100644 --- a/DuckDuckGo/MainViewController+Segues.swift +++ b/DuckDuckGo/MainViewController+Segues.swift @@ -33,19 +33,8 @@ extension MainViewController { Logger.lifecycle.debug(#function) hideAllHighlightsIfNeeded() - var controller: (Onboarding & UIViewController)? - - if DefaultVariantManager().isNewIntroFlow { - controller = OnboardingIntroViewController(onboardingPixelReporter: contextualOnboardingPixelReporter) - } else { - let storyboard = UIStoryboard(name: "DaxOnboarding", bundle: nil) - controller = storyboard.instantiateInitialViewController(creator: { coder in - DaxOnboardingViewController(coder: coder, pixelReporting: self.contextualOnboardingPixelReporter) - }) - } - - controller?.delegate = self - guard let controller else { return assertionFailure() } + let controller = OnboardingIntroViewController(onboardingPixelReporter: contextualOnboardingPixelReporter) + controller.delegate = self controller.modalPresentationStyle = .overFullScreen present(controller, animated: false) } diff --git a/DuckDuckGo/NewTabPageGridView.swift b/DuckDuckGo/NewTabPageGridView.swift index f2b75d76b5..ffcffc0e17 100644 --- a/DuckDuckGo/NewTabPageGridView.swift +++ b/DuckDuckGo/NewTabPageGridView.swift @@ -24,14 +24,15 @@ struct NewTabPageGridView: View { @Environment(\.isLandscapeOrientation) var isLandscape let geometry: GeometryProxy? + let isUsingDynamicSpacing: Bool @ViewBuilder var content: (_ columnsCount: Int) -> Content @State private var width: CGFloat = .zero var body: some View { - let columnsCount = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape) + let columnsCount = NewTabPageGrid.columnsCount(for: horizontalSizeClass, isLandscape: isLandscape, isDynamic: isUsingDynamicSpacing) - LazyVGrid(columns: flexibleColumns(columnsCount, width: width), spacing: 24, content: { + LazyVGrid(columns: createColumns(columnsCount), spacing: 24, content: { content(columnsCount) }) .frame(maxWidth: .infinity) @@ -41,12 +42,14 @@ struct NewTabPageGridView: View { return geometry[anchor].width }) .onPreferenceChange(FramePreferenceKey.self, perform: { value in - width = value + if isUsingDynamicSpacing { + width = value + } }) .padding(0) } - private func flexibleColumns(_ count: Int, width: CGFloat) -> [GridItem] { + private func flexibleColumns(_ count: Int) -> [GridItem] { let spacing: CGFloat? if width != .zero { let columnsWidth = NewTabPageGrid.Item.edgeSize * Double(count) @@ -62,6 +65,17 @@ struct NewTabPageGridView: View { alignment: .top), count: count) } + + private func staticColumns(_ count: Int) -> [GridItem] { + return Array(repeating: GridItem(.fixed(NewTabPageGrid.Item.edgeSize), + spacing: NewTabPageGrid.Item.staticSpacing, + alignment: .top), + count: count) + } + + private func createColumns(_ count: Int) -> [GridItem] { + isUsingDynamicSpacing ? flexibleColumns(count) : staticColumns(count) + } } private struct FramePreferenceKey: PreferenceKey { @@ -72,17 +86,39 @@ private struct FramePreferenceKey: PreferenceKey { } enum NewTabPageGrid { - enum ColumnCount { - static let compact = 4 - static let regular = 6 + static func columnsCount(for sizeClass: UserInterfaceSizeClass?, isLandscape: Bool, isDynamic: Bool) -> Int { + if isDynamic { + let usesWideLayout = isLandscape || sizeClass == .regular + return usesWideLayout ? ColumnCount.regular : ColumnCount.compact + } else { + return staticGridColumnsCount(for: sizeClass) + } + } + + static func staticGridWidth(for sizeClass: UserInterfaceSizeClass?) -> CGFloat { + let columnsCount = CGFloat(staticGridColumnsCount(for: sizeClass)) + return columnsCount * Item.edgeSize + (columnsCount - 1) * Item.staticSpacing + } + + private static func staticGridColumnsCount(for sizeClass: UserInterfaceSizeClass?) -> Int { + let isPad = UIDevice.current.userInterfaceIdiom == .pad + + return isPad && sizeClass == .regular ? ColumnCount.staticWideLayout : ColumnCount.compact } enum Item { static let edgeSize = 64.0 } +} - static func columnsCount(for sizeClass: UserInterfaceSizeClass?, isLandscape: Bool) -> Int { - let usesWideLayout = isLandscape || sizeClass == .regular - return usesWideLayout ? ColumnCount.regular : ColumnCount.compact +private extension NewTabPageGrid { + enum ColumnCount { + static let compact = 4 + static let regular = 6 + static let staticWideLayout = 5 } } + +private extension NewTabPageGrid.Item { + static let staticSpacing = 32.0 +} diff --git a/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift b/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift index fa3701270a..528ff47fc8 100644 --- a/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift +++ b/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift @@ -22,10 +22,6 @@ import BrowserServicesKit extension VariantManager { - var isNewIntroFlow: Bool { - isSupported(feature: .newOnboardingIntro) || isSupported(feature: .newOnboardingIntroHighlights) - } - var isOnboardingHighlightsExperiment: Bool { isSupported(feature: .newOnboardingIntroHighlights) } diff --git a/DuckDuckGo/ShortcutsView.swift b/DuckDuckGo/ShortcutsView.swift index 230d2a5393..0b83fc7b22 100644 --- a/DuckDuckGo/ShortcutsView.swift +++ b/DuckDuckGo/ShortcutsView.swift @@ -26,7 +26,7 @@ struct ShortcutsView: View { let proxy: GeometryProxy? var body: some View { - NewTabPageGridView(geometry: proxy) { _ in + NewTabPageGridView(geometry: proxy, isUsingDynamicSpacing: true) { _ in ForEach(shortcuts) { shortcut in Button { model.openShortcut(shortcut) diff --git a/DuckDuckGo/SimpleNewTabPageView.swift b/DuckDuckGo/SimpleNewTabPageView.swift index cf31697226..d674e59e32 100644 --- a/DuckDuckGo/SimpleNewTabPageView.swift +++ b/DuckDuckGo/SimpleNewTabPageView.swift @@ -81,7 +81,7 @@ private extension SimpleNewTabPageView { favoritesSectionView(proxy: proxy) } - .padding(Metrics.largePadding) + .padding(sectionsViewPadding(in: proxy)) } .withScrollKeyboardDismiss() } @@ -99,7 +99,7 @@ private extension SimpleNewTabPageView { } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) } - .padding(Metrics.largePadding) + .padding(Metrics.regularPadding) } private var messagesSectionView: some View { @@ -115,6 +115,11 @@ private extension SimpleNewTabPageView { isAddingFavorite: .constant(false), geometry: proxy) } + + private func sectionsViewPadding(in geometry: GeometryProxy) -> CGFloat { + let requiredWidth = NewTabPageGrid.staticGridWidth(for: horizontalSizeClass) + Metrics.regularPadding + return geometry.frame(in: .local).width >= requiredWidth ? Metrics.regularPadding : Metrics.smallPadding + } } private extension View { @@ -130,8 +135,8 @@ private extension View { private struct Metrics { - static let regularPadding = 16.0 - static let largePadding = 24.0 + static let smallPadding = 12.0 + static let regularPadding = 24.0 static let sectionSpacing = 32.0 static let nonGridSectionTopPadding = -8.0 diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index c526e40a7d..c0d006206f 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -221,7 +221,6 @@ public struct UserText { public static let favorite = NSLocalizedString("favorite", value: "Favorite", comment: "") - public static let launchscreenWelcomeMessage = NSLocalizedString("launchscreenWelcomeMessage", value: "Welcome to\nDuckDuckGo!", comment: "Please preserve newline character") public static let onboardingWelcomeHeader = NSLocalizedString("onboardingWelcomeHeader", value: "Welcome to DuckDuckGo!", comment: "") public static let onboardingContinue = NSLocalizedString("onboardingContinue", value: "Continue", comment: "") public static let onboardingSkip = NSLocalizedString("onboardingSkip", value: "Skip", comment: "") @@ -274,9 +273,6 @@ public struct UserText { public static let daxDialogFireButtonEducationConfirmAction = NSLocalizedString("dax.onboarding.fire.button.confirmAction", value: "Close Tabs and Clear Data", comment: "Encourage user to try clearing data with the fire button") public static let daxDialogFireButtonEducationCancelAction = NSLocalizedString("dax.onboarding.fire.button.cancelAction", value: "Cancel", comment: "Cancel action") - - public static let daxDialogOnboardingMessage = NSLocalizedString("dax.onboarding.message", value: "The Internet can be kinda creepy.\n\nNot to worry! Searching and browsing privately is easier than you think.", comment: "") - public static let daxDialogHideTitle = NSLocalizedString("dax.hide.title", value: "Hide remaining tips?", comment: "Title in Hide Dax dialog") public static let daxDialogHideMessage = NSLocalizedString("dax.hide.message", value: "There are only a few, and we tried to make them informative.", comment: "Subtitle in Hide Dax dialog") public static let daxDialogHideButton = NSLocalizedString("dax.hide.button", value: "Hide Tips Forever", comment: "") diff --git a/DuckDuckGo/bg.lproj/Localizable.strings b/DuckDuckGo/bg.lproj/Localizable.strings index df72ca960f..bab8e189f9 100644 --- a/DuckDuckGo/bg.lproj/Localizable.strings +++ b/DuckDuckGo/bg.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Да"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Пропускане"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Стартиране на сърфирането"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Покажи ми как"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Не забравяйте: всеки път когато сърфирате с мен, аз ще подрязвам крилцата на досадните реклами.\n\nЗатова ме дръжте в своя панел за ежедневното си сърфиране."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Ще се сгуша на удобно място да ви чакам, за да сърфирате с мен всеки ден."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Добавете ме към панела си!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Намерете иконата DuckDuckGo на своя начален екран. След това натиснете и я плъзнете на място. Това е всичко!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Лесно е да ме добавите към своя панел."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Изскачащият прозорец е скрит"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Разбрах"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Изберете своя браузър"; diff --git a/DuckDuckGo/cs.lproj/Localizable.strings b/DuckDuckGo/cs.lproj/Localizable.strings index 86a9a53eb4..a446d620d2 100644 --- a/DuckDuckGo/cs.lproj/Localizable.strings +++ b/DuckDuckGo/cs.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ano"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Přeskočit"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Spustit procházení"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Ukaž mi jak"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Pamatuj: Když se mnou na webu surfuješ, příšerné reklamy zaženeš.\n\nDej si mě do Docku, ať mě můžeš denně používat."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Až budeš chtít brouzdat po internetu, budu na dosah křídla."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Přidej si mě do Docku!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Najdi ikonu DuckDuckGo na ploše. Pak ji podrž a přetáhni na místo. A je to!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Přidat si mě do Docku je hračka."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Skryté vyskakovací okno"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Mám to"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Vyber si prohlížeč"; diff --git a/DuckDuckGo/da.lproj/Localizable.strings b/DuckDuckGo/da.lproj/Localizable.strings index 3e89b7a158..115988f39b 100644 --- a/DuckDuckGo/da.lproj/Localizable.strings +++ b/DuckDuckGo/da.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ja"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Spring over"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Start søgning"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Vis mig hvordan"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Husk: Hver gang du browser med mig, mister en uhyggelig annonce sine vinger.\n\nSå gem mig i din Dock til daglig browsing."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Jeg ligger lige ved hånden til al din daglige browsing."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Føj mig til din Dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Find DuckDuckGo-ikonet på din startskærm. Tryk og træk den derefter på plads. Det er det!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Det er nemt at tilføje mig til din Dock."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pop op-vindue skjult"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Forstået"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Vælg din browser"; diff --git a/DuckDuckGo/de.lproj/Localizable.strings b/DuckDuckGo/de.lproj/Localizable.strings index 5f893a3166..6ca64593f9 100644 --- a/DuckDuckGo/de.lproj/Localizable.strings +++ b/DuckDuckGo/de.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ja"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Überspringen"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Mit dem Browsen beginnen"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Anleitung"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Hinweis: Jedes Mal, wenn du mit mir browst, verliert eine aufdringliche Werbung ihren Schrecken.\n\nBehalte mich also zum täglichen Browsen in deinem Dock."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Ich niste in leicht erreichbarer Nähe für dein tägliches Browsen."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Füge mich zu deinem Dock hinzu!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Suche auf deinem Startbildschirm das DuckDuckGo-Symbol. Klicke es an und ziehe es dann an die richtige Stelle. Das war es schon!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Es ist ganz einfach, mich zu deinem Dock hinzuzufügen."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pop-up ausgeblendet"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Verstanden"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Wähle deinen Browser"; diff --git a/DuckDuckGo/el.lproj/Localizable.strings b/DuckDuckGo/el.lproj/Localizable.strings index 5df4692edf..2fef03526b 100644 --- a/DuckDuckGo/el.lproj/Localizable.strings +++ b/DuckDuckGo/el.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ναί"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Παράλειψη"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Έναρξη περιήγησης"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Δείξε μου πώς"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Να θυμάστε: κάθε φορά που περιηγείστε μαζί μου, μια ανατριχιαστική διαφήμιση χάνει τη δύναμή της!\n\nΓι' αυτό, διατηρήστε με στο Dock σας για καθημερινή περιήγηση."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Θα απολαμβάνω έτσι εύκολη πρόσβαση για όλη την καθημερινή περιήγησή σας."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Προσθέστε με στο Dock σας!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Βρείτε το εικονίδιο DuckDuckGo στην Αρχική οθόνη σας. Στη συνέχεια, πατήστε και μεταφέρετέ το στη θέση του. Αυτό είναι!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Η προσθήκη μου στο Dock σας είναι εύκολη."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Κρυφό αναδυόμενο παράθυρο"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Το κατάλαβα"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Επιλέξτε το πρόγραμμα περιήγησής σας"; diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index 4ab56d6e1f..214e4328a4 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -962,9 +962,6 @@ /* ad = advertisment */ "dax.onboarding.home.subsequent" = "You’ve got this!\n\nRemember: Every time you browse with me, a creepy ad loses its wings. 👍"; -/* No comment provided by engineer. */ -"dax.onboarding.message" = "The Internet can be kinda creepy.\n\nNot to worry! Searching and browsing privately is easier than you think."; - /* Default string used if users device is not iPhone or iPad */ "device.type.default" = "device"; @@ -1565,9 +1562,6 @@ /* No comment provided by engineer. */ "keyCommandShowAllTabs" = "Show All Tabs"; -/* Please preserve newline character */ -"launchscreenWelcomeMessage" = "Welcome to\nDuckDuckGo!"; - /* Summary text for the macOS browser waitlist */ "mac-browser.waitlist.summary" = "DuckDuckGo for Mac has the speed you need, the browsing features you expect, and comes packed with our best-in-class privacy essentials."; diff --git a/DuckDuckGo/es.lproj/Localizable.strings b/DuckDuckGo/es.lproj/Localizable.strings index b7dff0c463..adc8c04a8a 100644 --- a/DuckDuckGo/es.lproj/Localizable.strings +++ b/DuckDuckGo/es.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Sí"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Omitir"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Empezar a navegar"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Muéstrame cómo"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Recuerda: cada vez que navegas conmigo corto las alas a un anuncio escalofriante.\n\nAsí que mantenme en tu Dock para la navegación diaria."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Estaré al alcance de la mano para toda tu navegación diaria."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "¡Añádeme a tu Dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Busca el icono de DuckDuckGo en tu pantalla de inicio. A continuación, selecciónalo y arrástralo a su ubicación. ¡Eso es todo!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Añadirme a tu Dock es fácil."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Ventana emergente oculta"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Entendido"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Elige tu navegador"; diff --git a/DuckDuckGo/et.lproj/Localizable.strings b/DuckDuckGo/et.lproj/Localizable.strings index b1376a0ab7..9d94f5047e 100644 --- a/DuckDuckGo/et.lproj/Localizable.strings +++ b/DuckDuckGo/et.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Jah"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Jäta vahele"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Alusta sirvimist"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Näita mulle, kuidas"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Pea meeles, iga kord, kui minuga sirvid, kaotab salakaval reklaam oma tiivad.\n\nNii et hoia mind igapäevaselt sirvides oma Dockis."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Olen hõlpsasti ligipääsetav kogu teie igapäevase sirvimise vältel."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Lisa mind oma Docki!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Leia oma avakuvalt DuckDuckGo ikoon. Seejärel vajuta ja lohista see oma kohale. See on kõik!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Minu lisamine teie Docki on lihtne."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Hüpikaken on peidetud"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Sain aru"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Vali oma brauser"; diff --git a/DuckDuckGo/fi.lproj/Localizable.strings b/DuckDuckGo/fi.lproj/Localizable.strings index c745173f5a..9c85d1a744 100644 --- a/DuckDuckGo/fi.lproj/Localizable.strings +++ b/DuckDuckGo/fi.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Kyllä"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Ohita"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Aloita selailu"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Näytä minulle miten"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Muista, että joka kerta kun käytät minua selaamiseen, rasittavat mainokset katoavat.\n\nJoten pidä minut Docissa helppoa selausta varten."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Olen helposti käden ulottuvilla päivittäistä selaamista varten."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Lisää minut telakkaasi!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Etsi DuckDuckGo-kuvake aloitusnäytöltäsi. Paina ja vedä se sitten paikalleen. Siinä kaikki!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Voit lisätä minut telakkaasi helposti."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Ponnahdusikkuna piilotettu"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Selvä"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Valitse selaimesi"; diff --git a/DuckDuckGo/fr.lproj/Localizable.strings b/DuckDuckGo/fr.lproj/Localizable.strings index 970ec2d762..f35339e3c8 100644 --- a/DuckDuckGo/fr.lproj/Localizable.strings +++ b/DuckDuckGo/fr.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Oui"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Ignorer"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Commencer la navigation"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Me montrer comment faire"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Pensez-y : chaque fois que vous naviguez avec moi, une publicité douteuse disparaît.\n\nAlors gardez-moi dans votre Dock pour naviguer au quotidien."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Je serai à portée de main pour toutes vos navigations quotidiennes."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Ajoutez-moi à votre Dock !"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Trouvez l'icône DuckDuckGo sur votre écran d'accueil. Appuyez ensuite dessus pour la faire glisser au bon endroit. Voilà !"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Facile de m'ajouter à votre Dock !"; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Fenêtre contextuelle masquée"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "J'ai compris"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Choisissez votre navigateur"; diff --git a/DuckDuckGo/hr.lproj/Localizable.strings b/DuckDuckGo/hr.lproj/Localizable.strings index 1e91cfa4d0..5bb618e15f 100644 --- a/DuckDuckGo/hr.lproj/Localizable.strings +++ b/DuckDuckGo/hr.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Da"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Preskoči"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Započni pretraživanje"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Pokaži mi kako"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Zapamti: svaki put kad pregledavaš sa mnom, grozna reklama gubi krila.\n\nZato me zadrži u svom Docku za svakodnevno pregledavanje."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Bit ću ti na dohvat ruke za svo tvoje svakodnevno pregledavanje."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Dodaj me na svoj Dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Pronađi ikonu DuckDuckGo na početnom zaslonu. Zatim je pritisni i povuci na mjesto. I to je sve!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Dodavanje mene na tvoj Dock je jednostavno."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Skočni prozor je sakriven"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Shvatio/la sam"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Odaberi preglednik"; diff --git a/DuckDuckGo/hu.lproj/Localizable.strings b/DuckDuckGo/hu.lproj/Localizable.strings index 6e011c1d33..dbfb665421 100644 --- a/DuckDuckGo/hu.lproj/Localizable.strings +++ b/DuckDuckGo/hu.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Igen"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Kihagyás"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Böngészés indítása"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Mutasd meg, hogyan"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Ne feledd, minden alkalommal, amikor velem böngészel, egy undok hirdetés elveszíti az erejét.\n\nTehát tarts a Dockban a napi böngészéshez."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Könnyen elérhetsz a napi böngészés során."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Adj hozzá a Dockhoz!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Keresd meg a DuckDuckGo ikont a kezdőképernyőn. Ezután az ikont nyomva tartva húzd a helyére. Ennyi az egész!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Egyszerűen hozzáadhatsz a Dockhoz."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Felugró ablak elrejtve"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Megvan"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Böngésző kiválasztása"; diff --git a/DuckDuckGo/it.lproj/Localizable.strings b/DuckDuckGo/it.lproj/Localizable.strings index aa975129cd..d9712c048d 100644 --- a/DuckDuckGo/it.lproj/Localizable.strings +++ b/DuckDuckGo/it.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Sì"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Salta"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Inizia a navigare"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Dammi indicazioni"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Ricorda: quando navighi con me gli annunci inquietanti non possono seguirti.\n\nQuindi tienimi nel tuo dock per la navigazione quotidiana."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Sarò a portata di mano per tutta la tua navigazione quotidiana."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Aggiungimi al tuo dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Trova l'icona di DuckDuckGo sulla tua schermata Home. Quindi premi e trascinala nella posizione desiderata. Ecco fatto!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Aggiungermi al tuo dock è facile."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Popup nascosto"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Fatto"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Scegli il tuo browser"; diff --git a/DuckDuckGo/lt.lproj/Localizable.strings b/DuckDuckGo/lt.lproj/Localizable.strings index aefc629f07..117b42027f 100644 --- a/DuckDuckGo/lt.lproj/Localizable.strings +++ b/DuckDuckGo/lt.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Taip"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Praleisti"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Pradėti naršyti"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Parodyti, kaip"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Įsidėmėkite: kiekvieną kartą, kai naršote su manimi, bauginantis skelbimas praranda galią.\n\nTaigi laikykite mane savo juostoje, kad galėtumėte kasdien naršyti."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Mane lengvai pasieksite savo kasdienei naršymo veiklai."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Įtraukite mane į savo juostą!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Pagrindiniame ekrane raskite „DuckDuckGo“ piktogramą. Tada paspauskite ir vilkite ją į vietą. Štai ir viskas!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Įtraukti mane į savo juostą paprasta."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Iškylantysis langas paslėptas"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Supratau"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Pasirinkite naršyklę"; diff --git a/DuckDuckGo/lv.lproj/Localizable.strings b/DuckDuckGo/lv.lproj/Localizable.strings index 53a83ff1b3..0760667d91 100644 --- a/DuckDuckGo/lv.lproj/Localizable.strings +++ b/DuckDuckGo/lv.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Jā"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Izlaist"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Sākt pārlūkošanu"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Parādiet, kā"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Atceries: kad pārlūko Internetu ar mani, uzmācīgās reklāmas zaudē savu spēku.\n\nTāpēc turi mani dokā ikdienas pārlūkošanai."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Es būšu viegli sasniedzamā vietā tavai ikdienas pārlūkošanai."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Pievieno mani dokam!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Atrodi DuckDuckGo ikonu sākuma ekrānā. Pēc tam piespied un ievelc vietā. Tik vienkārši!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Viegli pievieno mani dokam."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Uznirstošais logs paslēpts"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Sapratu"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Izvēlies pārlūku"; diff --git a/DuckDuckGo/nb.lproj/Localizable.strings b/DuckDuckGo/nb.lproj/Localizable.strings index 5c75a162e9..eb37f0908e 100644 --- a/DuckDuckGo/nb.lproj/Localizable.strings +++ b/DuckDuckGo/nb.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ja"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Hopp over"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Begynn å surfe"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Vis meg hvordan"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Husk at hver gang du surfer med meg, klippes vingene på en slesk annonse.\n\nSå ha meg i docken din for daglig surfing."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Jeg ligger rede til å nettsurfe med deg hver dag."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Legg meg til i docken din!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Finn DuckDuckGo-ikonet på startskjermen. Trykk på det og dra det dit du vil ha det. Det er det hele!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Det er enkelt å legge meg til i docken din."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Popup-vindu skjult"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Den er grei"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Velg nettleseren din"; diff --git a/DuckDuckGo/nl.lproj/Localizable.strings b/DuckDuckGo/nl.lproj/Localizable.strings index 49b2ffc582..ac787a200c 100644 --- a/DuckDuckGo/nl.lproj/Localizable.strings +++ b/DuckDuckGo/nl.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ja"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Overslaan"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Beginnen met browsen"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Tonen"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Vergeet niet: elke keer als je met mij browset, verliest een enge advertentie haar kracht.\n\nHoud me dus in je Dock voor dagelijks gebruik."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Ik heb alles wat je nodig hebt om dagelijks te browsen."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Voeg me toe aan je dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Zoek het DuckDuckGo-pictogram op je startscherm. Houd het ingedrukt en sleep het naar zijn plaats. Dat is alles!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Voeg me eenvoudig toe aan je Dock."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pop-up verborgen"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Ik snap het"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Kies je browser"; diff --git a/DuckDuckGo/pl.lproj/Localizable.strings b/DuckDuckGo/pl.lproj/Localizable.strings index a82a482b04..7a65fbf6bf 100644 --- a/DuckDuckGo/pl.lproj/Localizable.strings +++ b/DuckDuckGo/pl.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Tak"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Pomiń"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Rozpocznij przeglądanie"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Pokaż, jak to zrobić"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Pamiętaj: za każdym razem, gdy przeglądasz ze mną Internet, jakaś wstrętna reklama przestaje działać.\n\nDlatego dodaj mnie do Docka na potrzeby codziennego przeglądania."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Będę w zasięgu ręki podczas codziennego przeglądania."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Dodaj mnie do Docka!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Znajdź ikonę DuckDuckGo na ekranie głównym. Następnie naciśnij i przeciągnij ją w odpowiednie miejsce. To wszystko!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Dodanie mnie do Docka jest łatwe."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Ukryte wyskakujące okienka"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Rozumiem"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Wybierz przeglądarkę"; diff --git a/DuckDuckGo/pt.lproj/Localizable.strings b/DuckDuckGo/pt.lproj/Localizable.strings index fbef6e16e2..f8b8487247 100644 --- a/DuckDuckGo/pt.lproj/Localizable.strings +++ b/DuckDuckGo/pt.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Sim"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Ignorar"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Iniciar a navegação"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Mostrar-me como"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Lembra-te: sempre que navegas comigo, um anúncio assustador perde as suas asas.\n\nPor isso, mantém-me na tua Dock para navegares diariamente."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Vou estar num lugar de fácil acesso para toda a tua navegação diária."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Adiciona-me à tua Dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Encontra o ícone do DuckDuckGo no ecrã inicial. Em seguida, prime e arrasta-o para o lugar certo. É só isto!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Adicionar-me à tua Dock é fácil."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pop-up ocultado"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Entendi"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Escolhe o teu navegador"; diff --git a/DuckDuckGo/ro.lproj/Localizable.strings b/DuckDuckGo/ro.lproj/Localizable.strings index a0d15fec4e..95b88cf50a 100644 --- a/DuckDuckGo/ro.lproj/Localizable.strings +++ b/DuckDuckGo/ro.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Da"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Ignorare"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Începe navigarea"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Arată-mi cum"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Reține, de fiecare dată când navighezi cu mine, o reclamă sinistră își pierde aripile.\n\nAșa că ține-mă în rândul de jos de pictograme pentru a naviga zilnic."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Îmi voi face cuibul la îndemână, pentru toată navigarea ta zilnică."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Adaugă-mă în rândul tău de jos de pictograme!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Găsește pictograma DuckDuckGo pe ecranul de pornire. Apoi apas-o și trage-o în poziție. Gata!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Este simplu să mă adaugi în rândul de jos de pictograme."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pop-up ascuns"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Am înțeles"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Alege browserul"; diff --git a/DuckDuckGo/ru.lproj/Localizable.strings b/DuckDuckGo/ru.lproj/Localizable.strings index 35e1e8e6da..33cb21334a 100644 --- a/DuckDuckGo/ru.lproj/Localizable.strings +++ b/DuckDuckGo/ru.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Да"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Пропустить"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Начать просмотр"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Показать, как"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Напоминаю: просматривая сайты с моей помощью, вы обезвреживаете коварную рекламу.\n\nПоэтому закрепите мой значок в док-панели."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Я устроюсь в удобном месте на каждый день."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Добавьте меня на док-панель!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Найдите значок DuckDuckGo на главном экране. Нажмите и перетащите его на панель. Все готово!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Добавить меня на док-панель очень просто."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Всплывающее окно скрыто"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Понятно"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Выбрать браузер"; diff --git a/DuckDuckGo/sk.lproj/Localizable.strings b/DuckDuckGo/sk.lproj/Localizable.strings index e3ef7a8a83..e695d5169d 100644 --- a/DuckDuckGo/sk.lproj/Localizable.strings +++ b/DuckDuckGo/sk.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Áno"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Preskočiť"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Začnite prehliadať"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Ukážte mi ako"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Pamätajte: zakaždým, keď prehliadate s nami, nepríjemnej reklame pristrihávate krídla.\n\nNechajte ma teda vo svojom Docku na každodenné prehliadanie."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Budem hniezdiť v ľahkom dosahu pre všetko vaše každodenné prehliadanie."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Pridajte ma do svojho Docku!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Nájdite ikonu DuckDuckGo na svojej domovskej obrazovke. Potom stlačte a potiahnite na miesto. To je všetko!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Pridanie ma do doku je jednoduché."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Kontextové okno je skryté"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Rozumiem"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Vyberte si prehliadač"; diff --git a/DuckDuckGo/sl.lproj/Localizable.strings b/DuckDuckGo/sl.lproj/Localizable.strings index 08fd2dde74..7e79dd1cbd 100644 --- a/DuckDuckGo/sl.lproj/Localizable.strings +++ b/DuckDuckGo/sl.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Da"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Preskoči"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Začni brskanje"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Pokaži mi, kako"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Ne pozabite: Vedno kadar brskate z mano, grozljivemu oglasu pristrižete krila.\n\nZato me imejte na domačem zaslonu za vsakodnevno brskanje."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Ugnezdil se bom na dosegu roke za vsakodnevno brskanje."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Dodajte me na svoj domači zaslon!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Poiščite ikono DuckDuckGo na domačem zaslonu. Nato jo pritisnite in povlecite na svoje mesto. To je to!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Na svoj domači zaslon me lahko dodate povsem preprosto"; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Pojavno okno je skrito"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Razumem"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Izberite brskalnik"; diff --git a/DuckDuckGo/sv.lproj/Localizable.strings b/DuckDuckGo/sv.lproj/Localizable.strings index 8b073384b5..4e82a701be 100644 --- a/DuckDuckGo/sv.lproj/Localizable.strings +++ b/DuckDuckGo/sv.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Ja"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Hoppa över"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Börja bläddra"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Visa mig hur"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Kom ihåg att varje gång du surfar med mig förlorar en påträngande annons sina vingar.\n\nSå spara mig i din Dock för ditt dagliga surfande."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Jag kommer att hålla mig nära för allt ditt dagliga surfande."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Lägg till mig i din Dock!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Leta upp DuckDuckGo-ikonen på hemskärmen. Tryck och dra den därefter på plats. Sen är det klart!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Det är enkelt att lägga till mig i din Dock."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Popup-fönster dolt"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Jag fattar"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Välj din webbläsare"; diff --git a/DuckDuckGo/tr.lproj/Localizable.strings b/DuckDuckGo/tr.lproj/Localizable.strings index abaf73d410..52e1dc4c0c 100644 --- a/DuckDuckGo/tr.lproj/Localizable.strings +++ b/DuckDuckGo/tr.lproj/Localizable.strings @@ -770,6 +770,30 @@ /* Button to answer question 'Did turning off protections resolve the issue on this site?' */ "broken.site.report.toggle.alert.yes.button" = "Evet"; +/* Button to continue the onboarding process */ +"contextual.onboarding.addToDock.buttons.skip" = "Atla"; + +/* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ +"contextual.onboarding.addToDock.buttons.startBrowsing" = "Gezinmeye Başla"; + +/* Button of the onboarding dialog. On click it shows a dialog with a tutorial video about how to add the DDG browser icon to the device dock. */ +"contextual.onboarding.addToDock.buttons.tutorial" = "Nasıl Yapılacağını Göster"; + +/* Message of the last screen of the onboarding that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.contextual.message" = "Unutmayın: Benimle her gezinti yaptığınızda rahatsız edici bir reklam kanatlarını kaybeder.\n\nO yüzden günlük gezintileriniz için beni Dock'unuzda tutun."; + +/* The message of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.intro.message" = "Tüm günlük gezinmeleriniz için kolay erişilebilir bir yere yuvalanacağım."; + +/* The title of the onboarding dialog popup that promotes adding the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.promo.title" = "Beni Dock'a ekleyin!"; + +/* The message of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.message" = "Ana Ekranınızda DuckDuckGo simgesini bulun. Daha sonra simgeye basıp sürükleyerek yerine sabitleyin. Hepsi bu kadar!"; + +/* The title of the onboarding dialog popup that explains how to add the DDG browser icon to the dock. */ +"contextual.onboarding.addToDock.tutorial.title" = "Beni Dock'unuza eklemek çok kolay."; + /* First parameter is a count of additional trackers, second and third are names of the tracker networks (strings) */ "contextual.onboarding.browsing.multiple.trackers" = "contextual.onboarding.browsing.multiple.trackers"; @@ -1784,6 +1808,9 @@ /* Text displayed on notification appearing in the address bar when the browser hides a cookie popup */ "omnibar.notification.popup-hidden" = "Açılır Pencere Gizli"; +/* Button on the Add to Dock tutorial screen of the onboarding, it will proceed to the next step of the onboarding. */ +"onboarding.addToDock.buttons.gotIt" = "Anladım"; + /* Button to change the default browser */ "onboarding.browsers.cta" = "Tarayıcınızı Seçin"; diff --git a/DuckDuckGoTests/AutocompleteSuggestionsDataSourceTests.swift b/DuckDuckGoTests/AutocompleteSuggestionsDataSourceTests.swift new file mode 100644 index 0000000000..29ea8e5636 --- /dev/null +++ b/DuckDuckGoTests/AutocompleteSuggestionsDataSourceTests.swift @@ -0,0 +1,151 @@ +// +// AutocompleteSuggestionsDataSourceTests.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +import XCTest +import Persistence +import CoreData +import Bookmarks +import BrowserServicesKit +import Suggestions +import History + +@testable import Core +@testable import DuckDuckGo +@testable import TestUtils + +final class AutocompleteSuggestionsDataSourceTests: XCTestCase { + + var db: CoreDataDatabase! + var mainContext: NSManagedObjectContext! + + override func setUpWithError() throws { + try super.setUpWithError() + + let model = CoreDataDatabase.loadModel(from: Bookmarks.bundle, named: "BookmarksModel")! + + db = CoreDataDatabase(name: "Test", containerLocation: tempDBDir(), model: model) + db.loadStore() + + self.mainContext = db.makeContext(concurrencyType: .mainQueueConcurrencyType, name: "TestContext") + BasicBookmarksStructure.populateDB(context: mainContext) + } + + override func tearDown() { + try? db.tearDown(deleteStores: true) + } + + func testDataSourceReturnsHistory() { + let dataSource = makeDataSource(tabsEnabled: false) + XCTAssertEqual(dataSource.history(for: MockSuggestionLoading()).count, 2) + } + + func testWhenSuggestTabsFeatureIsDisable_ThenNoTabsReturned() { + let dataSource = makeDataSource(tabsEnabled: false) + + let result = dataSource.openTabs(for: MockSuggestionLoading()) + XCTAssertTrue(result.isEmpty) + } + + func testWhenSuggestTabsFeatureIsEnabled_ThenProvidesOpenTabsExcludingCurrent() { + let dataSource = makeDataSource() + + // Current tab is the last one added, which has two tabs with the same URL, so only 2 of the 4 will be returned. + let result = dataSource.openTabs(for: MockSuggestionLoading()) + XCTAssertEqual(result.count, 2) + XCTAssertEqual("Different", result[0].title) + XCTAssertEqual("DDG", result[1].title) + } + + func testDataSourceReturnsBookmarks() { + let dataSource = makeDataSource() + let bookmarks = dataSource.bookmarks(for: MockSuggestionLoading()) + XCTAssertEqual(bookmarks.count, 5) + } + + func testDataSourceReturnsEmptyInternalPages() { + let dataSource = makeDataSource() + XCTAssertTrue(dataSource.internalPages(for: MockSuggestionLoading()).isEmpty) + } + + private func makeDataSource(tabsEnabled: Bool = true) -> AutocompleteSuggestionsDataSource { + + var mockHistoryCoordinator = MockHistoryCoordinator() + mockHistoryCoordinator.history = [ + makeHistory(.appStore, "App Store"), + makeHistory(.mac, "DDG for macOS") + ] + // mockHistoryCoordinator. + + return AutocompleteSuggestionsDataSource( + historyManager: MockHistoryManager(historyCoordinator: mockHistoryCoordinator, isEnabledByUser: true, historyFeatureEnabled: true), + bookmarksDatabase: db, + featureFlagger: makeFeatureFlagger(tabsEnabled: tabsEnabled), + tabsModel: makeTabsModel()) { _, completion in + completion("[]".data(using: .utf8), nil) + } + } + + private func makeFeatureFlagger(tabsEnabled: Bool = true) -> FeatureFlagger { + let mock = MockFeatureFlagger() + if tabsEnabled { + mock.enabledFeatureFlags.append(.autcompleteTabs) + } + return mock + } + + private func makeTabsModel() -> TabsModel { + let model = TabsModel(desktop: false) + model.add(tab: Tab(uid: "uid1", link: Link(title: "Example", url: URL(string: "https://example.com")!))) + model.add(tab: Tab(uid: "uid2", link: Link(title: "Different", url: URL(string: "https://different.com")!))) + model.add(tab: Tab(uid: "uid3", link: Link(title: "DDG", url: URL(string: "https://duckduckgo.com")!))) + model.add(tab: Tab(uid: "uid4", link: Link(title: "Example", url: URL(string: "https://example.com")!))) + return model + } + + private func makeHistory(_ url: URL, _ title: String) -> HistoryEntry { + .init(identifier: UUID(), + url: url, + title: title, + failedToLoad: false, + numberOfTotalVisits: 0, + lastVisit: Date(), + visits: .init(), + numberOfTrackersBlocked: 0, + blockedTrackingEntities: .init(), + trackersFound: false) + } + +} + +final class MockSuggestionLoading: SuggestionLoading { + func getSuggestions(query: Query, usingDataSource dataSource: any SuggestionLoadingDataSource, completion: @escaping (SuggestionResult?, (any Error)?) -> Void) { + } +} + +private extension MenuBookmarksViewModel { + + convenience init(bookmarksDatabase: CoreDataDatabase) { + self.init(bookmarksDatabase: bookmarksDatabase, + errorEvents: .init(mapping: { event, _, _, _ in + XCTFail("Unexpected error: \(event)") + })) + } +} diff --git a/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift b/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift index 23d5d06c5f..f9641c8fd1 100644 --- a/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift +++ b/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift @@ -24,41 +24,6 @@ import BrowserServicesKit final class DefaultVariantManagerOnboardingTests: XCTestCase { - // MARK: - Is New Intro Flow - - func testWhenIsNewIntroFlow_AndFeatureIsNewOnboardingIntro_ThenReturnTrue() { - // GIVEN - let sut = makeVariantManager(features: [.newOnboardingIntro]) - - // WHEN - let result = sut.isNewIntroFlow - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsNewIntroFlow_AndFeaturesContainNewOnboardingIntroHighlights_ThenReturnTrue() { - // GIVEN - let sut = makeVariantManager(features: [.newOnboardingIntroHighlights]) - - // WHEN - let result = sut.isNewIntroFlow - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsNewIntroFlow_AndFeaturesDoNotContainNewOnboardingIntroOrNewOnboardingIntroHighlights_ThenReturnFalse() { - // GIVEN - let sut = makeVariantManager(features: [.contextualDaxDialogs]) - - // WHEN - let result = sut.isNewIntroFlow - - // THEN - XCTAssertFalse(result) - } - // MARK: - Is Onboarding Highlights func testWhenIsOnboardingHighlights_AndFeaturesContainOnboardingHighlights_ThenReturnTrue() { diff --git a/DuckDuckGoTests/MockFeatureFlagger.swift b/DuckDuckGoTests/MockFeatureFlagger.swift index 1d2c8d642b..5434453927 100644 --- a/DuckDuckGoTests/MockFeatureFlagger.swift +++ b/DuckDuckGoTests/MockFeatureFlagger.swift @@ -21,8 +21,8 @@ import BrowserServicesKit import Core final class MockFeatureFlagger: FeatureFlagger { + var enabledFeatureFlags: [FeatureFlag] = [] - var enabledFeatureFlag: FeatureFlag? func isFeatureOn(forProvider provider: F) -> Bool where F: BrowserServicesKit.FeatureFlagSourceProviding { guard let flag = provider as? FeatureFlag else {