diff --git a/app/src/main/res/drawable/ic_try_for_free_pill.xml b/android-design-system/design-system/src/main/res/drawable/ic_try_for_free_pill.xml similarity index 100% rename from app/src/main/res/drawable/ic_try_for_free_pill.xml rename to android-design-system/design-system/src/main/res/drawable/ic_try_for_free_pill.xml diff --git a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt index 2773a6d15f6e..6fb01bcf6ab1 100644 --- a/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/app/browser/BrowserTabViewModelTest.kt @@ -132,7 +132,6 @@ import com.duckduckgo.app.browser.viewstate.FindInPageViewState import com.duckduckgo.app.browser.viewstate.GlobalLayoutViewState import com.duckduckgo.app.browser.viewstate.HighlightableButton import com.duckduckgo.app.browser.viewstate.LoadingViewState -import com.duckduckgo.app.browser.viewstate.VpnMenuState import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout.Action.LearnMore import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout.Action.LeaveSite import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout.Action.ReportError @@ -225,6 +224,7 @@ import com.duckduckgo.browser.api.autocomplete.AutoComplete.AutoCompleteSuggesti import com.duckduckgo.browser.api.autocomplete.AutoCompleteSettings import com.duckduckgo.browser.api.brokensite.BrokenSiteContext import com.duckduckgo.browser.api.webviewcompat.WebViewCompatWrapper +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.test.CoroutineTestRule import com.duckduckgo.common.test.InstantSchedulersRule import com.duckduckgo.common.ui.tabs.SwipingTabsFeature diff --git a/app/src/androidTest/java/com/duckduckgo/espresso/BasicJourneyTest.kt b/app/src/androidTest/java/com/duckduckgo/espresso/BasicJourneyTest.kt index 2f639c106cd6..4540bc5084a9 100644 --- a/app/src/androidTest/java/com/duckduckgo/espresso/BasicJourneyTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/espresso/BasicJourneyTest.kt @@ -49,6 +49,6 @@ class BasicJourneyTest { onView(allOf(withId(R.id.browserMenu), isClickable())).perform(click()) // check that the forward arrow is visible - onView(withId(R.id.forwardMenuItem)).check(matches(isDisplayed())) + onView(withContentDescription("Forward")).check(matches(isDisplayed())) } } diff --git a/app/src/androidTest/java/com/duckduckgo/espresso/DaxDialogsJourneyTest.kt b/app/src/androidTest/java/com/duckduckgo/espresso/DaxDialogsJourneyTest.kt index e3c2877d5c01..5ceb206aa126 100644 --- a/app/src/androidTest/java/com/duckduckgo/espresso/DaxDialogsJourneyTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/espresso/DaxDialogsJourneyTest.kt @@ -57,6 +57,6 @@ class DaxDialogsJourneyTest { onView(isRoot()).perform(waitForView(withId(R.id.browserMenu))) onView(allOf(withId(R.id.browserMenu), isClickable())).perform(click()) - onView(withId(R.id.forwardMenuItem)).check(matches(isDisplayed())) + onView(withContentDescription("Forward")).check(matches(isDisplayed())) } } diff --git a/app/src/androidTest/java/com/duckduckgo/espresso/privacy/RequestBlockingTest.kt b/app/src/androidTest/java/com/duckduckgo/espresso/privacy/RequestBlockingTest.kt index 50f1e71ab03b..c6b028d1c010 100644 --- a/app/src/androidTest/java/com/duckduckgo/espresso/privacy/RequestBlockingTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/espresso/privacy/RequestBlockingTest.kt @@ -88,8 +88,8 @@ class RequestBlockingTest { IdlingRegistry.getInstance().register(idlingResourceForDisableProtections) onView(allOf(withId(R.id.browserMenu), isClickable())).perform(click()) - onView(isRoot()).perform(waitForView(withId(R.id.privacyProtectionMenuItem))) - onView(withId(R.id.privacyProtectionMenuItem)).perform(click()) + onView(isRoot()).perform(waitForView(withText("Disable Privacy Protection"))) + onView(withText("Disable Privacy Protection")).perform(click()) // handle the privacy protection toggle check screen showing onView(isRoot()).perform(ViewActions.pressBack()) diff --git a/app/src/androidTest/java/com/duckduckgo/espresso/privacy/SurrogatesTest.kt b/app/src/androidTest/java/com/duckduckgo/espresso/privacy/SurrogatesTest.kt index e459d734d775..7bd32b5a58e3 100644 --- a/app/src/androidTest/java/com/duckduckgo/espresso/privacy/SurrogatesTest.kt +++ b/app/src/androidTest/java/com/duckduckgo/espresso/privacy/SurrogatesTest.kt @@ -95,8 +95,8 @@ class SurrogatesTest { IdlingRegistry.getInstance().register(idlingResourceForDisableProtections) onView(allOf(withId(R.id.browserMenu), isClickable())).perform(ViewActions.click()) - onView(isRoot()).perform(waitForView(withId(R.id.privacyProtectionMenuItem))) - onView(withId(R.id.privacyProtectionMenuItem)).perform(ViewActions.click()) + onView(isRoot()).perform(waitForView(withText("Disable Privacy Protection"))) + onView(withText("Disable Privacy Protection")).perform(ViewActions.click()) // handle the privacy protection toggle check screen showing onView(isRoot()).perform(ViewActions.pressBack()) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt index 27cbe54bfe79..7479dcdacf5c 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabFragment.kt @@ -136,7 +136,7 @@ import com.duckduckgo.app.browser.history.NavigationHistorySheet import com.duckduckgo.app.browser.history.NavigationHistorySheet.NavigationHistorySheetListener import com.duckduckgo.app.browser.httpauth.WebViewHttpAuthStore import com.duckduckgo.app.browser.logindetection.DOMLoginDetector -import com.duckduckgo.app.browser.menu.BrowserPopupMenu +import com.duckduckgo.app.browser.menu.BrowserMenuViewStateFactory import com.duckduckgo.app.browser.menu.VpnMenuStore import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials import com.duckduckgo.app.browser.model.BasicAuthenticationRequest @@ -178,7 +178,6 @@ import com.duckduckgo.app.browser.viewstate.LoadingViewState import com.duckduckgo.app.browser.viewstate.OmnibarViewState import com.duckduckgo.app.browser.viewstate.PrivacyShieldViewState import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState -import com.duckduckgo.app.browser.viewstate.VpnMenuState import com.duckduckgo.app.browser.webauthn.WebViewPasskeyInitializer import com.duckduckgo.app.browser.webshare.WebShareChooser import com.duckduckgo.app.browser.webshare.WebViewCompatWebShareChooser @@ -253,6 +252,8 @@ import com.duckduckgo.browser.api.ui.BrowserScreens.PrivateSearchScreenNoParams import com.duckduckgo.browser.api.ui.BrowserScreens.WebViewActivityWithParams import com.duckduckgo.browser.api.webviewcompat.WebViewCompatWrapper import com.duckduckgo.browser.ui.autocomplete.BrowserAutoCompleteSuggestionsAdapter +import com.duckduckgo.browser.ui.browsermenu.BrowserMenu +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.ui.DuckDuckGoActivity import com.duckduckgo.common.ui.DuckDuckGoFragment import com.duckduckgo.common.ui.store.BrowserAppTheme @@ -614,7 +615,7 @@ class BrowserTabFragment : private val skipHome get() = requireArguments().getBoolean(SKIP_HOME_ARG) - private lateinit var popupMenu: BrowserPopupMenu + private lateinit var popupMenu: BrowserMenu private lateinit var ctaBottomSheet: PromoBottomSheetDialog private lateinit var widgetBottomSheetDialog: AlternativeHomeScreenWidgetBottomSheetDialog @@ -1313,17 +1314,11 @@ class BrowserTabFragment : } private fun createPopupMenu() { - val popupMenuResourceType = - when (omnibar.omnibarType) { - OmnibarType.SINGLE_TOP -> BrowserPopupMenu.ResourceType.TOP - OmnibarType.SINGLE_BOTTOM, OmnibarType.SPLIT -> BrowserPopupMenu.ResourceType.BOTTOM - } - popupMenu = - BrowserPopupMenu( + BrowserMenu( context = requireContext(), layoutInflater = layoutInflater, - popupMenuResourceType = popupMenuResourceType, + omnibarType = omnibar.omnibarType, ) popupMenu.apply { onMenuItemClicked(forwardMenuItem) { @@ -1443,7 +1438,6 @@ class BrowserTabFragment : private fun launchPopupMenu(anchorToNavigationBar: Boolean, addExtraDelay: Boolean = false) { val isFocusedNtp = omnibar.viewMode == ViewMode.NewTab && omnibar.getText().isEmpty() && omnibar.omnibarTextInput.hasFocus() - val delay = if (addExtraDelay) POPUP_MENU_DELAY * 2 else POPUP_MENU_DELAY // small delay added to let keyboard disappear and avoid jarring transition binding.rootView.postDelayed(delay) { @@ -1456,7 +1450,6 @@ class BrowserTabFragment : vpnMenuStore.incrementVpnMenuShownCount() } } - if (anchorToNavigationBar) { val anchorView = browserNavigationBarIntegration.navigationBarView.popupMenuAnchor popupMenu.showAnchoredView(requireActivity(), binding.rootView, anchorView) @@ -1778,6 +1771,16 @@ class BrowserTabFragment : browserNavigationBarIntegration.configureBrowserViewMode() } + private fun showDuckAI(browserViewState: BrowserViewState) { + val browseMenuState = BrowserMenuViewStateFactory.create( + omnibarViewMode = ViewMode.DuckAI, + viewState = browserViewState, + customTabsMode = tabDisplayedInCustomTabScreen, + ) + popupMenu.render(browseMenuState) + omnibar.setViewMode(ViewMode.DuckAI) + } + private fun showMaliciousWarning( siteUrl: Uri, feed: Feed, @@ -2362,7 +2365,7 @@ class BrowserTabFragment : is Command.SubmitChat -> duckChat.openDuckChatWithAutoPrompt(it.query) is Command.EnqueueCookiesAnimation -> enqueueCookiesAnimation(it.isCosmetic) is Command.PageStarted -> onPageStarted() - is Command.EnableDuckAIFullScreen -> omnibar.setViewMode(ViewMode.DuckAI) + is Command.EnableDuckAIFullScreen -> showDuckAI(it.browserViewState) is Command.DisableDuckAIFullScreen -> omnibar.setViewMode(ViewMode.Browser(it.url)) } } @@ -4613,7 +4616,13 @@ class BrowserTabFragment : browserNavigationBarIntegration.configureFireButtonHighlight(highlighted = viewState.fireButton.isHighlighted()) - popupMenu.renderState(browserShowing, viewState, tabDisplayedInCustomTabScreen) + val browseMenuState = BrowserMenuViewStateFactory.create( + omnibarViewMode = omnibar.viewMode, + viewState = viewState, + customTabsMode = tabDisplayedInCustomTabScreen, + ) + logcat { "BrowserMenu: viewMode ${omnibar.viewMode} render browseMenuState $browseMenuState" } + popupMenu.render(browseMenuState) renderFullscreenMode(viewState) privacyProtectionsPopup.setViewState(viewState.privacyProtectionsPopupViewState) diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index d9612e659cc0..2866abdda9a8 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -214,7 +214,6 @@ import com.duckduckgo.app.browser.viewstate.LoadingViewState import com.duckduckgo.app.browser.viewstate.OmnibarViewState import com.duckduckgo.app.browser.viewstate.PrivacyShieldViewState import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState -import com.duckduckgo.app.browser.viewstate.VpnMenuState import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout.Action.LearnMore import com.duckduckgo.app.browser.webview.MaliciousSiteBlockedWarningLayout.Action.LeaveSite @@ -295,6 +294,7 @@ import com.duckduckgo.browser.api.brokensite.BrokenSiteData import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.MENU import com.duckduckgo.browser.api.brokensite.BrokenSiteData.ReportFlow.RELOAD_THREE_TIMES_WITHIN_20_SECONDS import com.duckduckgo.browser.api.webviewcompat.WebViewCompatWrapper +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.ui.tabs.SwipingTabsFeatureProvider import com.duckduckgo.common.utils.AppUrl import com.duckduckgo.common.utils.AppUrl.ParamKey.QUERY @@ -1969,7 +1969,7 @@ class BrowserTabViewModel @Inject constructor( if (duckAiFeatureState.showFullScreenMode.value) { if (duckDuckGoUrlDetector.isDuckDuckGoChatUrl(it)) { logcat { "Duck.ai: AI Chat page loaded $it" } - command.value = Command.EnableDuckAIFullScreen + command.value = Command.EnableDuckAIFullScreen(currentBrowserViewState()) } else { command.value = Command.DisableDuckAIFullScreen(url) } diff --git a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt index a091be545425..f7a2fb11d7cc 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/commands/Command.kt @@ -35,6 +35,7 @@ import com.duckduckgo.app.browser.WebViewErrorResponse import com.duckduckgo.app.browser.history.NavigationHistoryEntry import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials import com.duckduckgo.app.browser.model.BasicAuthenticationRequest +import com.duckduckgo.app.browser.viewstate.BrowserViewState import com.duckduckgo.app.browser.viewstate.SavedSiteChangedViewState import com.duckduckgo.app.cta.ui.BrokenSitePromptDialogCta import com.duckduckgo.app.cta.ui.DaxBubbleCta @@ -504,6 +505,6 @@ sealed class Command { ) : Command() data object PageStarted : Command() - data object EnableDuckAIFullScreen : Command() + data class EnableDuckAIFullScreen(val browserViewState: BrowserViewState) : Command() data class DisableDuckAIFullScreen(val url: String) : Command() } diff --git a/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserMenuViewStateFactory.kt b/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserMenuViewStateFactory.kt new file mode 100644 index 000000000000..e22c99818348 --- /dev/null +++ b/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserMenuViewStateFactory.kt @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2025 DuckDuckGo + * + * 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. + */ + +package com.duckduckgo.app.browser.menu + +import com.duckduckgo.app.browser.SSLErrorType.NONE +import com.duckduckgo.app.browser.omnibar.Omnibar +import com.duckduckgo.app.browser.viewstate.BrowserViewState +import com.duckduckgo.browser.ui.browsermenu.BrowserMenuViewState + +object BrowserMenuViewStateFactory { + fun create( + omnibarViewMode: Omnibar.ViewMode, + viewState: BrowserViewState, + customTabsMode: Boolean, + ): BrowserMenuViewState { + return if (customTabsMode) { + createCustomTabsViewState(viewState) + } else { + when (omnibarViewMode) { + Omnibar.ViewMode.NewTab -> createNewTabPageViewState(viewState) + Omnibar.ViewMode.DuckAI -> createDuckAiViewState(viewState) + Omnibar.ViewMode.Error -> createNewTabPageViewState(viewState) + Omnibar.ViewMode.SSLWarning -> createNewTabPageViewState(viewState) + Omnibar.ViewMode.MaliciousSiteWarning -> createNewTabPageViewState(viewState) + else -> createBrowserViewState(browserViewState = viewState) + } + } + } + + private fun createCustomTabsViewState( + browserViewState: BrowserViewState, + ): BrowserMenuViewState.CustomTabs { + return BrowserMenuViewState.CustomTabs( + canGoBack = browserViewState.canGoBack, + canGoForward = browserViewState.canGoForward, + canSharePage = browserViewState.canSharePage, + canChangeBrowsingMode = browserViewState.canChangeBrowsingMode, + isDesktopBrowsingMode = browserViewState.isDesktopBrowsingMode, + canChangePrivacyProtection = browserViewState.canChangePrivacyProtection, + isPrivacyProtectionDisabled = browserViewState.isPrivacyProtectionDisabled, + ) + } + + private fun createNewTabPageViewState( + browserViewState: BrowserViewState, + ): BrowserMenuViewState.NewTabPage { + return BrowserMenuViewState.NewTabPage( + showDuckChatOption = browserViewState.showDuckChatOption, + vpnMenuState = browserViewState.vpnMenuState, + showAutofill = browserViewState.showAutofill, + ) + } + + private fun createDuckAiViewState( + browserViewState: BrowserViewState, + ): BrowserMenuViewState.DuckAi { + return BrowserMenuViewState.DuckAi( + canPrintPage = browserViewState.canPrintPage, + canReportSite = browserViewState.canReportSite, + ) + } + + private fun createBrowserViewState( + browserViewState: BrowserViewState, + ): BrowserMenuViewState.Browser { + return BrowserMenuViewState.Browser( + canGoBack = browserViewState.canGoBack, + canGoForward = browserViewState.canGoForward, + showDuckChatOption = browserViewState.showDuckChatOption, + canSharePage = browserViewState.canSharePage, + showSelectDefaultBrowserMenuItem = browserViewState.showSelectDefaultBrowserMenuItem, + canSaveSite = browserViewState.canSaveSite, + isBookmark = browserViewState.bookmark != null, + canFireproofSite = browserViewState.canFireproofSite, + isFireproofWebsite = browserViewState.isFireproofWebsite, + isEmailSignedIn = browserViewState.isEmailSignedIn, + canChangeBrowsingMode = browserViewState.canChangeBrowsingMode, + isDesktopBrowsingMode = browserViewState.isDesktopBrowsingMode, + hasPreviousAppLink = browserViewState.previousAppLink != null, + canFindInPage = browserViewState.canFindInPage, + addToHomeVisible = browserViewState.addToHomeVisible, + addToHomeEnabled = browserViewState.addToHomeEnabled, + canChangePrivacyProtection = browserViewState.canChangePrivacyProtection, + isPrivacyProtectionDisabled = browserViewState.isPrivacyProtectionDisabled, + canReportSite = browserViewState.canReportSite, + showAutofill = browserViewState.showAutofill, + isSSLError = browserViewState.sslError != NONE, + canPrintPage = browserViewState.canPrintPage, + ) + } +} diff --git a/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserPopupMenu.kt b/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserPopupMenu.kt deleted file mode 100644 index c3681c2a86c2..000000000000 --- a/app/src/main/java/com/duckduckgo/app/browser/menu/BrowserPopupMenu.kt +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (c) 2022 DuckDuckGo - * - * 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. - */ - -package com.duckduckgo.app.browser.menu - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import androidx.core.view.isVisible -import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.SSLErrorType.NONE -import com.duckduckgo.app.browser.databinding.PopupWindowBrowserMenuBinding -import com.duckduckgo.app.browser.databinding.PopupWindowBrowserMenuBottomBinding -import com.duckduckgo.app.browser.menu.BrowserPopupMenu.ResourceType.BOTTOM -import com.duckduckgo.app.browser.menu.BrowserPopupMenu.ResourceType.TOP -import com.duckduckgo.app.browser.viewstate.BrowserViewState -import com.duckduckgo.app.browser.viewstate.VpnMenuState -import com.duckduckgo.common.ui.menu.PopupMenu -import com.duckduckgo.common.ui.view.MenuItemView -import com.duckduckgo.common.ui.view.StatusIndicatorView -import com.duckduckgo.mobile.android.R.drawable - -class BrowserPopupMenu( - private val context: Context, - layoutInflater: LayoutInflater, - private val popupMenuResourceType: ResourceType, -) : PopupMenu( - layoutInflater, - resourceId = if (popupMenuResourceType == TOP) R.layout.popup_window_browser_menu else R.layout.popup_window_browser_menu_bottom, - width = context.resources.getDimensionPixelSize(R.dimen.browserPopupMenuWidth), -) { - private val topBinding = PopupWindowBrowserMenuBinding.bind(contentView) - private val bottomBinding = PopupWindowBrowserMenuBottomBinding.bind(contentView) - - init { - contentView = - when (popupMenuResourceType) { - TOP -> topBinding.root - BOTTOM -> bottomBinding.root - } - } - - internal val backMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.backMenuItem - BOTTOM -> bottomBinding.backMenuItem - } - } - - internal val forwardMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.forwardMenuItem - BOTTOM -> bottomBinding.forwardMenuItem - } - } - - internal val refreshMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.refreshMenuItem - BOTTOM -> bottomBinding.refreshMenuItem - } - } - - internal val printPageMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.printPageMenuItem - BOTTOM -> bottomBinding.printPageMenuItem - } - } - - internal val newTabMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.newTabMenuItem - BOTTOM -> bottomBinding.newTabMenuItem - } - } - - internal val defaultBrowserMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.includeDefaultBrowserMenuItem.defaultBrowserMenuItem - BOTTOM -> bottomBinding.includeDefaultBrowserMenuItem.defaultBrowserMenuItem - } - } - - internal val vpnMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.includeVpnMenuItem.vpnMenuItem - BOTTOM -> bottomBinding.includeVpnMenuItem.vpnMenuItem - } - } - - internal val duckChatMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.includeDuckChatMenuItem.duckChatMenuItem - BOTTOM -> bottomBinding.includeDuckChatMenuItem.duckChatMenuItem - } - } - - internal val sharePageMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.sharePageMenuItem - BOTTOM -> bottomBinding.sharePageMenuItem - } - } - - internal val bookmarksMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.bookmarksMenuItem - BOTTOM -> bottomBinding.bookmarksMenuItem - } - } - - internal val downloadsMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.downloadsMenuItem - BOTTOM -> bottomBinding.downloadsMenuItem - } - } - - internal val settingsMenuItem: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.settingsMenuItem - BOTTOM -> bottomBinding.settingsMenuItem - } - } - - internal val addBookmarksMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.addBookmarksMenuItem - BOTTOM -> bottomBinding.addBookmarksMenuItem - } - } - - internal val fireproofWebsiteMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.fireproofWebsiteMenuItem - BOTTOM -> bottomBinding.fireproofWebsiteMenuItem - } - } - - internal val createAliasMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.createAliasMenuItem - BOTTOM -> bottomBinding.createAliasMenuItem - } - } - - internal val changeBrowserModeMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.changeBrowserModeMenuItem - BOTTOM -> bottomBinding.changeBrowserModeMenuItem - } - } - - internal val openInAppMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.openInAppMenuItem - BOTTOM -> bottomBinding.openInAppMenuItem - } - } - - internal val findInPageMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.findInPageMenuItem - BOTTOM -> bottomBinding.findInPageMenuItem - } - } - - internal val addToHomeMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.addToHomeMenuItem - BOTTOM -> bottomBinding.addToHomeMenuItem - } - } - - internal val privacyProtectionMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.privacyProtectionMenuItem - BOTTOM -> bottomBinding.privacyProtectionMenuItem - } - } - - internal val brokenSiteMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.brokenSiteMenuItem - BOTTOM -> bottomBinding.brokenSiteMenuItem - } - } - - internal val autofillMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.autofillMenuItem - BOTTOM -> bottomBinding.autofillMenuItem - } - } - - internal val runningInDdgBrowserMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.runningInDdgBrowserMenuItem - BOTTOM -> bottomBinding.runningInDdgBrowserMenuItem - } - } - - internal val siteOptionsMenuDivider: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.siteOptionsMenuDivider - BOTTOM -> bottomBinding.siteOptionsMenuDivider - } - } - - internal val browserOptionsMenuDivider: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.browserOptionsMenuDivider - BOTTOM -> bottomBinding.browserOptionsMenuDivider - } - } - - internal val settingsMenuDivider: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.settingsMenuDivider - BOTTOM -> bottomBinding.settingsMenuDivider - } - } - - internal val customTabsMenuDivider: View by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.customTabsMenuDivider - BOTTOM -> bottomBinding.customTabsMenuDivider - } - } - - internal val openInDdgBrowserMenuItem: MenuItemView by lazy { - when (popupMenuResourceType) { - TOP -> topBinding.openInDdgBrowserMenuItem - BOTTOM -> bottomBinding.openInDdgBrowserMenuItem - } - } - - fun renderState( - browserShowing: Boolean, - viewState: BrowserViewState, - displayedInCustomTabScreen: Boolean, - ) { - backMenuItem.isEnabled = viewState.canGoBack - forwardMenuItem.isEnabled = viewState.canGoForward - refreshMenuItem.isEnabled = browserShowing - - printPageMenuItem.isEnabled = browserShowing - - newTabMenuItem.isVisible = !displayedInCustomTabScreen - duckChatMenuItem.isVisible = viewState.showDuckChatOption && !displayedInCustomTabScreen - sharePageMenuItem.isVisible = viewState.canSharePage - - defaultBrowserMenuItem.isVisible = viewState.showSelectDefaultBrowserMenuItem - - configureVpnMenuItem(viewState, browserShowing, displayedInCustomTabScreen) - - bookmarksMenuItem.isVisible = !displayedInCustomTabScreen - downloadsMenuItem.isVisible = !displayedInCustomTabScreen - settingsMenuItem.isVisible = !displayedInCustomTabScreen - - addBookmarksMenuItem.isVisible = viewState.canSaveSite && !displayedInCustomTabScreen - val isBookmark = viewState.bookmark != null - addBookmarksMenuItem.label { - context.getString(if (isBookmark) R.string.editBookmarkMenuTitle else R.string.addBookmarkMenuTitle) - } - addBookmarksMenuItem.setIcon(if (isBookmark) drawable.ic_bookmark_solid_16 else drawable.ic_bookmark_16) - - fireproofWebsiteMenuItem.isVisible = viewState.canFireproofSite && !displayedInCustomTabScreen - fireproofWebsiteMenuItem.label { - context.getString( - if (viewState.isFireproofWebsite) { - R.string.fireproofWebsiteMenuTitleRemove - } else { - R.string.fireproofWebsiteMenuTitleAdd - }, - ) - } - fireproofWebsiteMenuItem.setIcon(if (viewState.isFireproofWebsite) drawable.ic_fire_16 else drawable.ic_fireproof_solid_16) - - createAliasMenuItem.isVisible = viewState.isEmailSignedIn && !displayedInCustomTabScreen - - changeBrowserModeMenuItem.isVisible = viewState.canChangeBrowsingMode - changeBrowserModeMenuItem.label { - context.getString( - if (viewState.isDesktopBrowsingMode) { - R.string.requestMobileSiteMenuTitle - } else { - R.string.requestDesktopSiteMenuTitle - }, - ) - } - changeBrowserModeMenuItem.setIcon( - if (viewState.isDesktopBrowsingMode) drawable.ic_device_mobile_16 else drawable.ic_device_desktop_16, - ) - - openInAppMenuItem.isVisible = viewState.previousAppLink != null - findInPageMenuItem.isVisible = viewState.canFindInPage - addToHomeMenuItem.isVisible = viewState.addToHomeVisible && viewState.addToHomeEnabled && !displayedInCustomTabScreen - privacyProtectionMenuItem.isVisible = viewState.canChangePrivacyProtection - privacyProtectionMenuItem.label { - context - .getText( - if (viewState.isPrivacyProtectionDisabled) { - R.string.enablePrivacyProtection - } else { - R.string.disablePrivacyProtection - }, - ).toString() - } - privacyProtectionMenuItem.setIcon( - if (viewState.isPrivacyProtectionDisabled) drawable.ic_shield_16 else drawable.ic_shield_disabled_16, - ) - brokenSiteMenuItem.isVisible = viewState.canReportSite && !displayedInCustomTabScreen - - siteOptionsMenuDivider.isVisible = viewState.browserShowing && !displayedInCustomTabScreen - browserOptionsMenuDivider.isVisible = viewState.browserShowing && !displayedInCustomTabScreen - settingsMenuDivider.isVisible = viewState.browserShowing && !displayedInCustomTabScreen - printPageMenuItem.isVisible = viewState.canPrintPage && !displayedInCustomTabScreen - autofillMenuItem.isVisible = viewState.showAutofill && !displayedInCustomTabScreen - - openInDdgBrowserMenuItem.isVisible = displayedInCustomTabScreen - customTabsMenuDivider.isVisible = displayedInCustomTabScreen - runningInDdgBrowserMenuItem.isVisible = displayedInCustomTabScreen - overrideForSSlError(viewState, displayedInCustomTabScreen) - } - - private fun overrideForSSlError( - viewState: BrowserViewState, - displayedInCustomTabScreen: Boolean, - ) { - if (viewState.sslError != NONE && !displayedInCustomTabScreen) { - newTabMenuItem.isVisible = true - siteOptionsMenuDivider.isVisible = true - } - } - - private fun configureVpnMenuItem( - viewState: BrowserViewState, - browserShowing: Boolean, - displayedInCustomTabScreen: Boolean, - ) { - // Only show VPN menu item in new tab page overflow menu - val shouldShowVpnMenuItem = !browserShowing && !displayedInCustomTabScreen - - when (viewState.vpnMenuState) { - VpnMenuState.Hidden -> { - vpnMenuItem.isVisible = false - } - VpnMenuState.NotSubscribed -> { - vpnMenuItem.isVisible = shouldShowVpnMenuItem - if (shouldShowVpnMenuItem) { - val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() - configureVpnMenuItemForNotSubscribed(tryForFreePill, statusIndicator, menuItemView) - } - } - VpnMenuState.NotSubscribedNoPill -> { - vpnMenuItem.isVisible = shouldShowVpnMenuItem - if (shouldShowVpnMenuItem) { - val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() - configureVpnMenuItemForNotSubscribedNoPill(tryForFreePill, statusIndicator, menuItemView) - } - } - is VpnMenuState.Subscribed -> { - vpnMenuItem.isVisible = shouldShowVpnMenuItem - if (shouldShowVpnMenuItem) { - val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() - configureVpnMenuItemForSubscribed(tryForFreePill, statusIndicator, menuItemView, viewState.vpnMenuState.isVpnEnabled) - } - } - } - } - - private fun getVpnMenuViews() = - when (popupMenuResourceType) { - TOP -> - Triple( - topBinding.includeVpnMenuItem.tryForFreePill, - topBinding.includeVpnMenuItem.statusIndicator, - topBinding.includeVpnMenuItem.menuItemView, - ) - BOTTOM -> - Triple( - bottomBinding.includeVpnMenuItem.tryForFreePill, - bottomBinding.includeVpnMenuItem.statusIndicator, - bottomBinding.includeVpnMenuItem.menuItemView, - ) - } - - private fun configureVpnMenuItemForNotSubscribed( - tryForFreePill: View, - statusIndicator: StatusIndicatorView, - menuItemView: MenuItemView, - ) { - tryForFreePill.isVisible = true - statusIndicator.isVisible = false - menuItemView.setIcon(drawable.ic_vpn_unlocked_24) - } - - private fun configureVpnMenuItemForNotSubscribedNoPill( - tryForFreePill: View, - statusIndicator: StatusIndicatorView, - menuItemView: MenuItemView, - ) { - tryForFreePill.isVisible = false - statusIndicator.isVisible = false - menuItemView.setIcon(drawable.ic_vpn_unlocked_24) - } - - private fun configureVpnMenuItemForSubscribed( - tryForFreePill: View, - statusIndicator: StatusIndicatorView, - menuItemView: MenuItemView, - isVpnEnabled: Boolean, - ) { - tryForFreePill.isVisible = false - statusIndicator.isVisible = true - statusIndicator.setStatus(isVpnEnabled) - - val iconRes = if (isVpnEnabled) drawable.ic_vpn_24 else drawable.ic_vpn_unlocked_24 - menuItemView.setIcon(iconRes) - } - - enum class ResourceType { - TOP, - BOTTOM, - } -} diff --git a/app/src/main/java/com/duckduckgo/app/browser/menu/VpnMenuStateProvider.kt b/app/src/main/java/com/duckduckgo/app/browser/menu/VpnMenuStateProvider.kt index f3fa53abce4c..8f99750a7bf5 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/menu/VpnMenuStateProvider.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/menu/VpnMenuStateProvider.kt @@ -16,8 +16,8 @@ package com.duckduckgo.app.browser.menu -import com.duckduckgo.app.browser.viewstate.VpnMenuState import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.utils.DispatcherProvider import com.duckduckgo.di.scopes.AppScope import com.duckduckgo.networkprotection.api.NetworkProtectionState diff --git a/app/src/main/java/com/duckduckgo/app/browser/viewstate/BrowserViewState.kt b/app/src/main/java/com/duckduckgo/app/browser/viewstate/BrowserViewState.kt index 20338ca872ce..a76d56f3af1f 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/viewstate/BrowserViewState.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/viewstate/BrowserViewState.kt @@ -21,6 +21,7 @@ import com.duckduckgo.app.browser.SpecialUrlDetector import com.duckduckgo.app.browser.WebViewErrorResponse import com.duckduckgo.app.browser.omnibar.QueryOrigin import com.duckduckgo.app.global.model.MaliciousSiteStatus +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.privacyprotectionspopup.api.PrivacyProtectionsPopupViewState import com.duckduckgo.savedsites.api.models.SavedSite @@ -63,18 +64,6 @@ data class BrowserViewState( val vpnMenuState: VpnMenuState = VpnMenuState.Hidden, ) -sealed class VpnMenuState { - data object Hidden : VpnMenuState() - - data object NotSubscribed : VpnMenuState() - - data object NotSubscribedNoPill : VpnMenuState() - - data class Subscribed( - val isVpnEnabled: Boolean, - ) : VpnMenuState() -} - sealed class HighlightableButton { data class Visible( val enabled: Boolean = true, diff --git a/app/src/main/res/layout/view_menu_item_duck_chat.xml b/app/src/main/res/layout/view_menu_item_duck_chat.xml deleted file mode 100644 index 073b21d8b58f..000000000000 --- a/app/src/main/res/layout/view_menu_item_duck_chat.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4b93981e0bd3..c3d5ef92d876 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -47,17 +47,12 @@ Търсене или въвеждане на URL адрес Изчистване на въведеното търсене Няма инсталирано съвместимо приложение - Добави отметка - Редактиране на отметка + Добавяне в любими Премахване от любими Добавено в любими Добавена е отметка - Сайт на работния плот - Премахване на огнеустойчивост - Мобилна версия на сайта Изтеглени файлове - Отпечатване на страницата Премахнато от любими Премахната огнеустойчивост Защитата на поверителността е активирана за %1$s @@ -76,11 +71,9 @@ Опции Споделяне на връзка - Споделяне Копиране на адреса на връзката - Намери в страницата Намери следващ Намери предишен Затваряне на изгледа за търсене в страницата @@ -256,7 +249,7 @@ Няма предложения - Подаване на сигнал за повреден сайт + Защитите за този сайт са ВКЛЮЧЕНИ Защитите за този сайт са ИЗКЛЮЧЕНИ @@ -279,7 +272,7 @@ Търсене и Duck.ai - Добавете към Начална Страница + Готово! %1$s е добавен към началния екран. @@ -485,8 +478,6 @@ Незащитени сайтове - Активиране на защита на поверителността - Деактивиране на защита на поверителността Още опции за незащитен сайт %1$s Сигурни ли сте, че искате да премахнете <b>%1$s</b> от незащитените сайтове? Към тези сайтове няма да бъде приложена защита на поверителността. @@ -585,11 +576,9 @@ Можете да отворите тази връзка в %1$s. Можете да отворите тази връзка в други приложения. Отваряне с - Отваряне в приложението Новият адрес е копиран в клипборда - Генериране на Duck Address Преглед @@ -760,10 +749,6 @@ Паролата е запазена Паролата е актуализирана - - Отваряне в DuckDuckGo - Работи в DuckDuckGo - Предупреждение: Този сайт може да не е сигурен Сертификатът за този сайт е невалиден. Възможно е да се свързвате със сървър, който се представя за <b>%1$s</b>, което може да изложи поверителната Ви информация на риск. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 0e9957812ef6..58d05345c243 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -47,17 +47,12 @@ Vyhledat nebo zadat URL Vymazat vyhledávací vstup Nebyla nainstalována žádná kompatibilní aplikace - Přidat záložku - Upravit záložku + Přidat oblíbené Odebrat oblíbenou položku Oblíbené položky uloženy Záložka přidána - Verze pro počítač - Odstranit ochranu - Mobilní režim Stahování - Vytisknout stránku Oblíbená položka odstraněna Ochrana odstraněna Ochrana soukromí zapnutá pro %1$s @@ -78,11 +73,9 @@ Možnosti Sdílet odkaz - Sdílet Kopírovat adresu odkazu - Vyhledávání na stránce Najít další Najít předchozí Zavřít vyhledání v zobrazení stránky @@ -258,7 +251,7 @@ Žádné návrhy - Nahlásit poškozené stránky + Na tomhle webu je ochrana ZAPNUTÁ Na tomhle webu je ochrana VYPNUTÁ @@ -281,7 +274,7 @@ Vyhledávání a Duck.ai - Přidat na domovskou obrazovku + Podařilo se! %1$s byla přidána na vaši domovskou obrazovku. @@ -487,8 +480,6 @@ Nechráněné stránky - Povolit ochranu soukromí - Zakázat ochranu soukromí Další možnosti pro nechráněný web %1$s Opravdu chcete odstranit <b>%1$s</b> z nechráněných stránek? Tyto stránky nebudou vylepšeny ochranou soukromí. @@ -587,11 +578,9 @@ Tenhle odkaz můžeš otevřít v aplikaci %1$s. Tenhle odkaz můžeš otevřít v jiných aplikacích. Otevřít v aplikaci - Otevřít v aplikaci Nová adresa zkopírovaná do vaší schránky - Vygenerovat adresu Duck Zobrazit @@ -788,10 +777,6 @@ Heslo je uložené Heslo je aktualizované - - Otevřít v DuckDuckGo - Spuštěno v DuckDuckGo - Pozor: Tenhle web může být nezabezpečený Tenhle web nemá platný certifikát. Možná se dokonce připojuješ k serveru, který předstírá, že je %1$s. Tvoje důvěrné informace by mohly být ohrožené. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 812b94f6a61b..4caeb3e04fe7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -47,17 +47,12 @@ Søg eller indtast URL Ryd søgeinput Ingen kompatibel app installeret - Tilføj bogmærke - Rediger bogmærke + Tilføj til favorit Fjern favorit Favorit tilføjet Bogmærke tilføjet - Stationær computer - Fjern brandsikring - Mobilwebsted Downloads - Udskriv side Favorit fjernet Brandsikring fjernet Beskyttelse af privatlivet aktiveret for %1$s @@ -76,11 +71,9 @@ Valgmuligheder Del link - Del Kopiér linkadresse - Find på side Find næste Find tidligere Luk visningen find på side @@ -256,7 +249,7 @@ Ingen forslag - Rapporter ødelagt websted + Beskyttelse er TIL for dette websted Beskyttelse er FRA for dette websted @@ -279,7 +272,7 @@ Søg og Duck.ai - Tilføj til startskærm + Det lykkedes! %1$s er blevet føjet til din startskærm. @@ -485,8 +478,6 @@ Ubeskyttede websteder - Aktiver Beskyttelse af privatlivet - Deaktiver Beskyttelse af privatlivet Flere indstillinger for ubeskyttet websted %1$s Er du sikker på, at du vil fjerne <b>%1$s</b> fra ubeskyttede websteder? Disse websteder vil ikke blive forbedret ved Beskyttelse af privatlivet. @@ -585,11 +576,9 @@ Du kan åbne dette link i %1$s. Du kan åbne dette link i andre apps. Åben med - Åbn i app Ny adresse kopieret til din udklipsholder - Generér Duck-adresse Se @@ -760,10 +749,6 @@ Adgangskode gemt Adgangskode opdateret - - Åben i DuckDuckGo - Kører i DuckDuckGo - Advarsel: Denne side kan være usikker Certifikatet for dette websted er ugyldigt. Du opretter muligvis forbindelse til en server, der foregiver at være %1$s, hvilket kan bringe dine fortrolige oplysninger i fare. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3f90f73fbcc7..e176cf6661d5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -47,17 +47,12 @@ URL eingeben oder suchen Sucheingabe löschen Keine kompatible App installiert - Lesezeichen hinzufügen - Lesezeichen bearbeiten + Favorit hinzufügen Favorit entfernen Favorit wurde hinzugefügt Lesezeichen hinzugefügt - Desktop-Seite - Feuerfest-Einstellung deaktivieren - Mobile Website Downloads - Seite drucken Favorit wurde entfernt Feuerfest-Einstellung deaktiviert Datenschutz aktiviert für %1$s @@ -76,11 +71,9 @@ Optionen Link teilen - Teilen Link-Adresse kopieren - Auf Seite suchen Nächstes Ergebnis Vorheriges Ergebnis Seitensuchansicht schließen @@ -256,7 +249,7 @@ Keine Vorschläge - Fehlerhafte Seite melden + Der Schutz ist für diese Website ist AKTIVIERT Der Schutz für diese Website ist DEAKTIVIERT @@ -279,7 +272,7 @@ Suche & Duck.ai - Zum Startbildschirm hinzufügen + %1$s wurde erfolgreich zu deinem Startbildschirm hinzugefügt. @@ -485,8 +478,6 @@ Ungeschützte Websites - Datenschutz aktivieren - Datenschutz deaktivieren Weitere Optionen für die ungeschützte Website %1$s Möchtest du <b>%1$s</b> wirklich von den ungeschützten Websites entfernen? Für diese Websites ist der Datenschutz nicht aktiviert. @@ -585,11 +576,9 @@ Du kannst diesen Link in %1$s öffnen. Du kannst diesen Link in anderen Apps öffnen. Öffnen mit - In App öffnen Neue Adresse wurde in deine Zwischenablage kopiert - Duck-Adresse generieren Ansehen @@ -760,10 +749,6 @@ Passwort gespeichert Passwort aktualisiert - - In DuckDuckGo öffnen - Laufen in DuckDuckGo - Warnung: Diese Website ist möglicherweise unsicher Das Zertifikat für diese Website ist ungültig. Möglicherweise stellst du eine Verbindung zu einem Server her, der vorgibt, %1$s zu sein, wodurch deine vertraulichen Daten in Gefahr sein könnten. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b0803534d3e0..981b1b7ad229 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -47,17 +47,12 @@ Αναζήτηση ή πληκτρολόγηση διεύθυνσης URL Εκκαθάριση εισαγωγής αναζήτησης Δεν υπάρχει εγκατεστημένη συμβατή εφαρμογή - Προσθήκη σελιδοδείκτη - Επεξεργασία σελιδοδείκτη + Προσθήκη Αγαπημένου Αφαίρεση αγαπημένου Προστέθηκε αγαπημένο Προστέθηκε σελιδοδείκτης - Ιστότοπος επιφάνειας εργασίας - Αφαίρεση διαγραφής δραστηριότητας - Ιστότοπος για κινητά Λήψεις - Εκτύπωση σελίδας Το Αγαπημένο αφαιρέθηκε Η διαγραφή δραστηριότητας αφαιρέθηκε Η προστασία απορρήτου ενεργοποιήθηκε για %1$s @@ -76,11 +71,9 @@ Επιλογές Κοινή χρήση συνδέσμου - Κοινή χρήση Αντιγραφή διεύθυνσης συνδέσμου - Εύρεση στη σελίδα Εύρεση επόμενου Εύρεση προηγούμενου Κλείσιμο εύρεσης στην προβολή σελίδας @@ -256,7 +249,7 @@ Δεν υπάρχουν προτάσεις - Αναφορά κατεστραμμένου ιστότοπου + Οι επιλογές προστασίας είναι ΕΝΕΡΓΕΣ για τον συγκεκριμένο ιστότοπο Οι επιλογές προστασίας είναι ΑΝΕΝΕΡΓΕΣ για τον συγκεκριμένο ιστότοπο @@ -279,7 +272,7 @@ Αναζήτηση και Duck.ai - Προσθήκη στην Αρχική Οθόνη + Επιτυχία! Το %1$s έχει προστεθεί στην αρχική οθόνη σας. @@ -485,8 +478,6 @@ Μη προστατευόμενοι ιστότοποι - Ενεργοποίηση Προστασίας προσωπικών δεδομένων - Απενεργοποίηση Προστασίας προσωπικών δεδομένων Περισσότερες επιλογές για τον μη προστατευόμενο ιστότοπο %1$s Είστε βέβαιοι ότι θέλετε να καταργήσετε το <b>%1$s</b> από τους Μη προστατευόμενους ιστότοπους; Οι ιστότοποι αυτοί δεν θα ενισχυθούν από την Προστασία προσωπικών δεδομένων. @@ -585,11 +576,9 @@ Μπορείτε να ανοίξετε τον σύνδεσμο αυτό σε %1$s. Μπορείτε να ανοίξετε τον σύνδεσμο αυτό σε άλλες εφαρμογές. Ανοίξτε με - Ανοίξτε στην εφαρμογή Έγινε αντιγραφή νέας διεύθυνσης στο πρόχειρό σας - Δημιουργήστε Duck Address Προβολή @@ -760,10 +749,6 @@ Αποθηκευμένος κωδικός πρόσβασης Ο κωδικός πρόσβασης ενημερώθηκε - - Άνοιγμα στο DuckDuckGo - Εκτέλεση στο DuckDuckGo - Προειδοποίηση: Αυτός ο ιστότοπος ενδέχεται να μην είναι ασφαλής Το πιστοποιητικό για τον ιστότοπο αυτόν δεν είναι έγκυρο. Ίσως συνδέεστε σε διακομιστή που προσποιείται ότι είναι ο τομέας %1$s, γεγονός που θα μπορούσε να θέσει σε κίνδυνο τις εμπιστευτικές πληροφορίες σας. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 46f6f0e1d976..4d505c4eecd3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -47,17 +47,12 @@ Buscar o escribir la URL Borrar búsqueda No hay ninguna aplicación compatible instalada - Añadir marcador - Editar marcador + Añadir favorito Eliminar favorito Favorito añadido Marcador añadido - Versión de escritorio del sitio web - Desactivar a prueba de fuego - Sitio móvil Descargas - Imprimir página Favorito eliminado A prueba de fuego desactivado Protección de privacidad activada para %1$s @@ -76,11 +71,9 @@ Opciones Compartir enlace - Compartir Copiar dirección de enlace - Buscar en la página Buscar siguiente Buscar anterior Cerrar búsqueda en la vista de página @@ -256,7 +249,7 @@ No hay sugerencias - Informar de sitio web dañado + Las protecciones están ACTIVADAS para este sitio Las protecciones están DESACTIVADAS para este sitio @@ -279,7 +272,7 @@ Búsqueda y Duck.ai - Añadir a la Pantalla de Inicio + %1$s se ha añadido a tu pantalla de inicio correctamente. @@ -485,8 +478,6 @@ Sitios no protegidos - Activar la protección de privacidad - Desactivar la protección de privacidad Más opciones para el sitio no protegido %1$s ¿Seguro que quieres eliminar <b>%1$s</b> de los sitios desprotegidos? La protección de privacidad está deshabilitada para estos sitios. @@ -585,11 +576,9 @@ Puedes abrir este enlace en %1$s. Puedes abrir este enlace en otras aplicaciones. Abrir con - Abrir en la aplicación Nueva dirección copiada en el portapapeles - Generar Duck Address Ver @@ -760,10 +749,6 @@ Contraseña guardada Contraseña actualizada - - Abrir en DuckDuckGo - Ejecutar en DuckDuckGo - Advertencia: este sitio puede ser inseguro El certificado de este sitio no es válido. Puede que te estés conectando a un servidor que se hace pasar por %1$s, lo que podría poner en riesgo tu información confidencial. diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 4e8b6af15c94..7837257f4279 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -47,17 +47,12 @@ Otsige või tippige URL Tühjenda otsingusisend Ühtegi ühilduvat rakendust pole installitud - Lisa järjehoidja - Redigeeri järjehoidjat + Lisa lemmik Eemalda lemmik Lemmik lisatud Järjehoidja lisatud - Töölaua sait - Eemalda tulekindlus - Mobiilisait Allalaadimised - Prindi leht Lemmik on eemaldatud Tulekindlus on eemaldatud Privaatsuskaitse on domeeni %1$s jaoks lubatud @@ -76,11 +71,9 @@ Valikud Jaga linki - Jaga Kopeeri lingi aadress - Otsi lehel Otsi järgmine Otsi eelmine Sulge lehe vaates otsimine @@ -256,7 +249,7 @@ Ettepanekud puuduvad - Teatage katkisest saidist + Sellel saidil on kaitsefunktsioonid SISSE lülitatud Sellel saidil on kaitsefunktsioonid VÄLJA lülitatud @@ -279,7 +272,7 @@ Otsing ja Duck.ai - Lisa kodukuvale + Õnnestus! %1$s lisati teie avaekraanile. @@ -485,8 +478,6 @@ Kaitseta saidid - Luba privaatsuse kaitse - Keela privaatsuse kaitse Rohkem võimalusi kaitseta saidi %1$s jaoks Oled kindel, et soovid eemaldada <b>%1$s</b> kaisteta saitide hulgast? Nendele saitidele ei laiene privaatsuse kaitse. @@ -585,11 +576,9 @@ Selle lingi saab avada rakenduses %1$s. Selle lingi saab avada teistes rakendustes. Ava rakendusega - Ava rakenduses Uus aadress kopeeriti teie lõikelauale - Loo Duck Address Kuva @@ -760,10 +749,6 @@ Parool salvestatud Parool uuendatud - - Ava saidil DuckDuckGo - DuckDuckGo-s käivitamine - Hoiatus: see sait võib olla ebaturvaline Selle saidi sertifikaat on vale. Võimalik, et lood ühenduse serveriga, mis teeskleb olevat %1$s ja see võib sinu konfidentsiaalse teabe ohtu seada. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index abc564ae9580..69e5e2e5808e 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -47,17 +47,12 @@ Hae tai kirjoita URL Tyhjennä hakusyöte Yhteensopivaa sovellusta ei ole asennettu - Lisää kirjanmerkki - Muokkaa kirjanmerkkiä + Lisää suosikki Poista suosikki Suosikki lisätty Kirjanmerkki lisätty - Pöytäkonesivusto - Poista palonkestävyys - Mobiilisivusto Lataukset - Tulosta sivu Suosikki poistettu Palonkestävyys poistettu Yksityisyyden suoja käytössä: %1$s @@ -76,11 +71,9 @@ Valinnat Jaa linkki - Jaa Kopioi linkin osoite - Etsi sivulta Etsi seuraava Etsi edellinen Sulje etsi sivulta -näkymä @@ -256,7 +249,7 @@ Ei ehdotuksia - Ilmoita viallisesta sivustosta + Tämän sivuston suojaukset ovat KÄYTÖSSÄ Tämän sivuston suojaukset ovat POIS KÄYTÖSTÄ @@ -279,7 +272,7 @@ Haku ja Duck.ai - Lisää kotinäytölle + Onnistui! %1$s on lisätty aloitusnäytöllesi. @@ -485,8 +478,6 @@ Suojaamattomat sivustot - Ota yksityisyyden suoja käyttöön - Poista yksityisyyden suoja käytöstä Lisää valintoja suojaamattomalle sivustolle %1$s Haluatko varmasti poistaa sivuston <b>%1$s</b> suojaamattomista sivustoista? Yksityisyyden suoja ei paranna näitä sivustoja. @@ -585,11 +576,9 @@ Voit avata tämän linkin sovelluksessa %1$s. Voit avata tämän linkin muissa sovelluksissa. Avaa sovelluksessa: - Avaa sovelluksessa Uusi osoite on kopioitu leikepöydälle - Luo Duck Address Näytä @@ -760,10 +749,6 @@ Salasana tallennettu Salasana päivitetty - - Avaa DuckDuckGo:ssa - Käynnissä DuckDuckGossa - Varoitus: Tämä sivusto ei välttämättä ole turvallinen Tämän sivuston varmenne on virheellinen. Saatat olla yhteydessä palvelimeen, joka teeskentelee olevansa %1$s, mikä voi vaarantaa luottamukselliset tietosi. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b9c1ccabf417..a9ff9cc20f91 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -47,17 +47,12 @@ Effectuer une recherche ou saisir l\'URL Effacer la recherche Aucune application compatible installée - Ajouter un signet - Modifier le signet + Ajouter un favori Supprimer le favori Favori ajouté Signet ajouté - Site en version bureau - Désactiver le mode coupe-feu - Version mobile Téléchargements - Imprimer la page Favori supprimé Mode coupe-feu désactivé Protection de la confidentialité activée pour %1$s @@ -76,11 +71,9 @@ Options Partager le lien - Partager Copier l\'adresse du lien - Rechercher dans la page Suivant Précédent Fermer la recherche en vue de page @@ -256,7 +249,7 @@ Aucune suggestion - Signaler un problème de site + Les protections sont ACTIVÉES sur ce site Les protections sont DÉSACTIVÉES sur ce site @@ -279,7 +272,7 @@ Recherche et Duck.ai - Ajouter à la page d\'accueil + %1$s a bien été ajouté à votre écran d\'accueil. @@ -485,8 +478,6 @@ Sites non protégés - Activer la protection de la confidentialité - Désactiver la protection de la confidentialité Plus d\'options pour le site non protégé %1$s Voulez-vous vraiment retirer <b>%1$s</b> des sites non protégés ? Les sites suivants ne bénéficient pas de la protection de la confidentialité. @@ -585,11 +576,9 @@ Vous pouvez ouvrir ce lien dans %1$s. Vous pouvez ouvrir ce lien dans d\'autres applications. Ouvrir avec - Ouvrir dans l\'application Nouvelle adresse copiée dans le presse-papiers - Générer une Duck Address Afficher @@ -760,10 +749,6 @@ Le mot de passe a été enregistré Le mot de passe a été modifié - - Ouvrir dans DuckDuckGo - S\'exécute dans DuckDuckGo - Avertissement : ce site n\'est peut-être pas sécurisé Le certificat de ce site n\'est pas valide. Vous vous connectez peut-être à un serveur qui se fait passer pour %1$s, ce qui pourrait mettre vos informations confidentielles en danger. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index a9b9be96f985..bb62ab703bd8 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -47,17 +47,12 @@ Traži ili upiši URL adresu Obriši unos pretraživanja Nije instalirana kompatibilna aplikacija - Dodaj knjižnu oznaku - Uredi knjižnu oznaku + Dodaj omiljenu stavku Ukloni omiljeno Dodano u Omiljeno Knjižna je oznaka dodana - Mjesto radne površine - Ukloni oznaku sigurnog web-mjesta - Mobilno mrežno mjesto Preuzimanja - Ispiši stranicu Omiljena je stavka uklonjena Oznaka sigurnog web-mjesta je uklonjena Zaštita privatnosti omogućena za %1$s @@ -78,11 +73,9 @@ Opcije Podijeli poveznicu - Podijeli Kopiraj adresu poveznice - Pronađi na stranici Pronađi sljedeće Pronađi prethodno Zatvori prikaz „Pronađi na stranici” @@ -258,7 +251,7 @@ Nema prijedloga - Prijavi neispravno web-mjesto + Zaštite su UKLJUČENE za ovu web lokaciju Zaštite su ISKLJUČENE za ovu web lokaciju @@ -281,7 +274,7 @@ Pretraživanje i Duck.ai - Dodaj na početni zaslon + Uspjeh! %1$s dodan je na vaš početni zaslon. @@ -487,8 +480,6 @@ Nezaštićena web-mjesta - Omogući zaštitu privatnosti - Onemogući zaštitu privatnosti Dodatne mogućnosti za nezaštićeno mrežno mjesto %1$s Jesi li siguran/na da želiš ukloniti <b>%1$s</b> iz nezaštićenih web-mjesta? Zaštita privatnosti neće poboljšati ova mrežna mjesta. @@ -587,11 +578,9 @@ Ovu poveznicu možeš otvoriti u %1$s. Ovu poveznicu možeš otvoriti u drugim aplikacijama. Otvoriti s aplikacijom - Otvori u aplikaciji Nova adresa kopirana je u međuspremnik - Generiraj Duck Address Pregled @@ -788,10 +777,6 @@ Lozinka je spremljena Lozinka je ažurirana - - Otvori u DuckDuckGou - Izvodi se u DuckDuckGou - Upozorenje: ova stranica može biti nesigurna Certifikat za ovu stranicu nije valjan. Možda se povezuješ s poslužiteljem koji se pretvara da je %1$s, što bi moglo ugroziti tvoje povjerljive podatke. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 92a315ac967d..4cc896648338 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -47,17 +47,12 @@ Keresés vagy URL beírása Megadott keresés törlése Nincs telepítve kompatibilis alkalmazás - Könyvjelző mentése - Könyvjelző szerkesztése + Kedvenc hozzáadása Kedvenc eltávolítása Kedvenc hozzáadva Könyvjelző hozzáadva - Weboldal asztali nézete - Tűzállóság eltávolítása - Weboldal mobil nézete Letöltések - Oldal nyomtatása Kedvenc eltávolítva Tűzállóság eltávolítva Adatvédelem engedélyezve a következőhöz: %1$s @@ -76,11 +71,9 @@ Opciók Link megosztása - Megosztás Link címének másolása - Keresés az oldalon Következő keresése Előző keresése Keresés az oldalon nézet bezárása @@ -256,7 +249,7 @@ Nincs javaslat - Hibás weboldal bejelentése + A védelmek BE vannak kapcsolva ezen a webhelyen A védelmek KI vannak kapcsolva ezen a webhelyen @@ -279,7 +272,7 @@ Keresés és Duck.ai - Hozzáadás a kezdőlaphoz + Siker! %1$s hozzáadva a kezdőképernyődhöz. @@ -485,8 +478,6 @@ Védelem nélküli weboldalak - Adatvédelem engedélyezése - Adatvédelem letiltása További lehetőségek az %1$s védelem nélküli weboldalhoz Biztosan eltávolítod az <b>%1$s</b> elemet a védelem nélküli weboldalak közül? Ezeket az oldalakat nem erősíti adatvédelem. @@ -585,11 +576,9 @@ A hivatkozás a következő alkalmazásban nyitható meg: %1$s. A hivatkozás más alkalmazásokban nyitható meg. Megnyitás ezzel: - Megnyitás az alkalmazásban Új cím a vágólapra másolva - Duck-cím létrehozása Megtekintés @@ -760,10 +749,6 @@ Jelszó mentve Jelszó frissítve - - Megnyitás DuckDuckGo-ban - Futtatás a DuckDuckGo-ban - Figyelmeztetés: Lehet, hogy ez a webhely nem biztonságos A webhely tanúsítványa érvénytelen. Előfordulhat, hogy olyan szerverhez csatlakozol, amely megpróbál %1$s címűként viselkedni, veszélybe sodorva ezzel bizalmas adataidat. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a13780056fa5..40cc5d822f38 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -47,17 +47,12 @@ Cerca o inserisci URL Elimina input di ricerca Nessuna app compatibile installata - Aggiungi ai segnalibri - Modifica segnalibro + Aggiungi preferito Rimuovi Preferito Preferito aggiunto Segnalibro aggiunto - Sito desktop - Rimuovi protezione dal fuoco - Sito per dispositivi mobili Download - Stampa pagina Preferito rimosso Protezione dal fuoco rimossa Tutela della privacy attivata per %1$s @@ -76,11 +71,9 @@ Opzioni Condividi link - Condividi Copia l\'indirizzo del link - Trova nella pagina Trova successivo Trova precedente Esci dalla vista Trova nella pagina @@ -256,7 +249,7 @@ Nessun suggerimento - Segnala sito danneggiato + Le protezioni sono ATTIVE per questo sito Le protezioni sono DISATTIVATE per questo sito @@ -279,7 +272,7 @@ Cerca e Duck.ai - Aggiungi alla Schermata Home + Azione completa. %1$s è stato aggiunto alla schermata principale. @@ -485,8 +478,6 @@ Siti non protetti - Attiva la tutela della privacy - Disattiva la tutela della privacy Altre opzioni per il sito non protetto %1$s Confermi di voler rimuovere <b>%1$s</b> dai siti non protetti? Questi siti non saranno ottimizzati dalla tutela della privacy. @@ -585,11 +576,9 @@ Puoi aprire questo link in %1$s. Puoi aprire questo link in altre app. Apri con - Apri nell\'app Nuovo indirizzo copiato negli appunti - Genera Duck Address Visualizza @@ -760,10 +749,6 @@ Password salvata Password aggiornata - - Apri in DuckDuckGo - Esecuzione in DuckDuckGo - Attenzione: questo sito potrebbe non essere sicuro Il certificato di questo sito non è valido. Potresti collegarti a un server che finge di essere %1$s e che potrebbe mettere a rischio le tue informazioni riservate. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 0a6687a240fc..0765ad8fe077 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -47,17 +47,12 @@ Ieškoti arba įvesti URL Išvalyti paieškos įvestį Neįdiegta suderinama programa - Pridėti žymę - Redaguoti žymę + Pridėti mėgstamą Šalinti mėgstamą Mėgstamas pridėtas Žymė pridėta - Darbalaukio svetainė - Šalinti apsaugą - Mobilioji svetainė Atsisiuntimai - Spausdinti puslapį Mėgstamas pašalintas Apsauga pašalinta Privatumo apsauga įjungta dėl %1$s @@ -78,11 +73,9 @@ Parinktys Bendrinti nuorodą - Bendrinti Kopijuoti nuorodos adresą - Rasti puslapyje Rasti kitą Rasti ankstesnį Uždaryti paiešką puslapio peržiūroje @@ -258,7 +251,7 @@ Pasiūlymų nėra - Pranešti apie neveikiančią svetainę + Šios svetainės apsaugos priemonės yra ĮJUNGTOS Šios svetainės apsaugos priemonės yra IŠJUNGTOS @@ -281,7 +274,7 @@ Paieška ir „Duck.ai“ - Pridėti prie pagrindinio ekrano + Pavyko! %1$s pridėtas prie jūsų pagrindinio ekrano. @@ -487,8 +480,6 @@ Neapsaugotos svetainės - Įjungti privatumo apsaugą - Išjungti privatumo apsaugą Daugiau neapsaugotos svetainės %1$s parinkčių Ar tikrai norite pašalinti <b>%1$s</b> iš neapsaugotų svetainių sąrašo? Šių svetainių nepatobulins privatumo apsauga. @@ -587,11 +578,9 @@ Galite atverti šią nuorodą %1$s. Galite atidaryti šią nuorodą kitose programėlėse. Atidaryti - Atidaryti programėlėje Naujas adresas nukopijuotas į jūsų iškarpinę - Sukurkite „Duck“ adresą Peržiūrėti @@ -788,10 +777,6 @@ Slaptažodis išsaugotas Slaptažodis atnaujintas - - Atidaryti „DuckDuckGo“ - Veikia sistemoje „DuckDuckGo“ - Įspėjimas: ši svetainė gali būti nesaugi Šios svetainės sertifikatas negalioja. Galbūt jungiatės prie serverio, kuris apsimeta %1$s, o tai gali kelti pavojų jūsų konfidencialiai informacijai. diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index a3a896641808..af8bb6ab34a7 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -47,17 +47,12 @@ Meklē vai ieraksti URL Notīrīt meklēšanas ievadi Nav instalēta saderīga lietotne - Pievienot grāmatzīmi - Rediģēt grāmatzīmi + Pievienot izlases vienumu Noņemt izlasi Izlases vienums ir pievienots Pievienota grāmatzīme - Darbvirsmas vietne - Noņemt ugunsdrošību - Mobilā vietne Lejupielādes - Drukāt lapu Izlase ir noņemta Ugunsdrošība noņemta Iespējota %1$s privātuma aizsardzība @@ -77,11 +72,9 @@ Opcijas Kopīgot saiti - Kopīgot Kopēt saites adresi - Atrast lapā Atrast nākamo Atrast iepriekšējo Aizvērt atrašanas lapā skatu @@ -257,7 +250,7 @@ Nav ieteikumu - Ziņot par bojātu vietni + Aizsardzība šai vietnei ir IESLĒGTA Aizsardzība šai vietnei ir IZSLĒGTA @@ -280,7 +273,7 @@ Meklēšana un Duck.ai - Pievienot sākuma ekrānam + Izdevās! %1$s ir pievienots tavam sākuma ekrānam. @@ -486,8 +479,6 @@ Neaizsargātas vietnes - Iespējot privātuma aizsardzību - Atspējot privātuma aizsardzību Citas opcijas neaizsargātai vietnei %1$s Vai tiešām vēlies noņemt <b>%1$s</b> no neaizsargātām vietnēm? Šīs vietnes netiks uzlabotas ar privātuma aizsardzību. @@ -586,11 +577,9 @@ Tu vari atvērt šo saiti ar %1$s. Tu vari atvērt šo saiti citās lietotnēs. Atvērt ar - Atvērt lietotnē Jaunā adrese tika iekopēta tavā starpliktuvē - Izveidot Duck adresi Skatīt @@ -774,10 +763,6 @@ Parole saglabāta Parole atjaunināta - - Atvērt vietnē DuckDuckGo - Darbojas programmā DuckDuckGo - Brīdinājums: šī vietne var būt nedroša Šīs vietnes sertifikāts nav derīgs. Tu, iespējams, izveido savienojumu ar serveri, kas izliekas par %1$s un var pakļaut riskam tavu konfidenciālo informāciju. diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 87021c3961d3..51bce0d37b63 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -47,17 +47,12 @@ Søk eller skriv URL Tøm søkefeltet Ingen kompatibel app installert - Legg til bokmerke - Rediger bokmerke + Legg til favoritt Fjern favoritt Favoritt lagt til Bokmerke lagt til - Skrivebordversjon - Fjern brannsikring - Mobilversjon Nedlastinger - Skriv ut siden Favoritt er fjernet Brannsikring fjernet Personvern aktivert for %1$s @@ -76,11 +71,9 @@ Alternativer Del lenke - Del Kopier lenke - Finn på side Finn neste Finn forrige Lukk finn-på-side-visning @@ -256,7 +249,7 @@ Ingen forslag - Rapporter nettstedfeil + Beskyttelse er for dette nettstedet Beskyttelse er AV for dette nettstedet @@ -279,7 +272,7 @@ Søk og Duck.ai - Legg til på startskjermen + %1$s er lagt til på startskjermen. @@ -485,8 +478,6 @@ Ubeskyttede nettsteder - Aktiver personvernbeskyttelse - Deaktiver personvernbeskyttelse Flere alternativer for det ubeskyttede nettstedet %1$s Er du sikker på at du vil fjerne <b>%1$s</b> fra ubeskyttede nettsteder? Disse nettstedene blir ikke dekket av personvernbeskyttelse. @@ -585,11 +576,9 @@ Du kan åpne denne lenken i %1$s. Du kan åpne denne lenken i andre apper. Åpne med - Åpne i appen Ny adresse kopiert til utklippstavlen - Generer Duck-adresse Vis @@ -760,10 +749,6 @@ Passordet er lagret Passordet er oppdatert - - Åpne i DuckDuckGo - Kjører i DuckDuckGo - Advarsel: Dette nettstedet kan være usikkert Sertifikatet for dette nettstedet er ugyldig. Det kan være du er koblet til en server som utgir seg for å være %1$s, noe som kan sette konfidensiell informasjon i fare. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f31fa603ec74..c28d272b9e9c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -47,17 +47,12 @@ URL typen of zoeken Zoekinvoer wissen Geen compatibele app geïnstalleerd - Bladwijzer toevoegen - Bladwijzer bewerken + Favoriet toevoegen Favoriet verwijderen Favoriet toegevoegd Bladwijzer toegevoegd - Desktopsite - Brandveiligheid uitschakelen - Mobiele site Downloads - Pagina printen Favoriet verwijderd Brandveiligheid uitgeschakeld Privacybescherming ingeschakeld voor %1$s @@ -76,11 +71,9 @@ Opties Link delen - Delen Adres link kopiëren - Zoek op pagina Volgende zoeken Vorige zoeken Scherm zoek op pagina sluiten @@ -256,7 +249,7 @@ Geen suggesties - Defecte website melden + Beveiliging is INGESCHAKELD voor deze website Beveiliging is UITGESCHAKELD voor deze website @@ -279,7 +272,7 @@ Zoeken en Duck.ai - Toevoegen aan Home Screen + %1$s is toegevoegd aan je startscherm. @@ -485,8 +478,6 @@ Onbeschermde sites - Privacybescherming inschakelen - Privacybescherming uitschakelen Meer opties voor onbeschermde site %1$s Weet je zeker dat je <b>%1$s</b> wilt verwijderen uit onbeschermde sites? Deze sites worden niet beschermd met Privacybescherming. @@ -585,11 +576,9 @@ Je kunt deze link openen in %1$s. Je kunt deze link openen in andere apps. Openen met - Openen in de app Nieuw adres gekopieerd naar je klembord - Duck Address genereren Weergeven @@ -760,10 +749,6 @@ Wachtwoord opgeslagen Wachtwoord bijgewerkt - - Openen in DuckDuckGo - Uitgevoerd in DuckDuckGo - Waarschuwing: Deze website is mogelijk onveilig Het certificaat voor deze website is ongeldig. Mogelijk maak je verbinding met een server die zich voordoet als %1$s, waardoor je vertrouwelijke informatie in gevaar kan komen. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c5f34a8213be..4120d07ce8e3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -47,17 +47,12 @@ Wyszukaj lub wpisz adres URL Usuń treść wyszukiwania Brak kompatybilnej aplikacji - Dodaj zakładkę - Edytuj zakładkę + Dodaj do Ulubionych Usuń ulubione Dodano ulubione Dodano zakładkę - Witryna w wersji komputerowej - Usuń zabezpieczenie - Witryna mobilna Pobrane - Drukuj stronę Usunięto ulubione Zabezpieczenie zostało usunięte Ochrona prywatności włączona dla %1$s @@ -78,11 +73,9 @@ Opcje Udostępnij link - Udostępnij Skopiuj adres linku - Znajdź na stronie Znajdź następny element Znajdź poprzedni element Zamknij widok wyszukiwania na stronie @@ -258,7 +251,7 @@ Brak sugestii - Zgłoś uszkodzoną witrynę + Zabezpieczenia są WŁĄCZONE dla tej witryny Zabezpieczenia są WYŁĄCZONE dla tej witryny @@ -281,7 +274,7 @@ Wyszukiwanie i Duck.ai - Dodaj do ekranu głównego + Sukces! %1$s został dodany do Twojego ekranu głównego. @@ -487,8 +480,6 @@ Niezabezpieczone witryny - Włącz ochronę prywatności - Wyłącz ochronę prywatności Więcej opcji dla niezabezpieczonej witryny %1$s Na pewno usunąć <b>%1$s</b> z niezabezpieczonych witryn? Te witryny nie będą ulepszane przez ochronę prywatności. @@ -587,11 +578,9 @@ Możesz otworzyć ten link w %1$s. Możesz otworzyć ten link w innych aplikacjach. Otwórz za pomocą - Otwórz w aplikacji Nowy adres skopiowany do schowka - Wygeneruj Duck Address Wyświetl @@ -788,10 +777,6 @@ Hasło zapisane Zaktualizowano hasło - - Otwórz w DuckDuckGo - Uruchamianie w DuckDuckGo - Ostrzeżenie: ta witryna może być niebezpieczna Certyfikat tej witryny jest nieprawidłowy. Być może łączysz się z serwerem podszywającym się pod %1$s, co może narazić poufne informacje na niebezpieczeństwo. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f046bdeaad9e..9fcf62508fdf 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -47,17 +47,12 @@ Pesquisar ou escrever URL Limpar introdução da pesquisa Nenhuma aplicação compatível instalada - Adicionar marcador - Editar marcador + Adicionar favorito Remover favorito Favorito adicionado Favorito adicionado - Site para computador de secretária - Remover barreira de segurança - Site móvel Transferências - Imprimir página Favorito removido Barreira de segurança removida Proteção de Privacidade ativada para %1$s @@ -76,11 +71,9 @@ Opções Partilhar ligação - Partilhar Copiar endereço de ligação - Encontrar na página Encontrar seguinte Encontrar anterior Fechar a vista de encontrar na página @@ -256,7 +249,7 @@ Sem sugestões - Denunciar falha no site + As proteções estão ATIVADAS para este site As proteções estão DESATIVADAS para este site @@ -279,7 +272,7 @@ Pesquisa e Duck.ai - Adicionar à Página Inicial + Sucesso! %1$s foi adicionado ao seu ecrã inicial. @@ -485,8 +478,6 @@ Sites desprotegidos - Ativar Proteção de Privacidade - Desativar Proteção de Privacidade Mais opções para o site desprotegido %1$s Quer mesmo remover <b>%1$s</b> da lista de sites desprotegidos? Estes sites não serão aprimorados pela Proteção de Privacidade. @@ -585,11 +576,9 @@ Pode abrir este link em %1$s. Pode abrir este link noutras aplicações. Abrir com - Abrir na app Novo endereço copiado para a área de transferência - Gerar Duck Address Visualizar @@ -760,10 +749,6 @@ Palavra-passe guardada Palavra-passe atualizada - - Abrir no DuckDuckGo - Em execução no DuckDuckGo - Aviso: este site pode ser inseguro O certificado deste site é inválido. Podes estar a ligar a um servidor que finge ser %1$s, o que pode colocar as tuas informações confidenciais em risco. diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c6c537c61401..a7c22ffde5d5 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -47,17 +47,12 @@ Căutare sau tastare URL Șterge datele introduse pentru căutare Nicio aplicație compatibilă instalată - Adaugă marcaj - Editează marcaj + Adaugă favorit Elimină favoritul Favorit adăugat Marcaj adăugat - Versiune desktop - Elimină ștergerea activității și istoricului din browser - Site mobil Descărcări - Imprimă pagina Favorit eliminat Ștergerea activității și istoricului din browser a fost eliminată Protecția confidențialității activată pentru %1$s @@ -77,11 +72,9 @@ Opțiuni Trimite linkul - Trimite… Copiază adresa linkului - Caută în pagină Arată rezultatul următor Arată rezultatul anterior Închide vizualizarea „caută în pagină” @@ -257,7 +250,7 @@ Fără sugestii - Raportează site defect + Protecțiile sunt ACTIVATE pentru acest site Protecțiile sunt DEZACTIVATE pentru acest site @@ -280,7 +273,7 @@ Caută și pe Duck.ai - Adaugă pe ecranul de pornire + Succes! %1$s a fost adăugat pe ecranul de pornire. @@ -486,8 +479,6 @@ Site-uri neprotejate - Activează protecția confidențialității - Dezactivează protecția confidențialității Mai multe opțiuni pentru site-ul neprotejat %1$s Sigur dorești să elimini <b>%1$s</b> din site-urile neprotejate? Aceste site-uri nu vor fi îmbunătățite de protecția confidențialității. @@ -586,11 +577,9 @@ Poți deschide acest link în %1$s. Poți deschide acest link în alte aplicații. Deschide cu - Deschide în aplicație Adresă nouă copiată în clipboard - Generează Duck Address Vezi @@ -774,10 +763,6 @@ Parolă salvată Parolă actualizată - - Deschide în DuckDuckGo - Redare în DuckDuckGo - Avertisment: acest site poate fi nesigur Certificatul pentru acest site este nevalid. S-ar putea să te conectezi la un server care pretinde a fi %1$s, ceea ce ar putea pune în pericol informațiile tale confidențiale. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2f1ed800a8db..e54bb682047a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -47,17 +47,12 @@ Введите поисковый запрос или адрес сайта Сбросить поисковый запрос Совместимое приложение не установлено - Добавить закладку - Редактировать закладку + Добавить в избранное Удалить из избранного Сайт добавлен в избранное Закладка добавлена - Полная версия сайта - Снять огнеупорность - Мобильная версия Загрузки - Печать страницы Страница удалена из избранного Огнеупорность снята Защита конфиденциальности на сайте %1$s включена @@ -78,11 +73,9 @@ Параметры Поделиться ссылкой - Поделиться Скопировать ссылку - Найти на странице Найти следующий Найти предыдущий Закрыть окно поиска на странице @@ -258,7 +251,7 @@ Нет предложений - Сообщить о неработающем сайте + На этом сайте ВКЛЮЧЕНЫ функции защиты На этом сайте ВЫКЛЮЧЕНЫ функции защиты @@ -281,7 +274,7 @@ Поиск плюс Duck.ai - Добавить на домашнюю страницу + Готово! Мы добавили %1$s на ваш домашний экран. @@ -487,8 +480,6 @@ Незащищенные сайты - Включить защиту конфиденциальности - Отключить защиту конфиденциальности Дополнительные параметры для незащищенного сайта %1$s Вы точно хотите удалить <b>%1$s</b> из списка незащищенных сайтов? Сайты без защиты конфиденциальности. @@ -587,11 +578,9 @@ Эту ссылку можно открыть в %1$s. Эту ссылку можно открыть в других приложениях. Открыть в - Открыть в приложении Новый адрес скопирован в буфер обмена - Создать адрес Duck Просмотр @@ -788,10 +777,6 @@ Пароль сохранен Пароль обновлен - - Открыть в DuckDuckGo - Выполняется в DuckDuckGo - Внимание! Возможно, сайт небезопасен Сертификат этого сайта недействителен. Возможно, вы пытаетесь подключиться к серверу, который выдает себя за %1$s, что ставит под угрозу вашу конфиденциальную информацию. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index bb4d5840ac5e..6b27c68ce2a8 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -47,17 +47,12 @@ Vyhľadať alebo zadať webovú adresu Vymazať hľadaný výraz Žiadna kompatibilná aplikácia nie je nainštalovaná - Pridať záložku - Upraviť záložku + Pridať do obľúbených položiek Odstrániť obľúbenú položku Obľúbená položka bola pridaná Záložka je pridaná - Stránka pre stolové počítače - Odstrániť zabezpečenie - Mobilný režim Stiahnuté - Tlačiť stranu Obľúbená položka bola odstránená Zabezpečenie bolo odstránené Ochrana súkromia je zapnutá pre %1$s @@ -78,11 +73,9 @@ Možnosti Zdieľať odkaz - Zdieľať Kopírovať adresu odkazu - Hľadať na stránke Hľadať ďalšie Hľadať predchádzajúce Zavrieť vyhľadávanie v zobrazení stránky @@ -258,7 +251,7 @@ Žiadne návrhy - Nahlásiť nefunkčný web + Ochrany pre túto lokalitu sú ZAPNUTÉ Ochrany pre túto lokalitu sú VYPNUTÉ @@ -281,7 +274,7 @@ Vyhľadať a Duck.ai - Pridať na domovskú obrazovku + Úspech! Na vašej ploche pribudla položka %1$s. @@ -487,8 +480,6 @@ Nezabezpečené webové stránky - Povoliť ochranu súkromia - Vypnúť ochranu súkromia Viac možností pre nezabezpečené webové stránky %1$s Naozaj chcete odstrániť <b>%1$s</b> z nezabezpečených webových stránok? Tieto webové stránky nebudú rozšírené o ochranu súkromia. @@ -587,11 +578,9 @@ Tento odkaz môžete otvoriť cez %1$s. Tento odkaz môžete otvoriť v iných aplikáciách. Otvoriť cez - Otvoriť v aplikácii Nová adresa bola skopírovaná do schránky - Generovanie adresy Duck Zobraziť @@ -788,10 +777,6 @@ Uložené heslo Aktualizácia hesla - - Otvoriť v DuckDuckGo - Spustené v DuckDuckGo - Varovanie: Táto stránka môže byť nezabezpečená Certifikát pre túto lokalitu je neplatný. Možno sa pripájate k serveru, ktorý predstiera, že je %1$s , čo by mohlo ohroziť vaše dôverné údaje. diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 56ee745ca8e9..1a6c1e23224a 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -47,17 +47,12 @@ Iščite z iskalnikom ali vnesite URL Počisti vhod iskanja Ni nameščene združljive aplikacije - Dodaj zaznamek - Uredi zaznamek + Dodaj priljubljene Odstrani priljubljene Priljubljeni dodan Zaznamek je dodan - Namizna stran - Odstrani požarno zaščito - Mobilna stran Prenosi - Natisni stran Priljubljeni odstranjeni Požarna zaščita je odstranjena Zaščita zasebnosti je omogočena za spletno mesto %1$s @@ -78,11 +73,9 @@ Možnosti Daj povezavo v skupno rabo - Deli Kopiraj naslov povezave - Najdi na strani Najdi naslednje Najdi prejšnje Zapri iskanje v pogledu strani @@ -258,7 +251,7 @@ Ni predlogov - Prijavite poškodovano spletno mesto + Zaščite so VKLOPLJENE za to spletno mesto Zaščite so IZKLOPLJENE za to spletno mesto @@ -281,7 +274,7 @@ Iskanje in Duck.ai - Dodaj na Domači Zaslon + Uspeh! %1$s je dodan na vaš začetni zaslon. @@ -487,8 +480,6 @@ Nezaščitene strani - Omogoči zaščito zasebnosti - Onemogoči zaščito zasebnosti Več možnosti za nezaščiteno stran %1$s Ali ste prepričani​, da želite odstraniti <b>%1$s</b> z nezaščitenih spletnih strani? Varnost teh strani se z zaščito zasebnosti ne bo izboljšala. @@ -587,11 +578,9 @@ To povezavo lahko odprete v %1$s. To povezavo lahko odprete v drugih aplikacijah. Odpri z - Odpri v aplikaciji Nov naslov je kopiran v odložišče - Ustvari naslov Duck Address Oglejte si @@ -788,10 +777,6 @@ Geslo je shranjeno Geslo je posodobljeno - - Odpri v DuckDuckGo - Izvaja se v DuckDuckGo - Opozorilo: To spletno mesto je morda nevarno Certifikat za to stran ni veljaven. Morda se povezujete s strežnikom, ki se pretvarja, da je %1$s, kar bi lahko ogrozilo vaše zaupne podatke. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index c2c15aab4e57..ecc315a2cfd0 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -47,17 +47,12 @@ Sök eller skriv in URL Rensa sökfältet Ingen kompatibel app installerad - Lägg till bokmärke - Redigera bokmärke + Lägg till favorit Ta bort favorit Favorit har lagts till Bokmärke sparat - Webbplats för dator - Ta bort brandsäkring - Webbplats för mobil Nerladdningar - Skriv ut sidan Favorit borttagen Brandsäkring har tagits bort Integritetsskydd aktiverat för %1$s @@ -76,11 +71,9 @@ Alternativ Dela länk - Dela Kopia länkadress - Hitta på sidan Hitta nästa Hitta föregående Stäng sökning i sidvy @@ -256,7 +249,7 @@ Inga förslag - Rapportera skadad webbplats + Skydd är för den här webbplatsen Skydd är AV för den här webbplatsen @@ -279,7 +272,7 @@ Sök och Duck.ai - Lägg till på hemskärmen + Klart! %1$s har lagts till på din startsida. @@ -485,8 +478,6 @@ Oskyddade webbplatser - Aktivera integritetsskydd - Inaktivera integritetsskydd Fler alternativ för den oskyddade webbplatsen %1$s Är du säker på att du vill ta bort <b>%1$s</b> från de oskyddade webbplatserna? Dessa webbplatser kommer inte att förbättras av integritetsskydd. @@ -585,11 +576,9 @@ Du kan öppna den här länken i %1$s. Du kan öppna den här länken i andra appar. Öppna med - Öppna i appen Ny adress har kopierats till Urklipp - Generera en Duck-adress Visa @@ -760,10 +749,6 @@ Lösenord sparat Lösenordet har uppdaterats - - Öppna i DuckDuckGo - Körs i DuckDuckGo - Varning: Denna webbplats kan vara osäker Certifikatet för denna webbplats är ogiltigt. Du kanske ansluter till en server som låtsas vara %1$s. Detta kan utgöra en risk för din konfidentiella information. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index ab2528b45181..4530378f4058 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -47,17 +47,12 @@ Ara ya da URL girin Arama girişini temizle Yüklü uyumlu uygulama yok - Yer İmi ekle - Yer İşaretini Düzenle + Favori Ekle Favoriyi Kaldır Favori eklendi Yer imi eklendi - Masaüstü Sitesi - Korumayı Kaldır - Mobil Site İndirilenler - Sayfayı Yazdır Favori kaldırıldı Koruma kaldırıldı %1$s için Gizlilik Koruması etkin @@ -76,11 +71,9 @@ Seçenekler Bağlantıyı paylaş - Paylaş Bağlantı Adresini Kopyala - Sayfada bul Sonrakini bul Öncekini bul Sayfa görünümünde bul özelliğini kapat @@ -256,7 +249,7 @@ Öneri yok - Hatalı Siteyi Bildirin + Bu site için korumalar AÇIK Bu site için korumalar KAPALI @@ -279,7 +272,7 @@ Arama ve Duck.ai - Ana ekrana ekle + Başarılı! %1$s ana ekranınıza eklendi. @@ -485,8 +478,6 @@ Korumasız Siteler - Gizlilik Korumasını Etkinleştir - Gizlilik Korumasını Devre Dışı Bırak Korumasız %1$s sitesi için diğer seçenekler <b>%1$s</b> sitesini korumasız sitelerden kaldırmak istediğinizden emin misiniz? Bu siteler için Gizlilik Koruması uygulanmayacaktır. @@ -585,11 +576,9 @@ Bu bağlantıyı %1$s uygulamasında açabilirsiniz. Bu bağlantıyı diğer uygulamalarda açabilirsiniz. Şununla aç: - Uygulamada Aç Yeni adres panoya kopyalandı - Duck Address Oluştur Görüntüle @@ -760,10 +749,6 @@ Şifre kaydedildi Şifre güncellendi - - DuckDuckGo\'da aç - DuckDuckGo\'da Çalışıyor - Uyarı: Bu site güvenli olmayabilir Bu sitenin sertifikası geçersiz. %1$s gibi görünen ve gizli bilgilerinizi riske atabilecek bir sunucuya bağlanıyor olabilirsiniz. diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0328e79db49a..b20db578dd31 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -16,7 +16,6 @@ 0dp - 280dp 8dp 76dp 136dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f762de2c677..23a90293df3d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,17 +46,12 @@ Search or type URL Clear search input No compatible app installed - Add Bookmark - Edit Bookmark + Add Favorite Remove Favorite Favorite added Bookmark added - Desktop Site - Remove Fireproofing - Mobile Site Downloads - Print Page Favorite removed Fireproofing removed Privacy Protection enabled for %1$s @@ -75,11 +70,9 @@ Options Share Link - Share Copy Link Address - Find in Page Find next Find previous Close find in page view @@ -255,7 +248,7 @@ No Suggestions - Report Broken Site + Protections are ON for this site Protections are OFF for this site @@ -278,7 +271,7 @@ Search and Duck.ai - Add to Home Screen + Success! %1$s has been added to your home screen. @@ -484,8 +477,6 @@ Unprotected Sites - Enable Privacy Protection - Disable Privacy Protection More options for unprotected site %1$s Are you sure you want to remove <b>%1$s</b> from Unprotected Sites? These sites will not be enhanced by Privacy Protection. @@ -584,11 +575,9 @@ You can open this link in %1$s. You can open this link in other apps. Open with - Open in App New address copied to your clipboard - Generate Duck Address View @@ -759,10 +748,6 @@ Password saved Password updated - - Open in DuckDuckGo - Running in DuckDuckGo - Warning: This site may be insecure The certificate for this site is invalid. You might be connecting to a server that is pretending to be %1$s which could put your confidential information at risk. diff --git a/app/src/test/java/com/duckduckgo/app/browser/BrowserTabViewModelVpnMenuTest.kt b/app/src/test/java/com/duckduckgo/app/browser/BrowserTabViewModelVpnMenuTest.kt index ae77f11894b9..8da0f7e929b7 100644 --- a/app/src/test/java/com/duckduckgo/app/browser/BrowserTabViewModelVpnMenuTest.kt +++ b/app/src/test/java/com/duckduckgo/app/browser/BrowserTabViewModelVpnMenuTest.kt @@ -21,7 +21,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import app.cash.turbine.test import com.duckduckgo.app.browser.commands.Command import com.duckduckgo.app.browser.menu.VpnMenuStateProvider -import com.duckduckgo.app.browser.viewstate.VpnMenuState +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.test.CoroutineTestRule import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest diff --git a/app/src/test/java/com/duckduckgo/app/browser/menu/BrowserPopupMenuVpnTest.kt b/app/src/test/java/com/duckduckgo/app/browser/menu/BrowserPopupMenuVpnTest.kt index 0acce41851b6..9156bec466be 100644 --- a/app/src/test/java/com/duckduckgo/app/browser/menu/BrowserPopupMenuVpnTest.kt +++ b/app/src/test/java/com/duckduckgo/app/browser/menu/BrowserPopupMenuVpnTest.kt @@ -16,7 +16,7 @@ package com.duckduckgo.app.browser.menu -import com.duckduckgo.app.browser.viewstate.VpnMenuState +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import org.junit.Assert.assertEquals import org.junit.Test diff --git a/app/src/test/java/com/duckduckgo/app/browser/menu/VpnMenuStateProviderTest.kt b/app/src/test/java/com/duckduckgo/app/browser/menu/VpnMenuStateProviderTest.kt index 55aa4fb59ef3..4ea419cac6fc 100644 --- a/app/src/test/java/com/duckduckgo/app/browser/menu/VpnMenuStateProviderTest.kt +++ b/app/src/test/java/com/duckduckgo/app/browser/menu/VpnMenuStateProviderTest.kt @@ -17,8 +17,8 @@ package com.duckduckgo.app.browser.menu import app.cash.turbine.test -import com.duckduckgo.app.browser.viewstate.VpnMenuState import com.duckduckgo.app.pixels.remoteconfig.AndroidBrowserConfigFeature +import com.duckduckgo.browser.ui.browsermenu.VpnMenuState import com.duckduckgo.common.test.CoroutineTestRule import com.duckduckgo.feature.toggles.api.Toggle import com.duckduckgo.networkprotection.api.NetworkProtectionState diff --git a/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenu.kt b/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenu.kt new file mode 100644 index 000000000000..eef115711381 --- /dev/null +++ b/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenu.kt @@ -0,0 +1,521 @@ +/* + * Copyright (c) 2022 DuckDuckGo + * + * 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. + */ + +package com.duckduckgo.browser.ui.browsermenu + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.widget.LinearLayout +import androidx.core.view.children +import androidx.core.view.isVisible +import com.duckduckgo.app.browser.omnibar.OmnibarType +import com.duckduckgo.browser.ui.R +import com.duckduckgo.browser.ui.databinding.PopupWindowBrowserMenuBinding +import com.duckduckgo.browser.ui.databinding.PopupWindowBrowserMenuBottomBinding +import com.duckduckgo.common.ui.menu.PopupMenu +import com.duckduckgo.common.ui.view.MenuItemView +import com.duckduckgo.common.ui.view.StatusIndicatorView +import com.duckduckgo.common.ui.view.gone +import com.duckduckgo.mobile.android.R.drawable + +class BrowserMenu( + private val context: Context, + layoutInflater: LayoutInflater, + private val omnibarType: OmnibarType, +) : PopupMenu( + layoutInflater, + resourceId = if (omnibarType == OmnibarType.SINGLE_BOTTOM) R.layout.popup_window_browser_menu_bottom else R.layout.popup_window_browser_menu, + width = context.resources.getDimensionPixelSize(R.dimen.browserPopupMenuWidth), +) { + private val topBinding = PopupWindowBrowserMenuBinding.bind(contentView) + private val bottomBinding = PopupWindowBrowserMenuBottomBinding.bind(contentView) + + init { + contentView = + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.root + else -> topBinding.root + } + } + + val backMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.backMenuItem + else -> topBinding.backMenuItem + } + } + + val forwardMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.forwardMenuItem + else -> topBinding.forwardMenuItem + } + } + + val refreshMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.refreshMenuItem + else -> topBinding.refreshMenuItem + } + } + + val printPageMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.printPageMenuItem + else -> topBinding.printPageMenuItem + } + } + + val newTabMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.newTabMenuItem + else -> topBinding.newTabMenuItem + } + } + + val defaultBrowserMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.includeDefaultBrowserMenuItem.defaultBrowserMenuItem + else -> topBinding.includeDefaultBrowserMenuItem.defaultBrowserMenuItem + } + } + + val vpnMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.includeVpnMenuItem.vpnMenuItem + else -> topBinding.includeVpnMenuItem.vpnMenuItem + } + } + + val duckChatMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.includeDuckChatMenuItem + else -> topBinding.includeDuckChatMenuItem + } + } + + val sharePageMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.sharePageMenuItem + else -> topBinding.sharePageMenuItem + } + } + + val bookmarksMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.bookmarksMenuItem + else -> topBinding.bookmarksMenuItem + } + } + + val downloadsMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.downloadsMenuItem + else -> topBinding.downloadsMenuItem + } + } + + val settingsMenuItem: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.settingsMenuItem + else -> topBinding.settingsMenuItem + } + } + + val addBookmarksMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.addBookmarksMenuItem + else -> topBinding.addBookmarksMenuItem + } + } + + val fireproofWebsiteMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.fireproofWebsiteMenuItem + else -> topBinding.fireproofWebsiteMenuItem + } + } + + val createAliasMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.createAliasMenuItem + else -> topBinding.createAliasMenuItem + } + } + + val changeBrowserModeMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.changeBrowserModeMenuItem + else -> topBinding.changeBrowserModeMenuItem + } + } + + val openInAppMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.openInAppMenuItem + else -> topBinding.openInAppMenuItem + } + } + + val findInPageMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.findInPageMenuItem + else -> topBinding.findInPageMenuItem + } + } + + val addToHomeMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.addToHomeMenuItem + else -> topBinding.addToHomeMenuItem + } + } + + val privacyProtectionMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.privacyProtectionMenuItem + else -> topBinding.privacyProtectionMenuItem + } + } + + val brokenSiteMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.brokenSiteMenuItem + else -> topBinding.brokenSiteMenuItem + } + } + + val autofillMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.autofillMenuItem + else -> topBinding.autofillMenuItem + } + } + + val runningInDdgBrowserMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.runningInDdgBrowserMenuItem + else -> topBinding.runningInDdgBrowserMenuItem + } + } + + val siteOptionsMenuDivider: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.siteOptionsMenuDivider + else -> topBinding.siteOptionsMenuDivider + } + } + + val browserOptionsMenuDivider: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.browserOptionsMenuDivider + else -> topBinding.browserOptionsMenuDivider + } + } + + val settingsMenuDivider: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.settingsMenuDivider + else -> topBinding.settingsMenuDivider + } + } + + val customTabsMenuDivider: View by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.customTabsMenuDivider + else -> topBinding.customTabsMenuDivider + } + } + + val openInDdgBrowserMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.openInDdgBrowserMenuItem + else -> topBinding.openInDdgBrowserMenuItem + } + } + + private val menuItemsContainer: LinearLayout by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.menuItemsContainer + else -> topBinding.menuItemsContainer + } + } + + val duckNewChatMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.newChatMenuItem + else -> topBinding.newChatMenuItem + } + } + + val duckChatHistoryMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.chatHistoryMenuItem + else -> topBinding.chatHistoryMenuItem + } + } + + val duckChatSettingsMenuItem: MenuItemView by lazy { + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> bottomBinding.chatSettings + else -> topBinding.chatSettings + } + } + + fun render(viewState: BrowserMenuViewState) { + hideAllMenuItems() + when (viewState) { + is BrowserMenuViewState.Browser -> renderBrowserMenu(viewState) + is BrowserMenuViewState.CustomTabs -> renderCustomTabsMenu(viewState) + is BrowserMenuViewState.NewTabPage -> renderNewTabPageMenu(viewState) + is BrowserMenuViewState.DuckAi -> renderDuckAIMenu(viewState) + } + } + + private fun hideAllMenuItems() { + menuItemsContainer.children.forEach { menuItem -> + menuItem.gone() + } + } + + /** + * These are items available across all browser types + */ + private fun showCommonItems() { + bookmarksMenuItem.isVisible = true + downloadsMenuItem.isVisible = true + settingsMenuItem.isVisible = true + } + + private fun renderBrowserMenu(viewState: BrowserMenuViewState.Browser) { + showCommonItems() + backMenuItem.isEnabled = viewState.canGoBack + forwardMenuItem.isEnabled = viewState.canGoForward + refreshMenuItem.isEnabled = true + printPageMenuItem.isEnabled = true + + newTabMenuItem.isVisible = true + duckChatMenuItem.isVisible = viewState.showDuckChatOption + sharePageMenuItem.isVisible = viewState.canSharePage + + defaultBrowserMenuItem.isVisible = viewState.showSelectDefaultBrowserMenuItem + + addBookmarksMenuItem.isVisible = viewState.canSaveSite + addBookmarksMenuItem.label { + context.getString(if (viewState.isBookmark) R.string.browserMenuEditBookmark else R.string.browserMenuAddBookmark) + } + addBookmarksMenuItem.setIcon(if (viewState.isBookmark) drawable.ic_bookmark_solid_16 else drawable.ic_bookmark_16) + + fireproofWebsiteMenuItem.isVisible = viewState.canFireproofSite + fireproofWebsiteMenuItem.label { + context.getString( + if (viewState.isFireproofWebsite) { + R.string.browserMenuRemoveFireproofing + } else { + R.string.browserMenuFireproofSite + }, + ) + } + fireproofWebsiteMenuItem.setIcon(if (viewState.isFireproofWebsite) drawable.ic_fire_16 else drawable.ic_fireproof_solid_16) + + createAliasMenuItem.isVisible = viewState.isEmailSignedIn + + changeBrowserModeMenuItem.isVisible = viewState.canChangeBrowsingMode + changeBrowserModeMenuItem.label { + context.getString( + if (viewState.isDesktopBrowsingMode) { + R.string.browserMenuMobileSite + } else { + R.string.browserMenuDesktopSite + }, + ) + } + changeBrowserModeMenuItem.setIcon( + if (viewState.isDesktopBrowsingMode) drawable.ic_device_mobile_16 else drawable.ic_device_desktop_16, + ) + + openInAppMenuItem.isVisible = viewState.hasPreviousAppLink + findInPageMenuItem.isVisible = viewState.canFindInPage + addToHomeMenuItem.isVisible = viewState.addToHomeVisible && viewState.addToHomeEnabled + privacyProtectionMenuItem.isVisible = viewState.canChangePrivacyProtection + privacyProtectionMenuItem.label { + context + .getText( + if (viewState.isPrivacyProtectionDisabled) { + R.string.browserMenuEnablePrivacyProtection + } else { + R.string.browserMenuDisablePrivacyProtection + }, + ).toString() + } + privacyProtectionMenuItem.setIcon( + if (viewState.isPrivacyProtectionDisabled) drawable.ic_shield_16 else drawable.ic_shield_disabled_16, + ) + brokenSiteMenuItem.isVisible = viewState.canReportSite + + siteOptionsMenuDivider.isVisible = true + browserOptionsMenuDivider.isVisible = true + settingsMenuDivider.isVisible = true + printPageMenuItem.isVisible = viewState.canPrintPage + autofillMenuItem.isVisible = viewState.showAutofill + + vpnMenuItem.isVisible = false + + openInDdgBrowserMenuItem.isVisible = false + customTabsMenuDivider.isVisible = false + runningInDdgBrowserMenuItem.isVisible = false + + if (viewState.isSSLError) { + newTabMenuItem.isVisible = true + siteOptionsMenuDivider.isVisible = true + } + } + + private fun renderCustomTabsMenu(viewState: BrowserMenuViewState.CustomTabs) { + backMenuItem.isEnabled = viewState.canGoBack + forwardMenuItem.isEnabled = viewState.canGoForward + + refreshMenuItem.isEnabled = true + printPageMenuItem.isEnabled = true + + sharePageMenuItem.isVisible = viewState.canSharePage + findInPageMenuItem.isVisible = viewState.canFindInPage + + changeBrowserModeMenuItem.isVisible = viewState.canChangeBrowsingMode + changeBrowserModeMenuItem.label { + context.getString( + if (viewState.isDesktopBrowsingMode) { + R.string.browserMenuMobileSite + } else { + R.string.browserMenuDesktopSite + }, + ) + } + + privacyProtectionMenuItem.isVisible = viewState.canChangePrivacyProtection + privacyProtectionMenuItem.label { + context + .getText( + if (viewState.isPrivacyProtectionDisabled) { + R.string.browserMenuEnablePrivacyProtection + } else { + R.string.browserMenuDisablePrivacyProtection + }, + ).toString() + } + privacyProtectionMenuItem.setIcon( + if (viewState.isPrivacyProtectionDisabled) drawable.ic_shield_16 else drawable.ic_shield_disabled_16, + ) + + openInDdgBrowserMenuItem.isVisible = true + customTabsMenuDivider.isVisible = true + runningInDdgBrowserMenuItem.isVisible = true + } + + private fun renderNewTabPageMenu(viewState: BrowserMenuViewState.NewTabPage) { + showCommonItems() + + backMenuItem.isEnabled = false + forwardMenuItem.isEnabled = false + refreshMenuItem.isEnabled = false + + newTabMenuItem.isVisible = true + duckChatMenuItem.isVisible = viewState.showDuckChatOption + autofillMenuItem.isVisible = viewState.showAutofill + + when (viewState.vpnMenuState) { + VpnMenuState.Hidden -> { + vpnMenuItem.isVisible = false + } + VpnMenuState.NotSubscribed -> { + vpnMenuItem.isVisible = true + val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() + configureVpnMenuItemForNotSubscribed(tryForFreePill, statusIndicator, menuItemView) + } + VpnMenuState.NotSubscribedNoPill -> { + vpnMenuItem.isVisible = true + val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() + configureVpnMenuItemForNotSubscribedNoPill(tryForFreePill, statusIndicator, menuItemView) + } + is VpnMenuState.Subscribed -> { + vpnMenuItem.isVisible = true + val (tryForFreePill, statusIndicator, menuItemView) = getVpnMenuViews() + configureVpnMenuItemForSubscribed(tryForFreePill, statusIndicator, menuItemView, viewState.vpnMenuState.isVpnEnabled) + } + } + } + + private fun renderDuckAIMenu(viewState: BrowserMenuViewState.DuckAi) { + brokenSiteMenuItem.isVisible = viewState.canReportSite + printPageMenuItem.isVisible = viewState.canPrintPage + duckChatHistoryMenuItem.isVisible = true + duckChatSettingsMenuItem.isVisible = true + duckNewChatMenuItem.isVisible = true + } + + private fun getVpnMenuViews() = + when (omnibarType) { + OmnibarType.SINGLE_BOTTOM -> { + Triple( + bottomBinding.includeVpnMenuItem.tryForFreePill, + bottomBinding.includeVpnMenuItem.statusIndicator, + bottomBinding.includeVpnMenuItem.menuItemView, + ) + } + + else -> + Triple( + topBinding.includeVpnMenuItem.tryForFreePill, + topBinding.includeVpnMenuItem.statusIndicator, + topBinding.includeVpnMenuItem.menuItemView, + ) + } + + private fun configureVpnMenuItemForNotSubscribed( + tryForFreePill: View, + statusIndicator: StatusIndicatorView, + menuItemView: MenuItemView, + ) { + tryForFreePill.isVisible = true + statusIndicator.isVisible = false + menuItemView.setIcon(drawable.ic_vpn_unlocked_24) + } + + private fun configureVpnMenuItemForNotSubscribedNoPill( + tryForFreePill: View, + statusIndicator: StatusIndicatorView, + menuItemView: MenuItemView, + ) { + tryForFreePill.isVisible = false + statusIndicator.isVisible = false + menuItemView.setIcon(drawable.ic_vpn_unlocked_24) + } + + private fun configureVpnMenuItemForSubscribed( + tryForFreePill: View, + statusIndicator: StatusIndicatorView, + menuItemView: MenuItemView, + isVpnEnabled: Boolean, + ) { + tryForFreePill.isVisible = false + statusIndicator.isVisible = true + statusIndicator.setStatus(isVpnEnabled) + + val iconRes = if (isVpnEnabled) drawable.ic_vpn_24 else drawable.ic_vpn_unlocked_24 + menuItemView.setIcon(iconRes) + } +} diff --git a/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenuViewState.kt b/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenuViewState.kt new file mode 100644 index 000000000000..1f5745940157 --- /dev/null +++ b/browser/browser-ui/src/main/java/com/duckduckgo/browser/ui/browsermenu/BrowserMenuViewState.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2025 DuckDuckGo + * + * 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. + */ + +package com.duckduckgo.browser.ui.browsermenu + +sealed class BrowserMenuViewState { + + data class Browser( + val canGoBack: Boolean = false, + val canGoForward: Boolean = false, + val showDuckChatOption: Boolean = false, + val canSharePage: Boolean = false, + val showSelectDefaultBrowserMenuItem: Boolean = false, + val canSaveSite: Boolean = false, + val isBookmark: Boolean = false, + val canFireproofSite: Boolean = false, + val isFireproofWebsite: Boolean = false, + val isEmailSignedIn: Boolean = false, + val canChangeBrowsingMode: Boolean = false, + val isDesktopBrowsingMode: Boolean = false, + val hasPreviousAppLink: Boolean = false, + val canFindInPage: Boolean = false, + val addToHomeVisible: Boolean = false, + val addToHomeEnabled: Boolean = false, + val canChangePrivacyProtection: Boolean = false, + val isPrivacyProtectionDisabled: Boolean = false, + val canReportSite: Boolean = false, + val showAutofill: Boolean = false, + val isSSLError: Boolean = false, + val canPrintPage: Boolean = false, + + ) : BrowserMenuViewState() + data class CustomTabs( + val canGoBack: Boolean = false, + val canGoForward: Boolean = false, + val canSharePage: Boolean = false, + val canChangeBrowsingMode: Boolean = false, + val isDesktopBrowsingMode: Boolean = false, + val canFindInPage: Boolean = true, + val canChangePrivacyProtection: Boolean = false, + val isPrivacyProtectionDisabled: Boolean = false, + ) : BrowserMenuViewState() + data class NewTabPage( + val showDuckChatOption: Boolean = false, + val vpnMenuState: VpnMenuState = VpnMenuState.Hidden, + val showAutofill: Boolean = false, + ) : BrowserMenuViewState() + data class DuckAi( + val canPrintPage: Boolean = false, + val canReportSite: Boolean = false, + ) : BrowserMenuViewState() +} + +sealed class VpnMenuState { + data object Hidden : VpnMenuState() + + data object NotSubscribed : VpnMenuState() + + data object NotSubscribedNoPill : VpnMenuState() + + data class Subscribed( + val isVpnEnabled: Boolean, + ) : VpnMenuState() +} diff --git a/browser/browser-ui/src/main/res/drawable/background_default_browser_menu_item.xml b/browser/browser-ui/src/main/res/drawable/background_default_browser_menu_item.xml new file mode 100644 index 000000000000..dca46e662950 --- /dev/null +++ b/browser/browser-ui/src/main/res/drawable/background_default_browser_menu_item.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/drawable/ic_ai_chat_add_16.xml b/browser/browser-ui/src/main/res/drawable/ic_ai_chat_add_16.xml new file mode 100644 index 000000000000..b3efff21c4e5 --- /dev/null +++ b/browser/browser-ui/src/main/res/drawable/ic_ai_chat_add_16.xml @@ -0,0 +1,36 @@ + + + + + + + + + + diff --git a/browser/browser-ui/src/main/res/drawable/ic_history_16.xml b/browser/browser-ui/src/main/res/drawable/ic_history_16.xml new file mode 100644 index 000000000000..92cf277b9be4 --- /dev/null +++ b/browser/browser-ui/src/main/res/drawable/ic_history_16.xml @@ -0,0 +1,12 @@ + + + + diff --git a/browser/browser-ui/src/main/res/drawable/ic_settings_ai_16.xml b/browser/browser-ui/src/main/res/drawable/ic_settings_ai_16.xml new file mode 100644 index 000000000000..d57f28f83eb2 --- /dev/null +++ b/browser/browser-ui/src/main/res/drawable/ic_settings_ai_16.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/app/src/main/res/layout/popup_window_browser_menu.xml b/browser/browser-ui/src/main/res/layout/popup_window_browser_menu.xml similarity index 78% rename from app/src/main/res/layout/popup_window_browser_menu.xml rename to browser/browser-ui/src/main/res/layout/popup_window_browser_menu.xml index bc7c68f90c9f..ddd8d9b5b401 100644 --- a/app/src/main/res/layout/popup_window_browser_menu.xml +++ b/browser/browser-ui/src/main/res/layout/popup_window_browser_menu.xml @@ -38,7 +38,7 @@ android:id="@+id/backMenuItem" style="@style/Widget.DuckDuckGo.NavigationalIcon" android:layout_marginStart="@dimen/keyline_4" - android:contentDescription="@string/back" + android:contentDescription="@string/browserMenuBack" app:srcCompat="@drawable/ic_arrow_left_24" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -47,7 +47,7 @@ + + + + + app:primaryText="@string/browserMenuNewTab" /> - + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:iconDrawable="@drawable/ic_ai_chat_16" + app:primaryText="@string/browserMenuDuckChat" /> + app:primaryText="@string/browserMenuShare" /> + app:primaryText="@string/browserMenuAddBookmark" /> + app:primaryText="@string/browserMenuBookmarks" /> + app:primaryText="@string/browserMenuFireproofSite" /> + app:primaryText="@string/browserMenuEmailAlias" /> + app:primaryText="@string/browserMenuDesktopSite" /> + app:primaryText="@string/browserMenuFindInPage" /> + app:primaryText="@string/browserMenuPrint" /> + app:primaryText="@string/browserMenuOpenAppLink" /> + app:primaryText="@string/browserMenuAddToHome" /> + app:primaryText="@string/browserMenuEnablePrivacyProtection" /> + app:primaryText="@string/browserMenuReportBrokenSite" /> + app:primaryText="@string/browserMenuAutofill" /> + app:primaryText="@string/browserMenuDownloads" /> + app:primaryText="@string/browserMenuSettings" /> + + + app:primaryText="@string/browserMenuOpenInDDG" /> + app:primaryText="@string/browserMenuRunningInDDG" /> diff --git a/app/src/main/res/layout/popup_window_browser_menu_bottom.xml b/browser/browser-ui/src/main/res/layout/popup_window_browser_menu_bottom.xml similarity index 78% rename from app/src/main/res/layout/popup_window_browser_menu_bottom.xml rename to browser/browser-ui/src/main/res/layout/popup_window_browser_menu_bottom.xml index 006826ca35bd..ee0152d625cf 100644 --- a/app/src/main/res/layout/popup_window_browser_menu_bottom.xml +++ b/browser/browser-ui/src/main/res/layout/popup_window_browser_menu_bottom.xml @@ -33,21 +33,41 @@ android:paddingTop="@dimen/keyline_2"> + + + + + app:primaryText="@string/browserMenuNewTab" /> - + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:iconDrawable="@drawable/ic_ai_chat_16" + app:primaryText="@string/browserMenuDuckChat" /> + app:primaryText="@string/browserMenuShare" /> + app:primaryText="@string/browserMenuAddBookmark" /> + app:primaryText="@string/browserMenuBookmarks" /> + app:primaryText="@string/browserMenuFireproofSite" /> + app:primaryText="@string/browserMenuEmailAlias" /> + app:primaryText="@string/browserMenuDesktopSite" /> + app:primaryText="@string/browserMenuFindInPage" /> + app:primaryText="@string/browserMenuPrint" /> + app:primaryText="@string/browserMenuOpenAppLink" /> + app:primaryText="@string/browserMenuAddToHome" /> + app:primaryText="@string/browserMenuEnablePrivacyProtection" /> + app:primaryText="@string/browserMenuReportBrokenSite" /> + app:primaryText="@string/browserMenuAutofill" /> + app:primaryText="@string/browserMenuDownloads" /> + app:primaryText="@string/browserMenuSettings" /> + + + app:primaryText="@string/browserMenuOpenInDDG" /> + app:primaryText="@string/browserMenuRunningInDDG" /> @@ -232,7 +260,7 @@ android:id="@+id/backMenuItem" style="@style/Widget.DuckDuckGo.NavigationalIcon" android:layout_marginStart="@dimen/keyline_4" - android:contentDescription="@string/back" + android:contentDescription="@string/browserMenuBack" app:srcCompat="@drawable/ic_arrow_left_24" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -241,7 +269,7 @@ + + + + + Премахване на огнеустойчивост + Отметки + Добави отметка + Редактиране на отметка + Направи този сайт огнеустойчив + Мобилна версия на сайта + Сайт на работния плот + Активиране на защита на поверителността + Деактивиране на защита на поверителността + Нов раздел + Duck.ai + Споделяне + Генериране на Duck Address + Намери в страницата + Отпечатване на страницата + Отваряне в приложението + Добавете към Начална Страница + Подаване на сигнал за повреден сайт + Пароли + Изтеглени файлове + Настройки + Отваряне в DuckDuckGo + Работи в DuckDuckGo + Задаване като браузър по подразбиране + Нов чат + История на чата + Настройки на Duck.ai + VPN + + + Обратно + Напред + Опресняване + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-bg/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-bg/strings-input-mode.xml index f932371f766f..7ee8722df16b 100644 --- a/browser/browser-ui/src/main/res/values-bg/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-bg/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Odstranit ochranu + Záložky + Přidat záložku + Upravit záložku + Ochránit tento web + Mobilní režim + Verze pro počítač + Povolit ochranu soukromí + Zakázat ochranu soukromí + Nová karta + Duck.ai + Sdílet + Vygenerovat adresu Duck + Vyhledávání na stránce + Vytisknout stránku + Otevřít v aplikaci + Přidat na domovskou obrazovku + Nahlásit nefunkční webové stránky + Hesla + Stahování + Nastavení + Otevřít v DuckDuckGo + Spuštěno v DuckDuckGo + Nastavit jako výchozí prohlížeč + Nový chat + Historie chatu + Nastavení Duck.ai + VPN + + + Zpět + Dopředu + Obnovit + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-cs/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-cs/strings-input-mode.xml index a9e06628815f..2dfeffdd2883 100644 --- a/browser/browser-ui/src/main/res/values-cs/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-cs/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Fjern brandsikring + Bogmærker + Tilføj bogmærke + Rediger bogmærke + Gør dette websted brandsikkert + Mobilwebsted + Stationær computer + Aktiver Beskyttelse af privatlivet + Deaktiver Beskyttelse af privatlivet + Ny fane + Duck.ai + Del + Generér Duck-adresse + Find på side + Udskriv side + Åbn i app + Tilføj til startskærm + Rapporter ødelagt websted + Adgangskoder + Downloads + Indstillinger + Åben i DuckDuckGo + Kører i DuckDuckGo + Angiv som standardbrowser + Ny chat + Chathistorik + Duck.ai-indstillinger + VPN + + + Tilbage + Frem + Opdater + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-da/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-da/strings-input-mode.xml index 3bed47900996..efc45f82db95 100644 --- a/browser/browser-ui/src/main/res/values-da/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-da/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Feuerfest-Einstellung deaktivieren + Lesezeichen + Lesezeichen hinzufügen + Lesezeichen bearbeiten + Diese Website feuerfest machen + Mobile Website + Desktop-Seite + Datenschutz aktivieren + Datenschutz deaktivieren + Neuer Tab + Duck.ai + Teilen + Duck-Adresse generieren + Auf Seite suchen + Seite drucken + In App öffnen + Zum Startbildschirm hinzufügen + Fehlerhafte Seite melden + Passwörter + Downloads + Einstellungen + In DuckDuckGo öffnen + Laufen in DuckDuckGo + Als Standard-Browser festlegen + Neuer Chat + Chatverlauf + Duck.ai-Einstellungen + VPN + + + Zurück + Weiter + Aktualisieren + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-de/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-de/strings-input-mode.xml index d14e10ded754..257d92b86158 100644 --- a/browser/browser-ui/src/main/res/values-de/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-de/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Αφαίρεση διαγραφής δραστηριότητας + Σελιδοδείκτες + Προσθήκη σελιδοδείκτη + Επεξεργασία σελιδοδείκτη + Διαγράψτε τη δραστηριότητα γι\' αυτόν τον ιστότοπο + Ιστότοπος για κινητά + Ιστότοπος επιφάνειας εργασίας + Ενεργοποίηση Προστασίας προσωπικών δεδομένων + Απενεργοποίηση Προστασίας προσωπικών δεδομένων + Νέα καρτέλα + Duck.ai + Κοινή χρήση + Δημιουργήστε Duck Address + Εύρεση στη σελίδα + Εκτύπωση σελίδας + Ανοίξτε στην εφαρμογή + Προσθήκη στην Αρχική Οθόνη + Αναφορά ιστότοπου που δεν λειτουργεί + Κωδικοί πρόσβασης + Λήψεις + Ρυθμίσεις + Άνοιγμα στο DuckDuckGo + Εκτέλεση στο DuckDuckGo + Ορισμός ως προεπιλεγμένο πρόγραμμα περιήγησης + Νέα συνομιλία + Ιστορικό συνομιλίας + Ρυθμίσεις Duck.ai + VPN + + + Πίσω + Εμπρός + Ανανέωση + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-el/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-el/strings-input-mode.xml index 81866f86c927..1d688b89b60e 100644 --- a/browser/browser-ui/src/main/res/values-el/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-el/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Desactivar a prueba de fuego + Marcadores + Añadir marcador + Editar marcador + Activar a prueba de fuego para este sitio + Sitio móvil + Versión de escritorio del sitio web + Activar la protección de privacidad + Desactivar la protección de privacidad + Nueva pestaña + Duck.ai + Compartir + Generar Duck Address + Buscar en la página + Imprimir página + Abrir en la aplicación + Añadir a la Pantalla de Inicio + Informar de sitio web dañado + Contraseñas + Descargas + Ajustes + Abrir en DuckDuckGo + Ejecutar en DuckDuckGo + Definir como navegador predeterminado + Nuevo chat + Historial de chat + Configuración de Duck.ai + VPN + + + Volver + Avanzar + Actualizar + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-es/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-es/strings-input-mode.xml index d4d928945666..90bb7c4e201c 100644 --- a/browser/browser-ui/src/main/res/values-es/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-es/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Eemalda tulekindlus + Järjehoidjad + Lisa järjehoidja + Redigeeri järjehoidjat + Muuda see sait tulekindlaks + Mobiilisait + Töölaua sait + Luba privaatsuse kaitse + Keela privaatsuse kaitse + Uus vaheleht + Duck.ai + Jaga + Loo Duck Address + Otsi lehel + Prindi leht + Ava rakenduses + Lisa kodukuvale + Teata mittetoimivast saidist + Paroolid + Allalaadimised + Sätted + Ava saidil DuckDuckGo + DuckDuckGo-s käivitamine + Määrake vaikebrauseriks + Uus vestlus + Vestluse ajalugu + Duck.ai seaded + VPN + + + Tagasi + Edasi + Värskenda + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-et/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-et/strings-input-mode.xml index e84e2b03d054..13a41f56635b 100644 --- a/browser/browser-ui/src/main/res/values-et/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-et/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Poista palonkestävyys + Kirjanmerkit + Lisää kirjanmerkki + Muokkaa kirjanmerkkiä + Tee sivustosta palonkestäviä + Mobiilisivusto + Pöytäkonesivusto + Ota yksityisyyden suoja käyttöön + Poista yksityisyyden suoja käytöstä + Uusi välilehti + Duck.ai + Jaa + Luo Duck Address + Etsi sivulta + Tulosta sivu + Avaa sovelluksessa + Lisää kotinäytölle + Ilmoita viallisesta sivustosta + Salasanat + Lataukset + Asetukset + Avaa DuckDuckGo:ssa + Käynnissä DuckDuckGossa + Aseta oletusselaimeksi + Uusi keskustelu + Keskusteluhistoria + Duck.ai-asetukset + VPN + + + Takaisin + Eteenpäin + Päivitä + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-fi/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-fi/strings-input-mode.xml index 78a8169c0637..52c8907eed1c 100644 --- a/browser/browser-ui/src/main/res/values-fi/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-fi/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Désactiver le mode coupe-feu + Signets + Ajouter un signet + Modifier le signet + Activer le mode coupe-feu pour ce site + Version mobile + Site en version bureau + Activer la protection de la confidentialité + Désactiver la protection de la confidentialité + Nouvel onglet + Duck.ai + Partager + Générer une Duck Address + Rechercher dans la page + Imprimer la page + Ouvrir dans l\'application + Ajouter à la page d\'accueil + Signaler un problème de site + Mots de passe + Téléchargements + Paramètres + Ouvrir dans DuckDuckGo + S\'exécute dans DuckDuckGo + Définir comme navigateur par défaut + Nouvelle discussion + Historique des chats + Paramètres Duck.ai + VPN + + + Retour + Avancer + Actualiser + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-fr/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-fr/strings-input-mode.xml index 7d38129c6380..2ec73632a7ed 100644 --- a/browser/browser-ui/src/main/res/values-fr/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-fr/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Ukloni oznaku sigurnog web-mjesta + Knjižne oznake + Dodaj knjižnu oznaku + Uredi knjižnu oznaku + Uključi oznaku da je ovo web-mjesto sigurno + Mobilno mrežno mjesto + Mjesto radne površine + Omogući zaštitu privatnosti + Onemogući zaštitu privatnosti + Nova kartica + Duck.ai + Podijeli + Generiraj Duck Address + Pronađi na stranici + Ispiši stranicu + Otvori u aplikaciji + Dodaj na početni zaslon + Prijavi neispravno web-mjesto + Lozinke + Preuzimanja + Postavke + Otvori u DuckDuckGou + Izvodi se u DuckDuckGou + Postavi kao zadani preglednik + Novo čavrljanje + Povijest čavrljanja + Postavke usluge Duck.ai + VPN + + + Natrag + Naprijed + Osvježi + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-hr/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-hr/strings-input-mode.xml index d5415d279757..5fd62806028f 100644 --- a/browser/browser-ui/src/main/res/values-hr/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-hr/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Tűzállóság eltávolítása + Könyvjelzők + Könyvjelző mentése + Könyvjelző szerkesztése + Weboldal tűzállóvá tétele + Weboldal mobil nézete + Weboldal asztali nézete + Adatvédelem engedélyezése + Adatvédelem letiltása + Új lap + Duck.ai + Megosztás + Duck-cím létrehozása + Keresés az oldalon + Oldal nyomtatása + Megnyitás az alkalmazásban + Hozzáadás a kezdőlaphoz + Hibás weboldal jelentése + Jelszavak + Letöltések + Beállítások + Megnyitás DuckDuckGo-ban + Futtatás a DuckDuckGo-ban + Beállítás alapértelmezett böngészőként + Új csevegés + Csevegési előzmények + A Duck.ai beállításai + VPN + + + Vissza + Előre + Frissítés + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-hu/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-hu/strings-input-mode.xml index 7512c499798d..97d4e279c4ce 100644 --- a/browser/browser-ui/src/main/res/values-hu/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-hu/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Rimuovi protezione dal fuoco + Segnalibri + Aggiungi ai segnalibri + Modifica segnalibro + Proteggi questo sito dal fuoco + Sito per dispositivi mobili + Sito desktop + Attiva la tutela della privacy + Disattiva la tutela della privacy + Nuova scheda + Duck.ai + Condividi + Genera Duck Address + Trova nella pagina + Stampa pagina + Apri nell\'app + Aggiungi alla Schermata Home + Segnala sito danneggiato + Password + Download + Impostazioni + Apri in DuckDuckGo + Esecuzione in DuckDuckGo + Imposta come Browser predefinito + Nuova Chat + Cronologia chat + Impostazioni di Duck.ai + VPN + + + Indietro + Avanti + Aggiorna + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-it/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-it/strings-input-mode.xml index ade7ee4c8e92..b49884f2e1f1 100644 --- a/browser/browser-ui/src/main/res/values-it/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-it/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Šalinti apsaugą + Žymės + Pridėti žymę + Redaguoti žymę + Apsaugoti šią svetainę + Mobilioji svetainė + Darbalaukio svetainė + Įjungti privatumo apsaugą + Išjungti privatumo apsaugą + Nauja kortelė + Duck.ai + Bendrinti + Sukurkite „Duck“ adresą + Rasti puslapyje + Spausdinti puslapį + Atidaryti programėlėje + Pridėti prie pagrindinio ekrano + Pranešti apie sugadintą svetainę + Slaptažodžiai + Atsisiuntimai + Nustatymai + Atidaryti „DuckDuckGo“ + Veikia sistemoje „DuckDuckGo“ + Nustatyti kaip numatytąją naršyklę + Naujas pokalbis + Pokalbių istorija + „Duck.ai“ nustatymai + VPN + + + Atgal + Pirmyn + Atnaujinti + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-lt/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-lt/strings-input-mode.xml index f7bc7f128197..c3dcaa44af91 100644 --- a/browser/browser-ui/src/main/res/values-lt/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-lt/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Noņemt ugunsdrošību + Grāmatzīmes + Pievienot grāmatzīmi + Rediģēt grāmatzīmi + Padarīt šo vietni ugunsdrošu + Mobilā vietne + Darbvirsmas vietne + Iespējot privātuma aizsardzību + Atspējot privātuma aizsardzību + Jauna cilne + Duck.ai + Kopīgot + Izveidot Duck adresi + Atrast lapā + Drukāt lapu + Atvērt lietotnē + Pievienot sākuma ekrānam + Ziņot par bojātu vietni + Paroles + Lejupielādes + Iestatījumi + Atvērt vietnē DuckDuckGo + Darbojas programmā DuckDuckGo + Iestatīt kā noklusējuma pārlūku + Jauna tērzēšanas saruna + Tērzēšanas sarunu vēsture + Duck.ai iestatījumi + VPN + + + Atpakaļ + Uz priekšu + Atsvaidzināt + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-lv/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-lv/strings-input-mode.xml index 67d5e1656c7b..1941df82b5f4 100644 --- a/browser/browser-ui/src/main/res/values-lv/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-lv/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Fjern brannsikring + Bokmerker + Legg til bokmerke + Rediger bokmerke + Brannsikre denne siden + Mobilversjon + Skrivebordversjon + Aktiver personvernbeskyttelse + Deaktiver personvernbeskyttelse + Ny fane + Duck.ai + Del + Generer Duck-adresse + Finn på side + Skriv ut siden + Åpne i appen + Legg til på startskjermen + Rapporter nettstedfeil + Passord + Nedlastinger + Innstillinger + Åpne i DuckDuckGo + Kjører i DuckDuckGo + Gjør til standardnettleser + Ny chat + Chattehistorikk + Innstillinger for Duck.ai + VPN + + + Tilbake + Frem + Oppdater + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-nb/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-nb/strings-input-mode.xml index 4f431bab5842..3079d14aa5b1 100644 --- a/browser/browser-ui/src/main/res/values-nb/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-nb/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Brandveiligheid uitschakelen + Bladwijzers + Bladwijzer toevoegen + Bladwijzer bewerken + Deze website brandveilig maken + Mobiele site + Desktopsite + Privacybescherming inschakelen + Privacybescherming uitschakelen + Nieuw tabblad + Duck.ai + Delen + Duck Address genereren + Zoek op pagina + Pagina printen + Openen in de app + Toevoegen aan Home Screen + Defecte website melden + Wachtwoorden + Downloads + Instellingen + Openen in DuckDuckGo + Uitgevoerd in DuckDuckGo + Instellen als standaard browser + Nieuwe chat + Chatgeschiedenis + Duck.ai-instellingen + VPN + + + Terug + Vooruit + Vernieuwen + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-nl/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-nl/strings-input-mode.xml index ae45bae2ea3b..d559ee0e51bf 100644 --- a/browser/browser-ui/src/main/res/values-nl/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-nl/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Usuń zabezpieczenie + Zakładki + Dodaj zakładkę + Edytuj zakładkę + Zabezpiecz tę witrynę + Witryna mobilna + Witryna w wersji komputerowej + Włącz ochronę prywatności + Wyłącz ochronę prywatności + Nowa karta + Duck.ai + Udostępnij + Wygeneruj Duck Address + Znajdź na stronie + Drukuj stronę + Otwórz w aplikacji + Dodaj do ekranu głównego + Zgłoś uszkodzoną witrynę + Hasła + Pobrane + Ustawienia + Otwórz w DuckDuckGo + Uruchamianie w DuckDuckGo + Ustaw jako domyślną przeglądarkę + Nowy czat + Historia czatów + Ustawienia Duck.ai + VPN + + + Wstecz + Dalej + Odśwież + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-pl/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-pl/strings-input-mode.xml index 86e3a108d3f3..84c29f634bd4 100644 --- a/browser/browser-ui/src/main/res/values-pl/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-pl/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Remover barreira de segurança + Marcadores + Adicionar marcador + Editar marcador + Coloque uma barreira de segurança neste site + Site móvel + Site para computador de secretária + Ativar Proteção de Privacidade + Desativar Proteção de Privacidade + Novo separador + Duck.ai + Partilhar + Gerar Duck Address + Encontrar na página + Imprimir página + Abrir na app + Adicionar à Página Inicial + Denunciar site danificado + Palavras-passe + Transferências + Definições + Abrir no DuckDuckGo + Em execução no DuckDuckGo + Definir como navegador padrão + Nova conversa + Histórico do chat + Definições do Duck.ai + VPN + + + Retroceder + Avançar + Atualizar + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-pt/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-pt/strings-input-mode.xml index 9c22d021e355..22712bde8b21 100644 --- a/browser/browser-ui/src/main/res/values-pt/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-pt/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Elimină ștergerea activității și istoricului din browser + Marcaje + Adaugă marcaj + Editează marcaj + Șterge activitatea și istoricul din browser pentru acest site + Site mobil + Versiune desktop + Activează protecția confidențialității + Dezactivează protecția confidențialității + Filă nouă + Duck.ai + Trimite… + Generează Duck Address + Caută în pagină + Imprimă pagina + Deschide în aplicație + Adaugă pe ecranul de pornire + Raportează Site-ul Defect + Parole + Descărcări + Setări + Deschide în DuckDuckGo + Redare în DuckDuckGo + Setare ca browser implicit + Chat nou + Istoricul chaturilor + Setări Duck.ai + VPN + + + Înapoi + Înainte + Reîncărcare + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-ro/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-ro/strings-input-mode.xml index ea0ac8205ec1..db34b7e077aa 100644 --- a/browser/browser-ui/src/main/res/values-ro/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-ro/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Снять огнеупорность + Закладки + Добавить закладку + Редактировать закладку + Сделать огнеупорным + Мобильная версия + Полная версия сайта + Включить защиту конфиденциальности + Отключить защиту конфиденциальности + Новая вкладка + Duck.ai + Поделиться + Создать адрес Duck + Найти на странице + Печать страницы + Открыть в приложении + Добавить на домашнюю страницу + Сообщить о неработающем сайте + Пароли + Загрузки + Настройки + Открыть в DuckDuckGo + Выполняется в DuckDuckGo + Сделать браузером по умолчанию + Запустить чат + История чата + Настройки Duck.ai + VPN + + + Назад + Вперёд + Обновить + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-ru/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-ru/strings-input-mode.xml index 815d0d3077bb..4047f8fdea12 100644 --- a/browser/browser-ui/src/main/res/values-ru/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-ru/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Odstrániť zabezpečenie + Záložky + Pridať záložku + Upraviť záložku + Zabezpečiť túto lokalitu + Mobilný režim + Stránka pre stolové počítače + Povoliť ochranu súkromia + Vypnúť ochranu súkromia + Nová karta + Duck.ai + Zdieľať + Generovanie adresy Duck + Hľadať na stránke + Tlačiť stranu + Otvoriť v aplikácii + Pridať na domovskú obrazovku + Nahlásiť nefunkčný web + Heslá + Stiahnuté + Nastavenia + Otvoriť v DuckDuckGo + Spustené v DuckDuckGo + Nastaviť ako predvolený prehliadač + Nový chat + História chatov + Nastavenia Duck.ai + VPN + + + Späť + Ďalej + Obnoviť + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-sk/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-sk/strings-input-mode.xml index 2470dae67f9b..2e5eb6d1d056 100644 --- a/browser/browser-ui/src/main/res/values-sk/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-sk/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Odstrani požarno zaščito + Zaznamki + Dodaj zaznamek + Uredi zaznamek + Ta stran je požarno zaščitena + Mobilna stran + Namizna stran + Omogoči zaščito zasebnosti + Onemogoči zaščito zasebnosti + Nov zavihek + Duck.ai + Deli + Ustvari naslov Duck Address + Najdi na strani + Natisni stran + Odpri v aplikaciji + Dodaj na Domači Zaslon + Prijavite poškodovano spletno mesto + Gesla + Prenosi + Nastavitve + Odpri v DuckDuckGo + Izvaja se v DuckDuckGo + Nastavite za privzeti brskalnik + Nov klepet + Zgodovina klepeta + Nastavitve Duck.ai + VPN + + + Nazaj + Naprej + Osveži + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-sl/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-sl/strings-input-mode.xml index dac1d7758046..6b2ac3a4829d 100644 --- a/browser/browser-ui/src/main/res/values-sl/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-sl/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Ta bort brandsäkring + Bokmärken + Lägg till bokmärke + Redigera bokmärke + Brandsäkra den här webbplatsen + Webbplats för mobil + Webbplats för dator + Aktivera integritetsskydd + Inaktivera integritetsskydd + Ny flik + Duck.ai + Dela + Generera en Duck-adress + Hitta på sidan + Skriv ut sidan + Öppna i appen + Lägg till på hemskärmen + Rapportera skadad webbplats + Lösenord + Nerladdningar + Inställningar + Öppna i DuckDuckGo + Körs i DuckDuckGo + Ställ in som standardwebbläsare + Ny chatt + Chattlogg + Duck.ai-inställningar + VPN + + + Tillbaka + Framåt + Uppdatera + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-sv/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-sv/strings-input-mode.xml index 2b07f9331194..847df55067b6 100644 --- a/browser/browser-ui/src/main/res/values-sv/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-sv/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + + + Korumayı Kaldır + Yer İmleri + Yer İmi ekle + Yer İşaretini Düzenle + Bu Siteyi Korumalı Yap + Mobil Site + Masaüstü Sitesi + Gizlilik Korumasını Etkinleştir + Gizlilik Korumasını Devre Dışı Bırak + Yeni Sekme + Duck.ai + Paylaş + Duck Address Oluştur + Sayfada bul + Sayfayı Yazdır + Uygulamada Aç + Ana ekrana ekle + Hatalı Siteyi Bildirin + Şifreler + İndirilenler + Ayarlar + DuckDuckGo\'da aç + DuckDuckGo\'da Çalışıyor + Varsayılan tarayıcı olarak ayarla + Yeni Sohbet + Sohbet Geçmişi + Duck.ai Ayarları + VPN + + + Geri + İleri + Yenile + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values-tr/strings-input-mode.xml b/browser/browser-ui/src/main/res/values-tr/strings-input-mode.xml index 77b9f145b6d6..fac9860df8c9 100644 --- a/browser/browser-ui/src/main/res/values-tr/strings-input-mode.xml +++ b/browser/browser-ui/src/main/res/values-tr/strings-input-mode.xml @@ -1,4 +1,5 @@ - + + + 280dp + \ No newline at end of file diff --git a/browser/browser-ui/src/main/res/values/strings-browser-menu.xml b/browser/browser-ui/src/main/res/values/strings-browser-menu.xml new file mode 100644 index 000000000000..8f4b82b80590 --- /dev/null +++ b/browser/browser-ui/src/main/res/values/strings-browser-menu.xml @@ -0,0 +1,53 @@ + + + + + + Remove Fireproofing + Bookmarks + Add Bookmark + Edit Bookmark + Fireproof This Site + Mobile Site + Desktop Site + Enable Privacy Protection + Disable Privacy Protection + New Tab + Duck.ai + Share + Generate Duck Address + Find in Page + Print Page + Open in App + Add to Home Screen + Report Broken Site + Passwords + Downloads + Settings + Open in DuckDuckGo + Running in DuckDuckGo + Set As Default Browser + New Chat + Chat History + Duck.ai Settings + VPN + + + Back + Forward + Refresh + \ No newline at end of file