diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-12 05:43:14 +0000 |
commit | 8dd16259287f58f9273002717ec4d27e97127719 (patch) | |
tree | 3863e62a53829a84037444beab3abd4ed9dfc7d0 /mobile | |
parent | Releasing progress-linux version 126.0.1-1~progress7.99u1. (diff) | |
download | firefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz firefox-8dd16259287f58f9273002717ec4d27e97127719.zip |
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mobile')
799 files changed, 45491 insertions, 37098 deletions
diff --git a/mobile/android/actors/GeckoViewContentParent.sys.mjs b/mobile/android/actors/GeckoViewContentParent.sys.mjs index e666040b5e..082c68b3c0 100644 --- a/mobile/android/actors/GeckoViewContentParent.sys.mjs +++ b/mobile/android/actors/GeckoViewContentParent.sys.mjs @@ -9,6 +9,8 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { SessionHistory: "resource://gre/modules/sessionstore/SessionHistory.sys.mjs", + SessionStoreHelper: + "resource://gre/modules/sessionstore/SessionStoreHelper.sys.mjs", }); const { debug, warn } = GeckoViewUtils.initLogging("GeckoViewContentParent"); @@ -33,7 +35,7 @@ export class GeckoViewContentParent extends GeckoViewActorParent { // TODO Bug 1648158 this should include scroll, form history, etc return SessionStoreUtils.initializeRestore( browsingContext, - SessionStoreUtils.constructSessionStoreRestoreData() + lazy.SessionStoreHelper.buildRestoreData(formdata, scrolldata) ); } diff --git a/mobile/android/actors/GeckoViewSettingsChild.sys.mjs b/mobile/android/actors/GeckoViewSettingsChild.sys.mjs index d5e6c01e27..625905caab 100644 --- a/mobile/android/actors/GeckoViewSettingsChild.sys.mjs +++ b/mobile/android/actors/GeckoViewSettingsChild.sys.mjs @@ -14,7 +14,7 @@ export class GeckoViewSettingsChild extends GeckoViewActorChild { case "SettingsUpdate": { const settings = message.data; - if (settings.isPopup) { + if (settings.isExtensionPopup) { // Allow web extensions to close their own action popups (bz1612363) this.contentWindow.windowUtils.allowScriptsToClose(); } diff --git a/mobile/android/android-components/.buildconfig.yml b/mobile/android/android-components/.buildconfig.yml index c8a03c3ab5..5930361a20 100644 --- a/mobile/android/android-components/.buildconfig.yml +++ b/mobile/android/android-components/.buildconfig.yml @@ -270,6 +270,33 @@ projects: - ui-colors - ui-icons - ui-widgets + browser-toolbar2: + description: A customizable toolbar for browsers. + path: components/browser/toolbar2 + publish: true + upstream_dependencies: + - browser-errorpages + - browser-menu + - browser-menu2 + - browser-state + - concept-awesomebar + - concept-base + - concept-engine + - concept-fetch + - concept-menu + - concept-storage + - concept-toolbar + - lib-publicsuffixlist + - lib-state + - support-base + - support-ktx + - support-test + - support-utils + - tooling-lint + - ui-autocomplete + - ui-colors + - ui-icons + - ui-widgets compose-awesomebar: description: An awesomebar component showing search results matching text entered into the toolbar. @@ -533,7 +560,12 @@ projects: path: components/feature/accounts-push publish: true upstream_dependencies: + - browser-errorpages + - browser-state + - concept-awesomebar - concept-base + - concept-engine + - concept-fetch - concept-push - concept-storage - concept-sync @@ -545,8 +577,10 @@ projects: - support-base - support-ktx - support-test + - support-test-libstate - support-utils - tooling-lint + - ui-icons feature-addons: description: A feature that provides for managing add-ons. path: components/feature/addons @@ -560,6 +594,7 @@ projects: - concept-fetch - concept-menu - concept-storage + - concept-toolbar - lib-publicsuffixlist - lib-state - support-base @@ -607,6 +642,7 @@ projects: - concept-engine - concept-fetch - concept-storage + - concept-toolbar - lib-fetch-okhttp - lib-publicsuffixlist - service-digitalassetlinks @@ -773,6 +809,7 @@ projects: - concept-engine - concept-fetch - concept-storage + - concept-toolbar - lib-publicsuffixlist - lib-state - support-android-test @@ -2272,6 +2309,7 @@ projects: - concept-engine - concept-fetch - concept-storage + - concept-toolbar - lib-publicsuffixlist - support-base - support-ktx diff --git a/mobile/android/android-components/README.md b/mobile/android/android-components/README.md index 7076f5e2ac..ed7199de63 100644 --- a/mobile/android/android-components/README.md +++ b/mobile/android/android-components/README.md @@ -83,6 +83,8 @@ High-level components for building browser(-like) apps. * 🔵 [**Toolbar**](components/browser/toolbar/README.md) - A customizable toolbar for browsers. +* 🔴 [**Toolbar2**](components/browser/toolbar2/README.md) - A customizable toolbar for browsers. + ## Concept _API contracts and abstraction layers for browser components._ diff --git a/mobile/android/android-components/build.gradle b/mobile/android/android-components/build.gradle index f1b46775c1..5907f00712 100644 --- a/mobile/android/android-components/build.gradle +++ b/mobile/android/android-components/build.gradle @@ -89,28 +89,6 @@ subprojects { } } - - // Allow local appservices substitution in each subproject. - def appServicesSrcDir = null - if (gradle.hasProperty('localProperties.autoPublish.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.autoPublish.application-services.dir') - } else if (gradle.hasProperty('localProperties.branchBuild.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.branchBuild.application-services.dir') - } - if (appServicesSrcDir) { - if (appServicesSrcDir.startsWith("/")) { - apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } else { - apply from: "${rootProject.projectDir}/${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } - } - - // Allow local Glean substitution in each subproject. - if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) { - ext.gleanSrcDir = gradle."localProperties.autoPublish.glean.dir" - apply from: "${rootProject.projectDir}/${gleanSrcDir}/build-scripts/substitute-local-glean.gradle" - } - if (gradle.hasProperty('localProperties.dependencySubstitutions.geckoviewTopsrcdir')) { if (gradle.hasProperty('localProperties.dependencySubstitutions.geckoviewTopobjdir')) { ext.topobjdir = gradle."localProperties.dependencySubstitutions.geckoviewTopobjdir" diff --git a/mobile/android/android-components/components/browser/engine-gecko/build.gradle b/mobile/android/android-components/components/browser/engine-gecko/build.gradle index 4e5c2fda65..776c083ee9 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/build.gradle +++ b/mobile/android/android-components/components/browser/engine-gecko/build.gradle @@ -76,8 +76,9 @@ dependencies { api getGeckoViewDependency() } + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.androidx_paging - implementation ComponentsDependencies.androidx_data_store_preferences + implementation ComponentsDependencies.androidx_datastore_preferences implementation ComponentsDependencies.androidx_lifecycle_livedata testImplementation ComponentsDependencies.androidx_test_core diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt index 92e6074a61..f5f1012448 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt @@ -426,6 +426,10 @@ class GeckoEngine( exception as WebExtensionInstallException, ) } + + override fun onOptionalPermissionsChanged(extension: org.mozilla.geckoview.WebExtension) { + webExtensionDelegate.onOptionalPermissionsChanged(GeckoWebExtension(extension, runtime)) + } } val extensionProcessDelegate = object : WebExtensionController.ExtensionProcessDelegate { diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt index e6907c6dde..dbf7b2d54f 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineSession.kt @@ -4,7 +4,6 @@ package mozilla.components.browser.engine.gecko -import android.annotation.SuppressLint import android.net.Uri import android.os.Build import android.view.WindowManager @@ -58,6 +57,7 @@ import mozilla.components.support.base.facts.Action import mozilla.components.support.base.facts.Fact import mozilla.components.support.base.facts.collect import mozilla.components.support.base.log.logger.Logger +import mozilla.components.support.ktx.kotlin.decode import mozilla.components.support.ktx.kotlin.isEmail import mozilla.components.support.ktx.kotlin.isExtensionUrl import mozilla.components.support.ktx.kotlin.isGeoLocation @@ -557,9 +557,8 @@ class GeckoEngineSession( /** * See [EngineSession.findNext] */ - @SuppressLint("WrongConstant") // FinderFindFlags annotation doesn't include a 0 value. override fun findNext(forward: Boolean) { - val findFlags = if (forward) 0 else GeckoSession.FINDER_FIND_BACKWARDS + val findFlags = if (forward) GeckoSession.FINDER_FIND_FORWARD else GeckoSession.FINDER_FIND_BACKWARDS geckoSession.finder.find(null, findFlags).then { result: GeckoSession.FinderResult? -> result?.let { val activeMatchOrdinal = if (it.current > 0) it.current - 1 else it.current @@ -1159,9 +1158,9 @@ class GeckoEngineSession( return when { maybeInterceptRequest(request, false) != null -> - GeckoResult.fromValue(AllowOrDeny.DENY) + GeckoResult.deny() request.target == NavigationDelegate.TARGET_WINDOW_NEW -> - GeckoResult.fromValue(AllowOrDeny.ALLOW) + GeckoResult.allow() else -> { notifyObservers { onLoadRequest( @@ -1171,7 +1170,7 @@ class GeckoEngineSession( ) } - GeckoResult.fromValue(AllowOrDeny.ALLOW) + GeckoResult.allow() } } } @@ -1181,15 +1180,15 @@ class GeckoEngineSession( request: NavigationDelegate.LoadRequest, ): GeckoResult<AllowOrDeny> { if (request.target == NavigationDelegate.TARGET_WINDOW_NEW) { - return GeckoResult.fromValue(AllowOrDeny.ALLOW) + return GeckoResult.allow() } return if (maybeInterceptRequest(request, true) != null) { - GeckoResult.fromValue(AllowOrDeny.DENY) + GeckoResult.deny() } else { // Not notifying session observer because of performance concern and currently there // is no use case. - GeckoResult.fromValue(AllowOrDeny.ALLOW) + GeckoResult.allow() } } @@ -1526,7 +1525,7 @@ class GeckoEngineSession( url = url, contentLength = contentLength, contentType = DownloadUtils.sanitizeMimeType(contentType), - fileName = fileName.sanitizeFileName(), + fileName = fileName.sanitizeFileName().decode(), response = response, isPrivate = privateMode, openInApp = webResponse.requestExternalApp, diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineView.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineView.kt index d5d77b3073..39a4c2d6cc 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineView.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngineView.kt @@ -9,6 +9,7 @@ import android.content.res.Configuration import android.graphics.Bitmap import android.graphics.Color import android.util.AttributeSet +import android.view.View import android.widget.FrameLayout import androidx.annotation.VisibleForTesting import androidx.core.view.ViewCompat @@ -63,7 +64,7 @@ class GeckoEngineView @JvmOverloads constructor( // Explicitly mark this view as important for autofill. The default "auto" doesn't seem to trigger any // autofill behavior for us here. @Suppress("WrongConstant") - ViewCompat.setImportantForAutofill(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES) + ViewCompat.setImportantForAutofill(this, View.IMPORTANT_FOR_ACCESSIBILITY_YES) } internal fun setColorScheme(preferredColorScheme: PreferredColorScheme) { @@ -205,29 +206,18 @@ class GeckoEngineView @JvmOverloads constructor( geckoView.activityContextDelegate = GeckoViewActivityContextDelegate(WeakReference(context)) } - @Suppress("TooGenericExceptionCaught") override fun captureThumbnail(onFinish: (Bitmap?) -> Unit) { - try { - val geckoResult = geckoView.capturePixels() - geckoResult.then( - { bitmap -> - onFinish(bitmap) - GeckoResult<Void>() - }, - { - onFinish(null) - GeckoResult<Void>() - }, - ) - } catch (e: Exception) { - // There's currently no reliable way for consumers of GeckoView to - // know whether or not the compositor is ready. So we have to add - // a catch-all here. In the future, GeckoView will invoke our error - // callback instead and this block can be removed: - // https://bugzilla.mozilla.org/show_bug.cgi?id=1645114 - // https://github.com/mozilla-mobile/android-components/issues/6680 - onFinish(null) - } + val geckoResult = geckoView.capturePixels() + geckoResult.then( + { bitmap -> + onFinish(bitmap) + GeckoResult() + }, + { + onFinish(null) + GeckoResult<Void>() + }, + ) } override fun clearSelection() { diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/prompt/GeckoPromptDelegate.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/prompt/GeckoPromptDelegate.kt index d4276e675a..8fb2e1e0fb 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/prompt/GeckoPromptDelegate.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/prompt/GeckoPromptDelegate.kt @@ -282,17 +282,16 @@ internal class GeckoPromptDelegate(private val geckoEngineSession: GeckoEngineSe return geckoResult } + @Suppress("MaxLineLength") override fun onLoginSelect( session: GeckoSession, prompt: AutocompleteRequest<Autocomplete.LoginSelectOption>, ): GeckoResult<PromptResponse>? { val promptOptions = prompt.options + val generatedPassword = - if (promptOptions.isNotEmpty() && promptOptions.first().hint == Autocomplete.SelectOption.Hint.GENERATED) { - promptOptions.first().value.password - } else { - null - } + promptOptions.firstOrNull { option -> option.hint == Autocomplete.SelectOption.Hint.GENERATED }?.value?.password + val geckoResult = GeckoResult<PromptResponse>() val onConfirmSelect: (Login) -> Unit = { login -> if (!prompt.isComplete) { diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegate.kt b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegate.kt index 3266ba8538..884db33824 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegate.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegate.kt @@ -66,10 +66,11 @@ internal class GeckoTranslateSessionDelegate( state?.requestedTranslationPair?.toLanguage, ) val translationsState = TranslationEngineState( - detectedLanguages, - state?.error, - state?.isEngineReady, - pair, + detectedLanguages = detectedLanguages, + error = state?.error, + isEngineReady = state?.isEngineReady, + hasVisibleChange = state?.hasVisibleChange, + requestedTranslationPair = pair, ) engineSession.notifyObservers { diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt index 87849440b6..871c46a33d 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineSessionTest.kt @@ -349,7 +349,7 @@ class GeckoEngineSessionTest { val observer: EngineSession.Observer = mock() engineSession.register(observer) - val response = WebResponse.Builder("https://download.mozilla.org/image.png") + val response = WebResponse.Builder("https://download.mozilla.org/image%20name.png") .addHeader(Headers.Names.CONTENT_TYPE, "image/png") .addHeader(Headers.Names.CONTENT_LENGTH, "42") .skipConfirmation(true) @@ -362,8 +362,8 @@ class GeckoEngineSessionTest { contentDelegate.value.onExternalResponse(mock(), response) verify(observer).onExternalResource( - url = eq("https://download.mozilla.org/image.png"), - fileName = eq("image.png"), + url = eq("https://download.mozilla.org/image%20name.png"), + fileName = eq("image name.png"), contentLength = eq(42), contentType = eq("image/png"), cookie = eq(null), @@ -4361,7 +4361,7 @@ class GeckoEngineSessionTest { mockLoadRequest("sample:about", triggeredByRedirect = true), ) - assertEquals(geckoResult!!, GeckoResult.fromValue(AllowOrDeny.ALLOW)) + assertEquals(geckoResult!!, GeckoResult.allow()) } @Test diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt index 6a8ed3c330..a7b6c59954 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineTest.kt @@ -2740,6 +2740,28 @@ class GeckoEngineTest { } @Test + fun `web extension delegate handles add-on onOptionalPermissionsChanged event`() { + val runtime: GeckoRuntime = mock() + val webExtensionController: WebExtensionController = mock() + whenever(runtime.webExtensionController).thenReturn(webExtensionController) + + val extension = mockNativeWebExtension("test", "uri") + val webExtensionsDelegate: WebExtensionDelegate = mock() + val engine = GeckoEngine(context, runtime = runtime) + engine.registerWebExtensionDelegate(webExtensionsDelegate) + + val geckoDelegateCaptor = argumentCaptor<WebExtensionController.AddonManagerDelegate>() + verify(webExtensionController).setAddonManagerDelegate(geckoDelegateCaptor.capture()) + + assertEquals(Unit, geckoDelegateCaptor.value.onOptionalPermissionsChanged(extension)) + val extensionCaptor = argumentCaptor<WebExtension>() + verify(webExtensionsDelegate).onOptionalPermissionsChanged(extensionCaptor.capture()) + val capturedExtension = + extensionCaptor.value as mozilla.components.browser.engine.gecko.webextension.GeckoWebExtension + assertEquals(extension, capturedExtension.nativeExtension) + } + + @Test fun `web extension delegate handles add-on onInstallationFailed event`() { val runtime: GeckoRuntime = mock() val webExtensionController: WebExtensionController = mock() diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineViewTest.kt b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineViewTest.kt index 7056187e09..13fd983483 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineViewTest.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/GeckoEngineViewTest.kt @@ -90,15 +90,6 @@ class GeckoEngineViewTest { shadowOf(getMainLooper()).idle() assertNull(thumbnail) - - // Test GeckoView throwing an exception - whenever(mockGeckoView.capturePixels()).thenThrow(IllegalStateException("Compositor not ready")) - - thumbnail = mock() - engineView.captureThumbnail { - thumbnail = it - } - assertNull(thumbnail) } @Test diff --git a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegateTest.kt b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegateTest.kt index 65a1c7d8f9..f0c9762fa8 100644 --- a/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegateTest.kt +++ b/mobile/android/android-components/components/browser/engine-gecko/src/test/java/mozilla/components/browser/engine/gecko/translate/GeckoTranslateSessionDelegateTest.kt @@ -69,13 +69,14 @@ class GeckoTranslateSessionDelegateTest { val gecko = GeckoTranslateSessionDelegate(mockSession) // Mock state parameters to check Gecko to AC mapping is correctly occurring - var userLangTag = "en" - var isDocLangTagSupported = true - var docLangTag = "es" - var fromLanguage = "de" - var toLanguage = "bg" - var error = "Error!" - var isEngineReady = false + val userLangTag = "en" + val isDocLangTagSupported = true + val docLangTag = "es" + val fromLanguage = "de" + val toLanguage = "bg" + val error = "Error!" + val isEngineReady = false + val hasVisibleChange = true mockSession.register( object : EngineSession.Observer { @@ -88,14 +89,15 @@ class GeckoTranslateSessionDelegateTest { assertTrue(state.requestedTranslationPair?.toLanguage == toLanguage) assertTrue(state.error == error) assertTrue(state.isEngineReady == isEngineReady) + assertTrue(state.hasVisibleChange == hasVisibleChange) } }, ) // Mock states - var mockDetectedLanguages = TranslationsController.SessionTranslation.DetectedLanguages(userLangTag, isDocLangTagSupported, docLangTag) - var mockTranslationsPair = TranslationsController.SessionTranslation.TranslationPair(fromLanguage, toLanguage) - var mockGeckoState = TranslationsController.SessionTranslation.TranslationState(mockTranslationsPair, error, mockDetectedLanguages, isEngineReady) + val mockDetectedLanguages = TranslationsController.SessionTranslation.DetectedLanguages(userLangTag, isDocLangTagSupported, docLangTag) + val mockTranslationsPair = TranslationsController.SessionTranslation.TranslationPair(fromLanguage, toLanguage) + val mockGeckoState = TranslationsController.SessionTranslation.TranslationState(mockTranslationsPair, error, mockDetectedLanguages, isEngineReady, hasVisibleChange) gecko.onTranslationStateChange(mock(), mockGeckoState) assertTrue(onTranslateStateChangeWasCalled) diff --git a/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_blocklist.json b/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_blocklist.json index 845571cfa0..05571a483f 100644 --- a/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_blocklist.json +++ b/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_blocklist.json @@ -1,11046 +1,8340 @@ { - "license": "Copyright 2010-2019 Disconnect, Inc. / This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. / This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. / You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.", - "categories": { - "Advertising": [ - { - "2leep.com": { - "http://2leep.com/": [ - "2leep.com" - ] - } - }, - { - "33Across": { - "http://33across.com/": [ - "33across.com" - ] - } - }, - { - "365Media": { - "http://365media.com/": [ - "365media.com" - ] - } - }, - { - "4INFO": { - "http://www.4info.com/": [ - "4info.com", - "adhaven.com" - ] - } - }, - { - "4mads": { - "http://4mads.com/": [ - "4mads.com" - ] - } - }, - { - "Abax Interactive": { - "http://abaxinteractive.com/": [ - "abaxinteractive.com" - ] - } - }, - { - "Accelia": { - "http://www.accelia.net/": [ - "accelia.net", - "durasite.net" - ] - } - }, - { - "Accordant Media": { - "http://www.accordantmedia.com/": [ - "accordantmedia.com" - ] - } - }, - { - "Acquisio": { - "http://www.acquisio.com/": [ - "acquisio.com", - "clickequations.net" - ] - } - }, - { - "Actisens": { - "http://www.actisens.com/": [ - "actisens.com", - "gestionpub.com" - ] - } - }, - { - "ActiveConversion": { - "http://www.activeconversion.com/": [ - "activeconversion.com", - "activemeter.com" - ] - } - }, - { - "Act-On": { - "http://www.act-on.com/": [ - "act-on.com", - "actonsoftware.com" - ] - } - }, - { - "Acuity": { - "http://www.acuity.com/": [ - "acuity.com", - "acuityads.com", - "acuityplatform.com" - ] - } - }, - { - "AD2ONE": { - "http://www.ad2onegroup.com/": [ - "ad2onegroup.com" - ] - } - }, - { - "Ad4Game": { - "http://ad4game.com/": [ - "ad4game.com" - ] - } - }, - { - "ad6media": { - "http://www.ad6media.fr/": [ - "ad6media.fr" - ] - } - }, - { - "Adabra": { - "https://www.adabra.com/": [ - "adabra.com" - ] - } - }, - { - "Adality": { - "http://adality.de/": [ - "adality.de", - "adrtx.net" - ] - } - }, - { - "AdaptiveAds": { - "http://www.adaptiveads.com/": [ - "adaptiveads.com" - ] - } - }, - { - "Adaptly": { - "http://adaptly.com/": [ - "adaptly.com" - ] - } - }, - { - "Adara Media": { - "http://www.adaramedia.com/": [ - "adaramedia.com", - "opinmind.com", - "yieldoptimizer.com" - ] - } - }, - { - "Adatus": { - "http://www.adatus.com/": [ - "adatus.com" - ] - } - }, - { - "Adbot": { - "https://adbot.tw/": [ - "adbot.tw" - ] - } - }, - { - "Adbrain": { - "http://www.adbrain.com/": [ - "adbrain.com", - "adbrn.com" - ] - } - }, - { - "adBrite": { - "http://www.adbrite.com/": [ - "adbrite.com" - ] - } - }, - { - "Adbroker.de": { - "http://adbroker.de/": [ - "adbroker.de" - ] - } - }, - { - "Adchemy": { - "http://www.adchemy.com/": [ - "adchemy.com" - ] - } - }, - { - "AdCirrus": { - "http://adcirrus.com/": [ - "adcirrus.com" - ] - } - }, - { - "Ad Decisive": { - "http://www.addecisive.com/": [ - "a2dfp.net", - "addecisive.com" - ] - } - }, - { - "addGloo": { - "http://www.addgloo.com/": [ - "addgloo.com" - ] - } - }, - { - "Addvantage Media": { - "http://www.addvantagemedia.com/": [ - "addvantagemedia.com" - ] - } - }, - { - "Ad Dynamo": { - "http://www.addynamo.com/": [ - "addynamo.com", - "addynamo.net" - ] - } - }, - { - "Adelphic": { - "https://adelphic.com/": [ - "adelphic.com", - "ipredictive.com" - ] - } - }, - { - "AdEngage": { - "http://adengage.com/": [ - "adengage.com" - ] - } - }, - { - "AD Europe": { - "http://www.adeurope.com/": [ - "adeurope.com" - ] - } - }, - { - "AdExtent": { - "http://www.adextent.com/": [ - "adextent.com" - ] - } - }, - { - "AdF.ly": { - "http://adf.ly/": [ - "adf.ly" - ] - } - }, - { - "Adfonic": { - "http://adfonic.com/": [ - "adfonic.com" - ] - } - }, - { - "Adforge": { - "http://adforgeinc.com/": [ - "adforgeinc.com" - ] - } - }, - { - "Adform": { - "http://www.adform.com/": [ - "adform.com", - "adform.net", - "adformdsp.net" - ] - } - }, - { - "AdFox": { - "http://adfox.ru/": [ - "adfox.ru" - ] - } - }, - { - "AdFrontiers": { - "http://www.adfrontiers.com/": [ - "adfrontiers.com" - ] - } - }, - { - "Adfunky": { - "http://www.adfunky.com/": [ - "adfunky.com", - "adfunkyserver.com" - ] - } - }, - { - "Adfusion": { - "http://www.adfusion.com/": [ - "adfusion.com" - ] - } - }, - { - "AdGainerSolutions": { - "http://adgainersolutions.com/adgainer/": [ - "adgainersolutions.com" - ] - } - }, - { - "AdGent Digital": { - "http://www.adgentdigital.com/": [ - "adgentdigital.com", - "shorttailmedia.com" - ] - } - }, - { - "AdGibbon": { - "http://www.adgibbon.com/": [ - "adgibbon.com" - ] - } - }, - { - "Adglare": { - "https://www.adglare.com/": [ - "adglare.com", - "adglare.net" - ] - } - }, - { - "adhood": { - "http://www.adhood.com/": [ - "adhood.com" - ] - } - }, - { - "Adiant": { - "http://www.adiant.com/": [ - "adblade.com", - "adiant.com" - ] - } - }, - { - "AdInsight": { - "http://www.adinsight.com/": [ - "adinsight.com", - "adinsight.eu" - ] - } - }, - { - "AdIQuity": { - "http://adiquity.com/": [ - "adiquity.com" - ] - } - }, - { - "ADITION": { - "http://www.adition.com/": [ - "adition.com" - ] - } - }, - { - "AdJug": { - "http://www.adjug.com/": [ - "adjug.com" - ] - } - }, - { - "AdJuggler": { - "http://www.adjuggler.com/": [ - "adjuggler.com", - "adjuggler.net" - ] - } - }, - { - "Adjust": { - "https://adjust.com": [ - "adjust.com" - ] - } - }, - { - "AdKeeper": { - "http://www.adkeeper.com/": [ - "adkeeper.com", - "akncdn.com" - ] - } - }, - { - "AdKernel": { - "http://adkernel.com": [ - "adkernel.com" - ] - } - }, - { - "Ad Knife": { - "http://static.adknife.com/": [ - "adknife.com" - ] - } - }, - { - "Adknowledge": { - "http://www.adknowledge.com/": [ - "adknowledge.com", - "adparlor.com", - "bidsystem.com", - "cubics.com", - "lookery.com" - ] - } - }, - { - "AdLantis": { - "http://www.adlantis.jp/": [ - "adimg.net", - "adlantis.jp" - ] - } - }, - { - "AdLeave": { - "http://www.adleave.com/": [ - "adleave.com" - ] - } - }, - { - "Adlibrium": { - "http://www.adlibrium.com/": [ - "adlibrium.com" - ] - } - }, - { - "Adlucent": { - "http://adlucent.com": [ - "adlucent.com" - ] - } - }, - { - "Ad Magnet": { - "http://www.admagnet.com/": [ - "admagnet.com", - "admagnet.net" - ] - } - }, - { - "Admarketplace": { - "http://www.admarketplace.com/": [ - "admarketplace.com", - "admarketplace.net", - "ampxchange.com" - ] - } - }, - { - "AdMarvel": { - "http://www.admarvel.com/": [ - "admarvel.com" - ] - } - }, - { - "AdMatrix": { - "http://www.admatrix.jp/": [ - "admatrix.jp" - ] - } - }, - { - "AdMaven": { - "https://ad-maven.com/": [ - "ad-maven.com", - "agreensdistra.info", - "boudja.com", - "rensovetors.info", - "wrethicap.info" - ] - } - }, - { - "AdMaximizer Network": { - "http://admaximizer.com/": [ - "admaximizer.com" - ] - } - }, - { - "AdMedia": { - "http://www.admedia.com/": [ - "admedia.com" - ] - } - }, - { - "Admeta": { - "http://www.admeta.com/": [ - "admeta.com", - "atemda.com" - ] - } - }, - { - "Admicro": { - "http://www.admicro.vn/": [ - "admicro.vn", - "vcmedia.vn" - ] - } - }, - { - "Admixer": { - "https://admixer.co.kr/main": [ - "admixer.co.kr" - ] - } - }, - { - "Admized": { - "http://www.admized.com/": [ - "admized.com" - ] - } - }, - { - "Admobile": { - "http://admobile.com/": [ - "admobile.com" - ] - } - }, - { - "Admotion": { - "http://www.admotion.com/": [ - "admotion.com", - "nspmotion.com" - ] - } - }, - { - "Adnetik": { - "http://adnetik.com/": [ - "adnetik.com", - "wtp101.com" - ] - } - }, - { - "AdNetwork.net": { - "http://www.adnetwork.net/": [ - "adnetwork.net" - ] - } - }, - { - "Adnium": { - "https://adnium.com": [ - "adnium.com" - ] - } - }, - { - "adnologies": { - "http://www.adnologies.com/": [ - "adnologies.com", - "heias.com" - ] - } - }, - { - "Adobe": { - "http://www.adobe.com/": [ - "2o7.net", - "auditude.com", - "demdex.com", - "demdex.net", - "dmtracker.com", - "efrontier.com", - "everestads.net", - "everestjs.net", - "everesttech.net", - "hitbox.com", - "omniture.com", - "omtrdc.net", - "touchclarity.com" - ] - } - }, - { - "AdOcean": { - "http://www.adocean-global.com/": [ - "adocean-global.com", - "adocean.pl" - ] - } - }, - { - "Adometry": { - "http://www.adometry.com/": [ - "adometry.com", - "dmtry.com" - ] - } - }, - { - "Adomik": { - "http://www.adomik.com/": [ - "adomik.com" - ] - } - }, - { - "AdOnion": { - "http://www.adonion.com/": [ - "adonion.com" - ] - } - }, - { - "Adorika": { - "http://www.clickotmedia.com/": [ - "clickotmedia.com" - ] - } - }, - { - "Adotmob": { - "https://adotmob.com/": [ - "adotmob.com" - ] - } - }, - { - "ADP Dealer Services": { - "http://www.adpdealerservices.com/": [ - "admission.net", - "adpdealerservices.com", - "cobalt.com" - ] - } - }, - { - "ad pepper media": { - "http://www.adpepper.us/": [ - "adpepper.com", - "adpepper.us" - ] - } - }, - { - "AdPerfect": { - "http://www.adperfect.com/": [ - "adperfect.com" - ] - } - }, - { - "Adperium": { - "http://www.adperium.com/": [ - "adperium.com" - ] - } - }, - { - "Adpersia": { - "http://www.adpersia.com/": [ - "adpersia.com" - ] - } - }, - { - "adPrecision": { - "http://adprecision.net/": [ - "adprs.net", - "aprecision.net" - ] - } - }, - { - "AdPredictive": { - "http://www.adpredictive.com/": [ - "adpredictive.com" - ] - } - }, - { - "AdReactor": { - "http://www.adreactor.com/": [ - "adreactor.com" - ] - } - }, - { - "AdReady": { - "http://www.adready.com/": [ - "adready.com", - "adreadytractions.com" - ] - } - }, - { - "AdRevolution": { - "http://adrevolution.com/": [ - "adrevolution.com" - ] - } - }, - { - "AdRiver": { - "http://adriver.ru/": [ - "adriver.ru" - ] - } - }, - { - "adrolays": { - "http://adrolays.com/": [ - "adrolays.com", - "adrolays.de" - ] - } - }, - { - "AdRoll": { - "http://www.adroll.com/": [ - "adroll.com" - ] - } - }, - { - "adscale": { - "http://www.adscale.de/": [ - "adscale.de" - ] - } - }, - { - "Adscience": { - "https://www.adscience.nl/": [ - "adscience.nl" - ] - } - }, - { - "AdServerPub": { - "http://www.adserverpub.com/": [ - "adserverpub.com" - ] - } - }, - { - "AdShuffle": { - "http://www.adshuffle.com/": [ - "adshuffle.com" - ] - } - }, - { - "AdSide": { - "http://www.adside.com/": [ - "adside.com", - "doclix.com" - ] - } - }, - { - "AdSpeed": { - "http://www.adspeed.com/": [ - "adspeed.com", - "adspeed.net" - ] - } - }, - { - "Adsperity": { - "https://www.adsperity.com/": [ - "adsperity.com" - ] - } - }, - { - "AdSpirit": { - "http://www.adspirit.de/": [ - "adspirit.com", - "adspirit.de", - "adspirit.net" - ] - } - }, - { - "Adsrevenue.net": { - "http://adsrevenue.net/": [ - "adsrevenue.net" - ] - } - }, - { - "AdStir": { - "https://en.ad-stir.com/": [ - "ad-stir.com" - ] - } - }, - { - "AdsTours": { - "http://www.adstours.com/": [ - "adstours.com", - "clickintext.net" - ] - } - }, - { - "Adsty": { - "http://adsty.com/": [ - "adsty.com", - "adx1.com" - ] - } - }, - { - "Adsupply": { - "http://www.adsupply.com/": [ - "4dsply.com", - "adsupply.com" - ] - } - }, - { - "Adswizz": { - "http://adswizz.com": [ - "adswizz.com" - ] - } - }, - { - "ADTECH": { - "http://www.adtech.com/": [ - "adtech.com", - "adtech.de", - "adtechus.com" - ] - } - }, - { - "Adtegrity.com": { - "http://www.adtegrity.com/": [ - "adtegrity.com", - "adtegrity.net" - ] - } - }, - { - "ADTELLIGENCE": { - "http://www.adtelligence.de/": [ - "adtelligence.de" - ] - } - }, - { - "Adthink": { - "https://adthink.com/": [ - "adthink.com", - "audienceinsights.net" - ] - } - }, - { - "AdTiger": { - "http://www.adtiger.de/": [ - "adtiger.de" - ] - } - }, - { - "AdTruth": { - "http://adtruth.com/": [ - "adtruth.com" - ] - } - }, - { - "Adult AdWorld": { - "http://adultadworld.com/": [ - "adultadworld.com" - ] - } - }, - { - "Adultmoda": { - "http://www.adultmoda.com/": [ - "adultmoda.com" - ] - } - }, - { - "Adventive": { - "http://adventive.com/": [ - "adventive.com" - ] - } - }, - { - "Adverline": { - "http://www.adverline.com/": [ - "adnext.fr", - "adverline.com" - ] - } - }, - { - "Adversal.com": { - "http://www.adversal.com/": [ - "adv-adserver.com", - "adversal.com" - ] - } - }, - { - "Adverticum": { - "http://www.adverticum.com/": [ - "adsmart.com", - "adverticum.com", - "adverticum.net" - ] - } - }, - { - "Advertise.com": { - "http://www.advertise.com/": [ - "advertise.com" - ] - } - }, - { - "AdvertiseSpace": { - "http://www.advertisespace.com/": [ - "advertisespace.com" - ] - } - }, - { - "Advert Stream": { - "http://www.advertstream.com/": [ - "advertstream.com" - ] - } - }, - { - "Advisor Media": { - "http://advisormedia.cz/": [ - "advisormedia.cz" - ] - } - }, - { - "Adworx": { - "http://adworx.at/": [ - "adworx.at", - "adworx.be", - "adworx.nl" - ] - } - }, - { - "AdXpansion": { - "http://www.adxpansion.com/": [ - "adxpansion.com" - ] - } - }, - { - "Adxvalue": { - "http://adxvalue.com/": [ - "adxvalue.com", - "adxvalue.de" - ] - } - }, - { - "adyard": { - "http://adyard.de/": [ - "adyard.de" - ] - } - }, - { - "AdYield": { - "http://www.adyield.com/": [ - "adxyield.com", - "adyield.com" - ] - } - }, - { - "AdYouLike": { - "https://www.adyoulike.com/": [ - "adyoulike.com", - "omnitagjs.com", - "pulpix.com" - ] - } - }, - { - "ADZ": { - "http://www.adzcentral.com/": [ - "adzcentral.com" - ] - } - }, - { - "Adzerk": { - "http://www.adzerk.com/": [ - "adzerk.com", - "adzerk.net" - ] - } - }, - { - "adzly": { - "http://www.adzly.com/": [ - "adzly.com" - ] - } - }, - { - "Aegis Group": { - "http://www.aemedia.com/": [ - "aemedia.com", - "bluestreak.com" - ] - } - }, - { - "AERIFY MEDIA": { - "http://aerifymedia.com/": [ - "aerifymedia.com", - "anonymous-media.com" - ] - } - }, - { - "Affectv": { - "http://affectv.co.uk/": [ - "affectv.co.uk" - ] - } - }, - { - "affilinet": { - "http://www.affili.net/": [ - "affili.net", - "affilinet-inside.de", - "banner-rotation.com", - "successfultogether.co.uk" - ] - } - }, - { - "Affine": { - "http://www.affine.tv/": [ - "affine.tv", - "affinesystems.com" - ] - } - }, - { - "Affinity": { - "http://www.affinity.com/": [ - "affinity.com" - ] - } - }, - { - "AfterDownload": { - "http://www.afterdownload.com/": [ - "afdads.com", - "afterdownload.com" - ] - } - }, - { - "Aim4Media": { - "http://aim4media.com/": [ - "aim4media.com" - ] - } - }, - { - "Airpush": { - "http://www.airpush.com/": [ - "airpush.com" - ] - } - }, - { - "AK": { - "http://www.aggregateknowledge.com/": [ - "aggregateknowledge.com", - "agkn.com" - ] - } - }, - { - "Akamai": { - "http://www.akamai.com/": [ - "imiclk.com" - ] - } - }, - { - "Albacross": { - "https://albacross.com": [ - "albacross.com" - ] - } - }, - { - "AllStarMediaGroup": { - "http://allstarmediagroup.com/": [ - "allstarmediagroup.com" - ] - } - }, - { - "Aloodo": { - "https://aloodo.com/": [ - "aloodo.com" - ] - } - }, - { - "AlterGeo": { - "http://altergeo.ru/": [ - "altergeo.ru" - ] - } - }, - { - "Amazon.com": { - "http://www.amazon.com/": [ - "amazon-adsystem.com", - "amazon.ca", - "amazon.co.jp", - "amazon.co.uk", - "amazon.de", - "amazon.es", - "amazon.fr", - "amazon.it", - "assoc-amazon.com" - ] - } - }, - { - "Ambient Digital": { - "http://ambientdigital.com.vn/": [ - "adnetwork.vn", - "ambientdigital.com.vn" - ] - } - }, - { - "Amobee": { - "http://amobee.com/": [ - "adconion.com", - "amgdgt.com", - "amobee.com", - "euroclick.com", - "smartclip.com", - "turn.com" - ] - } - }, - { - "AndBeyond": { - "http://andbeyond.media/": [ - "andbeyond.media" - ] - } - }, - { - "Answers.com": { - "http://www.answers.com/": [ - "dsply.com" - ] - } - }, - { - "AOL": { - "http://www.aol.com/": [ - "adsonar.com", - "adtechjp.com", - "advertising.com", - "aolcloud.net", - "atwola.com", - "leadback.com", - "tacoda.net", - "vidible.tv" - ] - } - }, - { - "AppCast": { - "https://appcast.io/": [ - "appcast.io" - ] - } - }, - { - "Appenda": { - "http://www.appenda.com/": [ - "appenda.com" - ] - } - }, - { - "AppFlood": { - "http://appflood.com/": [ - "appflood.com" - ] - } - }, - { - "Appier": { - "http://appier.com/": [ - "appier.com" - ] - } - }, - { - "Applifier": { - "http://www.applifier.com/": [ - "applifier.com" - ] - } - }, - { - "Applovin": { - "http://www.applovin.com/": [ - "applovin.com" - ] - } - }, - { - "AppNexus": { - "http://www.appnexus.com/": [ - "adlantic.nl", - "adnxs.com", - "adrdgt.com", - "alenty.com", - "appnexus.com" - ] - } - }, - { - "AppsFlyer": { - "http://appsflyer.com/": [ - "appsflyer.com" - ] - } - }, - { - "appssavvy": { - "http://appssavvy.com/": [ - "appssavvy.com" - ] - } - }, - { - "Arkwrights Homebrew": { - "http://www.arkwrightshomebrew.com/": [ - "arkwrightshomebrew.com", - "ctasnet.com" - ] - } - }, - { - "AT Internet": { - "http://www.atinternet.com/": [ - "hit-parade.com" - ] - } - }, - { - "ATN": { - "http://affiliatetracking.com/": [ - "affiliatetracking.com" - ] - } - }, - { - "Atoomic.com": { - "http://www.atoomic.com/": [ - "atoomic.com" - ] - } - }, - { - "Atrinsic": { - "http://atrinsic.com/": [ - "atrinsic.com" - ] - } - }, - { - "AT&T": { - "http://www.att.com/": [ - "att.com", - "yp.com" - ] - } - }, - { - "Audience2Media": { - "http://www.audience2media.com/": [ - "audience2media.com" - ] - } - }, - { - "Audience Ad Network": { - "http://audienceadnetwork.com/": [ - "audienceadnetwork.com" - ] - } - }, - { - "AudienceScience": { - "http://www.audiencescience.com/": [ - "audiencescience.com", - "revsci.net", - "targetingmarketplace.com", - "wunderloop.net" - ] - } - }, - { - "Augme": { - "http://www.augme.com/": [ - "augme.com", - "hipcricket.com" - ] - } - }, - { - "Augur": { - "http://www.augur.io/": [ - "augur.io" - ] - } - }, - { - "AUTOCENTRE.UA": { - "http://www.autocentre.ua/": [ - "am.ua", - "autocentre.ua" - ] - } - }, - { - "Automattic": { - "http://automattic.com/": [ - "pubmine.com" - ] - } - }, - { - "Avalanchers": { - "http://www.avalanchers.com/": [ - "avalanchers.com" - ] - } - }, - { - "AvantLink": { - "http://www.avantlink.com/": [ - "avantlink.com" - ] - } - }, - { - "Avocet": { - "https://avocet.io/": [ - "avocet.io" - ] - } - }, - { - "Avsads": { - "http://avsads.com/": [ - "avsads.com" - ] - } - }, - { - "AWeber": { - "http://www.aweber.com/": [ - "aweber.com" - ] - } - }, - { - "Awin": { - "http://www.awin.com/": [ - "digitalwindow.com", - "dwin1.com", - "perfiliate.com" - ] - } - }, - { - "Azet": { - "http://mediaimpact.sk/": [ - "azetklik.sk", - "rsz.sk" - ] - } - }, - { - "BackBeat Media": { - "http://www.backbeatmedia.com/": [ - "backbeatmedia.com" - ] - } - }, - { - "Bannerconnect": { - "http://www.bannerconnect.net/": [ - "bannerconnect.net" - ] - } - }, - { - "Barilliance": { - "http://www.barilliance.com/": [ - "barilliance.com" - ] - } - }, - { - "BaronsNetworks": { - "http://baronsoffers.com/": [ - "baronsoffers.com" - ] - } - }, - { - "Batanga Network": { - "http://www.batanganetwork.com/": [ - "batanga.com", - "batanganetwork.com" - ] - } - }, - { - "BeachFront": { - "http://beachfront.com/": [ - "beachfront.com" - ] - } - }, - { - "Beanstock Media": { - "http://www.beanstockmedia.com/": [ - "beanstockmedia.com" - ] - } - }, - { - "beencounter": { - "http://www.beencounter.com/": [ - "beencounter.com" - ] - } - }, - { - "Begun": { - "http://www.begun.ru/": [ - "begun.ru" - ] - } - }, - { - "belboon": { - "http://www.belboon.com/": [ - "adbutler.de", - "belboon.com" - ] - } - }, - { - "Betgenius": { - "http://www.betgenius.com/": [ - "betgenius.com", - "connextra.com" - ] - } - }, - { - "BetweenDigital": { - "http://betweendigital.com": [ - "betweendigital.com" - ] - } - }, - { - "Bidfluence": { - "https://www.bidfluence.com/": [ - "bidfluence.com" - ] - } - }, - { - "Bidr": { - "http://bidr.io": [ - "bidr.io" - ] - } - }, - { - "BidSwitch": { - "https://www.bidswitch.com/": [ - "bidswitch.net", - "mfadsrvr.com" - ] - } - }, - { - "Bidtellect": { - "https://www.bidtellect.com/": [ - "bidtellect.com", - "bttrack.com" - ] - } - }, - { - "BidVertiser": { - "http://www.bidvertiser.com/": [ - "bidvertiser.com" - ] - } - }, - { - "BigClick": { - "http://bigclick.me/": [ - "bgclck.me", - "xcvgdf.party" - ] - } - }, - { - "bigmirnet": { - "http://www.bigmir.net/": [ - "bigmir.net" - ] - } - }, - { - "BinLayer": { - "http://binlayer.com/": [ - "binlayer.com" - ] - } - }, - { - "Bitcoin Plus": { - "http://www.bitcoinplus.com/": [ - "bitcoinplus.com" - ] - } - }, - { - "BitMedia": { - "https://bitmedia.io/": [ - "bitmedia.io" - ] - } - }, - { - "BittAds": { - "http://www.bittads.com/": [ - "bittads.com" - ] - } - }, - { - "Bizo": { - "http://www.bizo.com/": [ - "bizo.com", - "bizographics.com" - ] - } - }, - { - "Black Label Ads": { - "http://www.blacklabelads.com/": [ - "blacklabelads.com" - ] - } - }, - { - "BlogCatalog": { - "http://www.blogcatalog.com/": [ - "blogcatalog.com" - ] - } - }, - { - "BlogFrog": { - "http://theblogfrog.com/": [ - "theblogfrog.com" - ] - } - }, - { - "BlogHer": { - "http://www.blogher.com/": [ - "blogher.com", - "blogherads.com" - ] - } - }, - { - "BlogRollr": { - "http://blogrollr.com/": [ - "blogrollr.com" - ] - } - }, - { - "BLOOM Digital Platforms": { - "http://bloom-hq.com/": [ - "adgear.com", - "adgrx.com", - "bloom-hq.com" - ] - } - }, - { - "BlueKai": { - "http://www.bluekai.com/": [ - "bkrtx.com", - "bluekai.com", - "tracksimple.com" - ] - } - }, - { - "Blu Trumpet": { - "http://www.blutrumpet.com/": [ - "blutrumpet.com" - ] - } - }, - { - "Boo-Box": { - "http://boo-box.com/": [ - "boo-box.com" - ] - } - }, - { - "BoostBox": { - "https://www.boostbox.com.br/": [ - "boostbox.com.br" - ] - } - }, - { - "Bouncex": { - "https://www.bouncex.com/": [ - "bounceexchange.com", - "bouncex.com", - "bouncex.net" - ] - } - }, - { - "Brainient": { - "http://brainient.com/": [ - "brainient.com" - ] - } - }, - { - "Brand Affinity Technologies": { - "http://www.brandaffinity.net/": [ - "brandaffinity.net" - ] - } - }, - { - "Brandcrumb": { - "http://www.brandcrumb.com": [ - "brandcrumb.com" - ] - } - }, - { - "Brand.net": { - "http://www.brand.net/": [ - "brand.net" - ] - } - }, - { - "Brandscreen": { - "http://www.brandscreen.com/": [ - "brandscreen.com", - "rtbidder.net" - ] - } - }, - { - "BreakTime": { - "https://www.breaktime.com.tw/": [ - "breaktime.com.tw" - ] - } - }, - { - "BrightRoll": { - "http://www.brightroll.com/": [ - "brightroll.com", - "btrll.com" - ] - } - }, - { - "BrightTag": { - "http://www.brighttag.com/": [ - "brighttag.com", - "btstatic.com", - "thebrighttag.com" - ] - } - }, - { - "Brilig": { - "http://www.brilig.com/": [ - "brilig.com" - ] - } - }, - { - "BuckSense": { - "http://www.bucksense.com": [ - "bucksense.com" - ] - } - }, - { - "Burstly": { - "http://www.burstly.com/": [ - "burstly.com" - ] - } - }, - { - "Burst Media": { - "http://www.burstmedia.com/": [ - "burstbeacon.com", - "burstdirectads.com", - "burstmedia.com", - "burstnet.com", - "giantrealm.com" - ] - } - }, - { - "BusinessOnline": { - "http://www.businessol.com/": [ - "businessol.com" - ] - } - }, - { - "Button": { - "https://www.usebutton.com": [ - "usebutton.com" - ] - } - }, - { - "BuySellAds": { - "http://buysellads.com/": [ - "beaconads.com", - "buysellads.com" - ] - } - }, - { - "Buysight": { - "http://www.buysight.com/": [ - "buysight.com", - "permuto.com", - "pulsemgr.com" - ] - } - }, - { - "BuzzParadise": { - "http://www.buzzparadise.com/": [ - "buzzparadise.com" - ] - } - }, - { - "BV! MEDIA": { - "http://www.bvmedia.ca/": [ - "bvmedia.ca", - "networldmedia.com", - "networldmedia.net" - ] - } - }, - { - "c1exchange": { - "https://c1exchange.com/": [ - "c1exchange.com" - ] - } - }, - { - "C3 Metrics": { - "http://c3metrics.com/": [ - "attributionmodel.com", - "c3metrics.com", - "c3tag.com" - ] - } - }, - { - "Cadreon": { - "http://www.cadreon.com/": [ - "cadreon.com" - ] - } - }, - { - "CampaignGrid": { - "http://www.campaigngrid.com/": [ - "campaigngrid.com" - ] - } - }, - { - "CAPITALDATA": { - "http://www.capitaldata.fr/": [ - "capitaldata.fr" - ] - } - }, - { - "Carambola": { - "https://www.carambola.com/": [ - "carambo.la" - ] - } - }, - { - "Caraytech": { - "http://www.caraytech.com.ar/": [ - "caraytech.com.ar", - "e-planning.net" - ] - } - }, - { - "Cart.ro": { - "http://www.cart.ro/": [ - "cart.ro", - "statistics.ro" - ] - } - }, - { - "CartsGuru": { - "https://carts.guru/": [ - "carts.guru" - ] - } - }, - { - "Casale Media": { - "http://www.casalemedia.com/": [ - "casalemedia.com", - "medianet.com" - ] - } - }, - { - "CBproADS": { - "http://www.cbproads.com/": [ - "cbproads.com" - ] - } - }, - { - "Cedato": { - "https://www.cedato.com/": [ - "cedato.com" - ] - } - }, - { - "Chango": { - "http://www.chango.com/": [ - "chango.ca", - "chango.com" - ] - } - }, - { - "ChannelAdvisor": { - "http://www.channeladvisor.com/": [ - "channeladvisor.com", - "searchmarketing.com" - ] - } - }, - { - "Channel Intelligence": { - "http://www.channelintelligence.com/": [ - "channelintelligence.com" - ] - } - }, - { - "Chartboost": { - "https://www.chartboost.com/": [ - "chartboost.com" - ] - } - }, - { - "CheckM8": { - "http://www.checkm8.com/": [ - "checkm8.com" - ] - } - }, - { - "Chitika": { - "http://chitika.com/": [ - "chitika.com", - "chitika.net" - ] - } - }, - { - "ChoiceStream": { - "http://www.choicestream.com/": [ - "choicestream.com" - ] - } - }, - { - "ClearLink": { - "https://www.clearlink.com/": [ - "clearlink.com" - ] - } - }, - { - "ClearSaleing": { - "http://www.clearsaleing.com/": [ - "clearsaleing.com", - "csdata1.com", - "csdata2.com", - "csdata3.com" - ] - } - }, - { - "Clearsearch Media": { - "http://www.clearsearchmedia.com/": [ - "clearsearchmedia.com", - "csm-secure.com" - ] - } - }, - { - "ClearSight Interactive": { - "http://www.clearsightinteractive.com/": [ - "clearsightinteractive.com", - "csi-tracking.com" - ] - } - }, - { - "ClickAider": { - "http://clickaider.com/": [ - "clickaider.com" - ] - } - }, - { - "Clickayab": { - "http://www.clickyab.com": [ - "clickyab.com" - ] - } - }, - { - "Clickbooth": { - "http://www.clickbooth.com/": [ - "adtoll.com", - "clickbooth.com" - ] - } - }, - { - "ClickDimensions": { - "http://www.clickdimensions.com/": [ - "clickdimensions.com" - ] - } - }, - { - "ClickDistrict": { - "http://www.clickdistrict.com/": [ - "clickdistrict.com", - "creative-serving.com" - ] - } - }, - { - "ClickFrog": { - "https://clickfrog.ru/": [ - "bashirian.biz", - "buckridge.link", - "clickfrog.ru", - "franecki.net", - "quitzon.net", - "reichelcormier.bid", - "wisokykulas.bid" - ] - } - }, - { - "ClickFuel": { - "http://clickfuel.com/": [ - "conversiondashboard.com" - ] - } - }, - { - "ClickInc": { - "http://www.clickinc.com/": [ - "clickinc.com" - ] - } - }, - { - "Clicksor": { - "http://www.clicksor.com/": [ - "clicksor.com", - "clicksor.net" - ] - } - }, - { - "Clickwinks": { - "http://www.clickwinks.com/": [ - "clickwinks.com" - ] - } - }, - { - "ClicManager": { - "http://www.clicmanager.fr/": [ - "clicmanager.fr" - ] - } - }, - { - "Clixtell": { - "https://www.clixtell.com/": [ - "clixtell.com" - ] - } - }, - { - "Clove Network": { - "http://www.clovenetwork.com/": [ - "clovenetwork.com" - ] - } - }, - { - "Cognitive Match": { - "http://www.cognitivematch.com/": [ - "cmads.com.tw", - "cmadsasia.com", - "cmadseu.com", - "cmmeglobal.com", - "cognitivematch.com" - ] - } - }, - { - "Collective": { - "http://collective.com/": [ - "collective-media.net", - "collective.com", - "oggifinogi.com", - "tumri.com", - "tumri.net", - "yt1187.net" - ] - } - }, - { - "Commission Junction": { - "http://www.cj.com/": [ - "apmebf.com", - "awltovhc.com", - "cj.com", - "ftjcfx.com", - "kcdwa.com", - "qksz.com", - "qksz.net", - "tqlkg.com", - "yceml.net" - ] - } - }, - { - "Communicator Corp": { - "http://www.communicatorcorp.com/": [ - "communicatorcorp.com" - ] - } - }, - { - "Compass Labs": { - "http://compasslabs.com/": [ - "compasslabs.com" - ] - } - }, - { - "Complex Media": { - "http://www.complexmedianetwork.com/": [ - "complex.com", - "complexmedianetwork.com" - ] - } - }, - { - "comScore": { - "http://www.comscore.com/": [ - "adxpose.com", - "proxilinks.com", - "proximic.com", - "proximic.net" - ] - } - }, - { - "Connatix.com": { - "https://connatix.com/": [ - "connatix.com" - ] - } - }, - { - "Connexity": { - "http://www.connexity.com/": [ - "pricegrabber.com" - ] - } - }, - { - "Consilium Media": { - "http://www.consiliummedia.com/": [ - "consiliummedia.com" - ] - } - }, - { - "Consumable": { - "http://consumable.com/": [ - "consumable.com" - ] - } - }, - { - "CONTAXE": { - "http://www.contaxe.com/": [ - "contaxe.com" - ] - } - }, - { - "ContentABC": { - "http://contentabc.com/": [ - "contentabc.com" - ] - } - }, - { - "CONTEXTin": { - "http://www.contextin.com/": [ - "admailtiser.com", - "contextin.com" - ] - } - }, - { - "ContextuAds": { - "http://www.contextuads.com/": [ - "agencytradingdesk.net", - "contextuads.com" - ] - } - }, - { - "CONTEXTWEB": { - "http://www.contextweb.com/": [ - "contextweb.com" - ] - } - }, - { - "ConvergeDirect": { - "http://www.convergedirect.com/": [ - "convergedirect.com", - "convergetrack.com" - ] - } - }, - { - "ConversantMedia": { - "http://conversantmedia.com": [ - "adserver.com", - "conversantmedia.com", - "dotomi.com", - "dtmpub.com", - "emjcd.com", - "fastclick.com", - "fastclick.net", - "greystripe.com", - "lduhtrp.net", - "mediaplex.com", - "valueclick.com", - "valueclick.net", - "valueclickmedia.com" - ] - } - }, - { - "ConversionRuler": { - "http://www.conversionruler.com/": [ - "conversionruler.com" - ] - } - }, - { - "Conversive": { - "http://www.conversive.nl/": [ - "conversive.nl" - ] - } - }, - { - "CoreMotives": { - "http://coremotives.com/": [ - "coremotives.com" - ] - } - }, - { - "Cox Digital Solutions": { - "http://www.coxdigitalsolutions.com/": [ - "adify.com", - "afy11.net", - "coxdigitalsolutions.com" - ] - } - }, - { - "CPMStar": { - "http://www.cpmstar.com/": [ - "cpmstar.com" - ] - } - }, - { - "CPX Interactive": { - "http://www.cpxinteractive.com/": [ - "adreadypixels.com", - "cpxadroit.com", - "cpxinteractive.com" - ] - } - }, - { - "Creafi": { - "http://www.creafi.com/": [ - "creafi.com" - ] - } - }, - { - "Crimtan": { - "http://www.crimtan.com/": [ - "crimtan.com" - ] - } - }, - { - "Crisp Media": { - "http://www.crispmedia.com/": [ - "crispmedia.com" - ] - } - }, - { - "Criteo": { - "http://www.criteo.com/": [ - "criteo.com", - "criteo.net", - "hlserve.com", - "hooklogic.com", - "storetail.io" - ] - } - }, - { - "Cross Pixel": { - "http://crosspixel.net/": [ - "crosspixel.net", - "crosspixelmedia.com", - "crsspxl.com" - ] - } - }, - { - "cXense": { - "http://www.cxense.com/": [ - "cxense.com", - "emediate.biz", - "emediate.com", - "emediate.dk", - "emediate.eu" - ] - } - }, - { - "Cyberplex": { - "http://www.cyberplex.com/": [ - "cyberplex.com" - ] - } - }, - { - "Dada": { - "http://dada.pro/": [ - "dada.pro", - "simply.com" - ] - } - }, - { - "Datalogix": { - "http://www.datalogix.com/": [ - "nexac.com", - "nextaction.net" - ] - } - }, - { - "DataXu": { - "http://www.dataxu.com/": [ - "dataxu.com", - "dataxu.net", - "mexad.com", - "w55c.net" - ] - } - }, - { - "Datonics": { - "http://datonics.com/": [ - "datonics.com", - "pro-market.net" - ] - } - }, - { - "Datran Media": { - "http://www.datranmedia.com/": [ - "datranmedia.com", - "displaymarketplace.com" - ] - } - }, - { - "Datvantage": { - "http://datvantage.com/": [ - "datvantage.com" - ] - } - }, - { - "DC Storm": { - "http://www.dc-storm.com/": [ - "dc-storm.com", - "stormiq.com" - ] - } - }, - { - "Dedicated Media": { - "http://www.dedicatedmedia.com/": [ - "dedicatedmedia.com", - "dedicatednetworks.com" - ] - } - }, - { - "Delivr": { - "http://delivr.com/": [ - "delivr.com", - "percentmobile.com" - ] - } - }, - { - "Delta Projects": { - "http://www.deltaprojects.se/": [ - "adaction.se", - "de17a.com", - "deltaprojects.se" - ] - } - }, - { - "Demand Media": { - "http://www.demandmedia.com/": [ - "demandmedia.com", - "indieclick.com" - ] - } - }, - { - "Deutsche Post DHL": { - "http://www.dp-dhl.com/": [ - "adcloud.com", - "adcloud.net", - "dp-dhl.com" - ] - } - }, - { - "Developer Media": { - "http://developermedia.com/": [ - "developermedia.com", - "lqcdn.com" - ] - } - }, - { - "DG": { - "http://www.dgit.com/": [ - "dgit.com", - "eyeblaster.com", - "eyewonder.com", - "mdadx.com", - "serving-sys.com", - "unicast.com" - ] - } - }, - { - "dianomi": { - "http://www.dianomi.com/": [ - "dianomi.com" - ] - } - }, - { - "Didit": { - "http://www.didit.com/": [ - "did-it.com", - "didit.com" - ] - } - }, - { - "DigitalAdConsortium": { - "https://www.dac.co.jp/": [ - "impact-ad.jp" - ] - } - }, - { - "Digital River": { - "http://www.digitalriver.com/": [ - "digitalriver.com", - "keywordmax.com", - "netflame.cc" - ] - } - }, - { - "Digital Target": { - "http://digitaltarget.ru": [ - "digitaltarget.ru" - ] - } - }, - { - "Digitize": { - "http://www.digitize.ie/": [ - "digitize.ie" - ] - } - }, - { - "DirectAdvert": { - "http://www.directadvert.ru/": [ - "directadvert.ru" - ] - } - }, - { - "Direct Response Group": { - "http://www.directresponsegroup.com/": [ - "directresponsegroup.com", - "ppctracking.net" - ] - } - }, - { - "Directtrack": { - "http://directtrack.com/": [ - "directtrack.com" - ] - } - }, - { - "Disqus": { - "http://disqus.com/": [ - "disqusads.com" - ] - } - }, - { - "DistrictM": { - "https://districtm.net": [ - "districtm.io" - ] - } - }, - { - "dmpxs": { - "http://bob.dmpxs.com": [ - "dmpxs.com" - ] - } - }, - { - "DoublePimp": { - "http://doublepimp.com/": [ - "doublepimp.com" - ] - } - }, - { - "DoublePositive": { - "http://www.doublepositive.com/": [ - "bid-tag.com", - "doublepositive.com" - ] - } - }, - { - "Drawbridge": { - "http://drawbrid.ge/": [ - "adsymptotic.com", - "drawbrid.ge" - ] - } - }, - { - "DS-IQ": { - "http://www.ds-iq.com/": [ - "ds-iq.com" - ] - } - }, - { - "DSNR Group": { - "http://www.dsnrmg.com/": [ - "dsnrgroup.com", - "dsnrmg.com", - "traffiliate.com", - "z5x.com", - "z5x.net" - ] - } - }, - { - "DynAdmic": { - "https://dynadmic.com/": [ - "dynadmic.com", - "dyntrk.com" - ] - } - }, - { - "DynamicOxygen": { - "http://www.dynamicoxygen.com/": [ - "dynamicoxygen.com", - "exitjunction.com" - ] - } - }, - { - "DynamicYield": { - "https://www.dynamicyield.com/": [ - "px-eu.dynamicyield.com", - "px.dynamicyield.com" - ] - } - }, - { - "Earnify": { - "http://earnify.com/": [ - "earnify.com" - ] - } - }, - { - "eBay": { - "http://www.ebay.com/": [ - "ebay.com" - ] - } - }, - { - "Effective Measure": { - "http://www.effectivemeasure.com/": [ - "effectivemeasure.com", - "effectivemeasure.net" - ] - } - }, - { - "ekolay": { - "http://www.ekolay.net/": [ - "e-kolay.net", - "ekolay.net" - ] - } - }, - { - "Eleavers": { - "http://eleavers.com/": [ - "eleavers.com" - ] - } - }, - { - "Emego": { - "http://www.usemax.de/": [ - "usemax.de" - ] - } - }, - { - "Emerse": { - "https://www.emerse.com": [ - "emerse.com" - ] - } - }, - { - "EMX": { - "https://emxdigital.com/": [ - "brealtime.com", - "clearstream.tv", - "emxdgt.com", - "emxdigital.com" - ] - } - }, - { - "Enecto": { - "http://www.enecto.com/": [ - "enecto.com" - ] - } - }, - { - "engage:BDR": { - "http://engagebdr.com/": [ - "bnmla.com", - "engagebdr.com" - ] - } - }, - { - "Engago Technology": { - "http://www.engago.com/": [ - "appmetrx.com", - "engago.com" - ] - } - }, - { - "Engine Network": { - "http://enginenetwork.com/": [ - "enginenetwork.com" - ] - } - }, - { - "Ensighten": { - "http://www.ensighten.com/": [ - "ensighten.com" - ] - } - }, - { - "Entireweb": { - "http://www.entireweb.com/": [ - "entireweb.com" - ] - } - }, - { - "Epic Media Group": { - "http://www.theepicmediagroup.com/": [ - "epicadvertising.com", - "epicmarketplace.com", - "epicmobileads.com", - "theepicmediagroup.com", - "trafficmp.com" - ] - } - }, - { - "Epsilon": { - "http://www.epsilon.com/": [ - "epsilon.com" - ] - } - }, - { - "EQ Ads": { - "http://www.eqads.com/": [ - "eqads.com" - ] - } - }, - { - "EroAdvertising": { - "http://www.ero-advertising.com/": [ - "ero-advertising.com" - ] - } - }, - { - "Etarget": { - "http://etargetnet.com/": [ - "etarget.eu", - "etargetnet.com" - ] - } - }, - { - "Etineria": { - "http://www.etineria.com/": [ - "adwitserver.com", - "etineria.com" - ] - } - }, - { - "eTrigue": { - "http://www.etrigue.com/": [ - "etrigue.com" - ] - } - }, - { - "Evergage": { - "http://www.evergage.com": [ - "mybuys.com", - "veruta.com" - ] - } - }, - { - "Everyday Health": { - "http://www.everydayhealth.com/": [ - "everydayhealth.com", - "waterfrontmedia.com" - ] - } - }, - { - "Evisions Marketing": { - "http://www.evisionsmarketing.com/": [ - "engineseeker.com", - "evisionsmarketing.com" - ] - } - }, - { - "Evolve": { - "http://www.evolvemediacorp.com/": [ - "evolvemediacorp.com", - "evolvemediametrics.com", - "gorillanation.com" - ] - } - }, - { - "eWayDirect": { - "http://www.ewaydirect.com/": [ - "ewaydirect.com", - "ixs1.net" - ] - } - }, - { - "ewebse": { - "http://ewebse.com/": [ - "777seo.com", - "ewebse.com" - ] - } - }, - { - "excitad": { - "http://excitad.com/": [ - "excitad.com" - ] - } - }, - { - "eXelate": { - "http://exelate.com/": [ - "exelate.com", - "exelator.com" - ] - } - }, - { - "ExoClick": { - "http://www.exoclick.com/": [ - "exoclick.com" - ] - } - }, - { - "Exosrv": { - "http://main.exosrv.com/": [ - "exosrv.com" - ] - } - }, - { - "Experian": { - "http://www.experian.com/": [ - "audienceiq.com", - "experian.com" - ] - } - }, - { - "expo-MAX": { - "http://expo-max.com/": [ - "expo-max.com" - ] - } - }, - { - "Exponential Interactive": { - "http://www.exponential.com/": [ - "adotube.com", - "exponential.com", - "fulltango.com", - "tribalfusion.com" - ] - } - }, - { - "Extension Factory": { - "http://www.extensionfactory.com/": [ - "extensionfactory.com" - ] - } - }, - { - "EXTENSIONS.RU": { - "http://extensions.ru/": [ - "extensions.ru" - ] - } - }, - { - "Eyeconomy": { - "http://www.eyeconomy.co.uk/": [ - "eyeconomy.co.uk", - "eyeconomy.com", - "sublimemedia.net" - ] - } - }, - { - "EyeNewton": { - "http://eyenewton.ru/": [ - "eyenewton.ru" - ] - } - }, - { - "eyeReturn Marketing": { - "http://www.eyereturnmarketing.com/": [ - "eyereturn.com", - "eyereturnmarketing.com" - ] - } - }, - { - "Eyeviewdigital": { - "http://www.eyeviewdigital.com/": [ - "eyeviewdigital.com" - ] - } - }, - { - "Facebook": { - "http://www.facebook.com/": [ - "atlassolutions.com" - ] - } - }, - { - "Facilitate Digital": { - "http://www.facilitatedigital.com/": [ - "adsfac.eu", - "adsfac.info", - "adsfac.net", - "adsfac.sg", - "adsfac.us", - "facilitatedigital.com" - ] - } - }, - { - "Fairfax Media": { - "http://www.fxj.com.au/": [ - "fairfax.com.au", - "fxj.com.au" - ] - } - }, - { - "faithadnet": { - "http://www.faithadnet.com/": [ - "faithadnet.com" - ] - } - }, - { - "Fanplayr": { - "https://fanplayr.com/": [ - "fanplayr.com" - ] - } - }, - { - "Fathom": { - "http://www.fathomdelivers.com/": [ - "fathomdelivers.com", - "fathomseo.com" - ] - } - }, - { - "Federated Media": { - "http://www.federatedmedia.net/": [ - "federatedmedia.net", - "fmpub.net", - "lijit.com" - ] - } - }, - { - "FetchBack": { - "http://www.fetchback.com/": [ - "fetchback.com" - ] - } - }, - { - "Fiksu": { - "http://www.fiksu.com/": [ - "fiksu.com" - ] - } - }, - { - "FinancialContent": { - "http://www.financialcontent.com/": [ - "financialcontent.com" - ] - } - }, - { - "Fizz-Buzz Media": { - "http://www.fizzbuzzmedia.com/": [ - "fizzbuzzmedia.com", - "fizzbuzzmedia.net" - ] - } - }, - { - "Flashtalking": { - "http://www.flashtalking.com/": [ - "flashtalking.com" - ] - } - }, - { - "Flite": { - "http://www.flite.com/": [ - "flite.com", - "widgetserver.com" - ] - } - }, - { - "Fluct": { - "https://corp.fluct.jp/": [ - "adingo.jp", - "fluct.jp" - ] - } - }, - { - "Flytxt": { - "http://www.flytxt.com/": [ - "flytxt.com" - ] - } - }, - { - "Forbes": { - "http://www.forbes.com/": [ - "brandsideplatform.com", - "forbes.com" - ] - } - }, - { - "Fox One Stop Media": { - "http://www.foxonestop.com/": [ - "fimserve.com", - "foxnetworks.com", - "foxonestop.com", - "mobsmith.com", - "myads.com", - "othersonline.com" - ] - } - }, - { - "FreakOut": { - "http://fout.jp/": [ - "fout.jp" - ] - } - }, - { - "Freedom Communications": { - "http://www.freedom.com/": [ - "freedom.com" - ] - } - }, - { - "FreeWheel": { - "http://www.freewheel.tv/": [ - "stickyadstv.com" - ] - } - }, - { - "FriendFinder Networks": { - "http://ffn.com/": [ - "adultfriendfinder.com", - "ffn.com", - "pop6.com" - ] - } - }, - { - "Friends2Follow": { - "https://friends2follow.com/": [ - "tracking.friends2follow.com" - ] - } - }, - { - "Frog Sex": { - "http://www.frogsex.com/": [ - "double-check.com", - "frogsex.com" - ] - } - }, - { - "FuelX": { - "https://fuelx.com/": [ - "fuel451.com", - "fuelx.com" - ] - } - }, - { - "Future Ads": { - "https://www.futureads.com/": [ - "futureads.com", - "resultlinks.com" - ] - } - }, - { - "Fyber": { - "https://www.fyber.com/": [ - "fyber.com" - ] - } - }, - { - "Game Advertising Online": { - "http://www.game-advertising-online.com/": [ - "game-advertising-online.com" - ] - } - }, - { - "Games2win": { - "http://www.games2win.com/": [ - "games2win.com", - "inviziads.com" - ] - } - }, - { - "Gamned": { - "http://www.gamned.com/": [ - "gamned.com" - ] - } - }, - { - "Gannett": { - "http://www.gannett.com/": [ - "gannett.com", - "pointroll.com" - ] - } - }, - { - "GB-World": { - "http://www.gb-world.net/": [ - "gb-world.net" - ] - } - }, - { - "Gemius": { - "http://www.gemius.com/": [ - "gemius.com", - "gemius.pl" - ] - } - }, - { - "Genesis Media": { - "http://www.genesismedia.com/": [ - "genesismedia.com", - "genesismediaus.com" - ] - } - }, - { - "GENIEE": { - "https://geniee.co.jp/": [ - "geniee.co.jp", - "gssprt.jp" - ] - } - }, - { - "GENIE GROUP": { - "http://www.geniegroupltd.co.uk/": [ - "geniegroupltd.co.uk" - ] - } - }, - { - "GeoAds": { - "http://www.geoads.com/": [ - "geoads.com" - ] - } - }, - { - "GetGlue": { - "http://getglue.com/": [ - "getglue.com", - "smrtlnks.com" - ] - } - }, - { - "GetIntent": { - "http://getintent.com/": [ - "adhigh.net", - "getintent.com" - ] - } - }, - { - "GISMAds": { - "http://www.gismads.jp/": [ - "gismads.jp" - ] - } - }, - { - "Glam Media": { - "http://www.glammedia.com/": [ - "glam.com", - "glammedia.com" - ] - } - }, - { - "Gleam": { - "https://gleam.io/": [ - "fraudjs.io", - "gleam.io" - ] - } - }, - { - "Globe7": { - "http://www.globe7.com/": [ - "globe7.com" - ] - } - }, - { - "GoDataFeed": { - "http://godatafeed.com/": [ - "godatafeed.com" - ] - } - }, - { - "Goldbach": { - "http://www.goldbachgroup.com/": [ - "goldbach.com", - "goldbachgroup.com" - ] - } - }, - { - "GoldSpot Media": { - "http://www.goldspotmedia.com/": [ - "goldspotmedia.com" - ] - } - }, - { - "Google": { - "http://www.google.com/": [ - "2mdn.net", - "admeld.com", - "admob.com", - "adservice.google.ca", - "adservice.google.com", - "adwords.google.com", - "cc-dt.com", - "destinationurl.com", - "doubleclick.net", - "googleadservices.com", - "googlesyndication.com", - "googletagservices.com", - "invitemedia.com", - "smtad.net", - "teracent.com", - "teracent.net", - "ytsa.net" - ] - } - }, - { - "Grapeshot": { - "http://www.grapeshot.co.uk/": [ - "grapeshot.co.uk" - ] - } - }, - { - "Graphnium": { - "https://www.graphinium.com/": [ - "crm4d.com" - ] - } - }, - { - "Grocery Shopping Network": { - "http://www.groceryshopping.net/": [ - "groceryshopping.net" - ] - } - }, - { - "GroovinAds": { - "http://www.groovinads.com/": [ - "groovinads.com" - ] - } - }, - { - "Gruner + Jahr": { - "http://www.guj.de/": [ - "guj.de", - "ligatus.com" - ] - } - }, - { - "GumGum": { - "http://gumgum.com/": [ - "gumgum.com" - ] - } - }, - { - "Gunggo": { - "http://www.gunggo.com/": [ - "gunggo.com" - ] - } - }, - { - "Hands Mobile": { - "http://www.hands.com.br/": [ - "hands.com.br" - ] - } - }, - { - "Harrenmedia": { - "http://www.harrenmedia.com/": [ - "harrenmedia.com", - "harrenmedianetwork.com" - ] - } - }, - { - "HealthPricer": { - "http://www.healthpricer.com/": [ - "adacado.com", - "healthpricer.com" - ] - } - }, - { - "Hearst": { - "http://www.hearst.com/": [ - "hearst.com", - "ic-live.com", - "iclive.com", - "icrossing.com", - "sptag.com", - "sptag1.com", - "sptag2.com", - "sptag3.com" - ] - } - }, - { - "HilltopAds": { - "https://hilltopads.com/": [ - "hilltopads.com", - "hilltopads.net", - "shoporielder.pro" - ] - } - }, - { - "Hi-media": { - "http://www.hi-media.com/": [ - "comclick.com", - "hi-media.com" - ] - } - }, - { - "Horyzon Media": { - "http://www.horyzon-media.com/": [ - "horyzon-media.com" - ] - } - }, - { - "HotMart": { - "https://www.hotmart.com/en/": [ - "hotmart.com" - ] - } - }, - { - "HOTWords": { - "http://www.hotwords.com/": [ - "hotwords.com", - "hotwords.es" - ] - } - }, - { - "HP": { - "http://www.hp.com/": [ - "hp.com", - "optimost.com" - ] - } - }, - { - "Httpool": { - "http://www.httpool.com/": [ - "httpool.com" - ] - } - }, - { - "HUNT Mobile Ads": { - "http://www.huntmads.com/": [ - "huntmads.com" - ] - } - }, - { - "Hurra.com": { - "http://www.hurra.com/": [ - "hurra.com" - ] - } - }, - { - "IAB": { - "https://iabtechlab.com/": [ - "digitru.st" - ] - } - }, - { - "IAC": { - "http://www.iac.com/": [ - "iac.com", - "iacadvertising.com" - ] - } - }, - { - "iBehavior": { - "http://www.i-behavior.com/": [ - "i-behavior.com", - "ib-ibi.com" - ] - } - }, - { - "IBM": { - "http://www.ibm.com/": [ - "unica.com" - ] - } - }, - { - "ID5": { - "http://id5.io/": [ - "id5-sync.com" - ] - } - }, - { - "IDG": { - "http://www.idg.com/": [ - "idg.com", - "idgtechnetwork.com" - ] - } - }, - { - "iEntry": { - "http://www.ientry.com/": [ - "600z.com", - "ientry.com" - ] - } - }, - { - "IgnitAd": { - "http://www.ignitad.com/": [ - "ignitad.com" - ] - } - }, - { - "IgnitionOne": { - "http://www.ignitionone.com/": [ - "ignitionone.com", - "ignitionone.net", - "searchignite.com" - ] - } - }, - { - "Improve Digital": { - "www.improvedigital.com/": [ - "360yield.com", - "improvedigital.com" - ] - } - }, - { - "Inadco": { - "http://www.inadco.com/": [ - "anadcoads.com", - "inadco.com", - "inadcoads.com" - ] - } - }, - { - "IndexExchange": { - "https://www.indexexchange.com": [ - "indexexchange.com" - ] - } - }, - { - "Infectious Media": { - "http://www.infectiousmedia.com/": [ - "impressiondesk.com", - "infectiousmedia.com" - ] - } - }, - { - "Inflection Point Media": { - "http://www.inflectionpointmedia.com/": [ - "inflectionpointmedia.com" - ] - } - }, - { - "Infogroup": { - "http://www.infogroup.com/": [ - "infogroup.com" - ] - } - }, - { - "Infolinks": { - "http://www.infolinks.com/": [ - "infolinks.com" - ] - } - }, - { - "Infra-Ad": { - "http://www.infra-ad.com/": [ - "infra-ad.com" - ] - } - }, - { - "InMobi": { - "http://www.inmobi.com/": [ - "aerserv.com", - "inmobi.com", - "sproutinc.com" - ] - } - }, - { - "inneractive": { - "http://inner-active.com/": [ - "inner-active.com" - ] - } - }, - { - "Innity": { - "http://innity.com/": [ - "innity.com" - ] - } - }, - { - "InsightExpress": { - "http://www.insightexpress.com/": [ - "insightexpress.com", - "insightexpressai.com" - ] - } - }, - { - "InSkin Media": { - "http://inskinmedia.com/": [ - "inskinmedia.com" - ] - } - }, - { - "Instinctive": { - "https://instinctive.io/": [ - "instinctive.io", - "instinctiveads.com" - ] - } - }, - { - "Integral Ad Science": { - "https://integralads.com/": [ - "adsafemedia.com", - "adsafeprotected.com", - "iasds01.com", - "integralads.com" - ] - } - }, - { - "Intent Media": { - "http://www.intentmedia.com/": [ - "intentmedia.com", - "intentmedia.net" - ] - } - }, - { - "Intergi": { - "http://intergi.com/": [ - "intergi.com" - ] - } - }, - { - "Intermarkets": { - "http://www.intermarkets.net/": [ - "intermarkets.net" - ] - } - }, - { - "Intermundo Media": { - "http://intermundomedia.com/": [ - "intermundomedia.com" - ] - } - }, - { - "Internet Brands": { - "http://www.internetbrands.com/": [ - "ibpxl.com", - "internetbrands.com" - ] - } - }, - { - "Interpolls": { - "http://www.interpolls.com/": [ - "interpolls.com" - ] - } - }, - { - "Inuvo": { - "http://inuvo.com/": [ - "inuvo.com" - ] - } - }, - { - "InvestingChannel": { - "http://investingchannel.com/": [ - "investingchannel.com" - ] - } - }, - { - "IponWeb": { - "https://www.iponweb.com/": [ - "iponweb.com", - "iponweb.net" - ] - } - }, - { - "iPROM": { - "http://www.iprom.si/": [ - "centraliprom.com", - "iprom.net", - "iprom.si", - "mediaiprom.com" - ] - } - }, - { - "iPromote": { - "http://www.ipromote.com/": [ - "ipromote.com" - ] - } - }, - { - "iProspect": { - "http://www.iprospect.com/": [ - "clickmanage.com", - "iprospect.com" - ] - } - }, - { - "ISI Technologies": { - "http://digbro.com/": [ - "adversalservers.com", - "digbro.com" - ] - } - }, - { - "ismatlab.com": { - "http://ismatlab.com": [ - "ismatlab.com" - ] - } - }, - { - "I.UA": { - "http://www.i.ua/": [ - "i.ua" - ] - } - }, - { - "Jaroop": { - "http://www.jaroop.com/": [ - "jaroop.com" - ] - } - }, - { - "JasperLabs": { - "http://www.jasperlabs.com/": [ - "jasperlabs.com" - ] - } - }, - { - "Jemm": { - "http://jemmgroup.com/": [ - "jemmgroup.com" - ] - } - }, - { - "Jink": { - "http://www.jink.de/": [ - "jink.de", - "jinkads.com" - ] - } - }, - { - "Jirbo": { - "http://jirbo.com/": [ - "adcolony.com", - "jirbo.com" - ] - } - }, - { - "Jivox": { - "http://www.jivox.com/": [ - "jivox.com" - ] - } - }, - { - "JobThread": { - "http://www.jobthread.com/": [ - "jobthread.com" - ] - } - }, - { - "JuicyAds": { - "http://www.juicyads.com/": [ - "juicyads.com" - ] - } - }, - { - "Jumptap": { - "http://www.jumptap.com/": [ - "jumptap.com" - ] - } - }, - { - "justuno": { - "https://www.justuno.com/": [ - "justuno.com" - ] - } - }, - { - "Kargo": { - "https://kargo.com/": [ - "kargo.com" - ] - } - }, - { - "Kenshoo": { - "http://www.kenshoo.com/": [ - "kenshoo.com", - "xg4ken.com" - ] - } - }, - { - "Keyade": { - "http://www.keyade.com/": [ - "keyade.com" - ] - } - }, - { - "Keywee": { - "https://keywee.co": [ - "keywee.co" - ] - } - }, - { - "KissMyAds": { - "http://kissmyads.com/": [ - "kissmyads.com" - ] - } - }, - { - "Kitara Media": { - "http://www.kitaramedia.com/": [ - "103092804.com", - "kitaramedia.com" - ] - } - }, - { - "KIT digital": { - "http://kitd.com/": [ - "keewurd.com", - "kitd.com", - "peerset.com" - ] - } - }, - { - "Kokteyl": { - "http://www.kokteyl.com/": [ - "admost.com", - "kokteyl.com" - ] - } - }, - { - "Komli": { - "http://www.komli.com/": [ - "komli.com" - ] - } - }, - { - "Kontera": { - "http://www.kontera.com/": [ - "kontera.com" - ] - } - }, - { - "Korrelate": { - "http://korrelate.com/": [ - "adsummos.com", - "adsummos.net", - "korrelate.com" - ] - } - }, - { - "Krux": { - "http://www.krux.com/": [ - "krux.com", - "kruxdigital.com", - "krxd.net" - ] - } - }, - { - "Lakana": { - "http://www.lakana.com/": [ - "ibsys.com", - "lakana.com" - ] - } - }, - { - "Layer-Ad.org": { - "http://layer-ad.org/": [ - "layer-ad.org" - ] - } - }, - { - "Layer Ads": { - "http://layer-ads.net/": [ - "layer-ads.net" - ] - } - }, - { - "LeadBolt": { - "http://www.leadbolt.com/": [ - "leadbolt.com" - ] - } - }, - { - "LeadFormix": { - "http://www.leadformix.com/": [ - "leadforce1.com", - "leadformix.com" - ] - } - }, - { - "LeanPlum": { - "https://www.leanplum.com/": [ - "leanplum.com" - ] - } - }, - { - "Legolas Media": { - "http://www.legolas-media.com/": [ - "legolas-media.com" - ] - } - }, - { - "Levexis": { - "http://www.levexis.com/": [ - "levexis.com" - ] - } - }, - { - "Lexos Media": { - "http://www.lexosmedia.com/": [ - "adbull.com", - "lexosmedia.com" - ] - } - }, - { - "LifeStreet": { - "http://lifestreetmedia.com/": [ - "lfstmedia.com", - "lifestreetmedia.com" - ] - } - }, - { - "LinkConnector": { - "http://www.linkconnector.com/": [ - "linkconnector.com" - ] - } - }, - { - "LinkShare": { - "http://www.linkshare.com/": [ - "linkshare.com", - "linksynergy.com" - ] - } - }, - { - "Linkz": { - "http://www.linkz.net/": [ - "linkz.net" - ] - } - }, - { - "Listrak": { - "http://www.listrak.com/": [ - "listrak.com", - "listrakbi.com" - ] - } - }, - { - "LiveIntent": { - "http://www.liveintent.com/": [ - "liadm.com", - "liveintent.com" - ] - } - }, - { - "LiveInternet": { - "http://www.liveinternet.ru": [ - "liveinternet.ru", - "yadro.ru" - ] - } - }, - { - "LiveRamp": { - "https://liveramp.com/": [ - "liveramp.com", - "tvpixel.com" - ] - } - }, - { - "LKQD": { - "http://lkqd.com": [ - "lkqd.com", - "lkqd.net" - ] - } - }, - { - "Local Yokel Media": { - "http://www.localyokelmedia.com/": [ - "localyokelmedia.com" - ] - } - }, - { - "Localytics": { - "https://www.localytics.com/": [ - "localytics.com" - ] - } - }, - { - "LockerDome": { - "https://lockerdome.com/": [ - "lockerdome.com" - ] - } - }, - { - "Longboard Media": { - "http://longboardmedia.com/": [ - "longboardmedia.com" - ] - } - }, - { - "Loomia": { - "http://www.loomia.com/": [ - "loomia.com" - ] - } - }, - { - "LoopFuse": { - "https://www.loopfuse.net/": [ - "lfov.net", - "loopfuse.net" - ] - } - }, - { - "LoopMe": { - "https://loopme.com/": [ - "loopme.com" - ] - } - }, - { - "LotLinx": { - "https://www.lotlinx.com": [ - "lotlinx.com" - ] - } - }, - { - "Lower My Bills": { - "http://lowermybills.com": [ - "lowermybills.com" - ] - } - }, - { - "lptracker": { - "https://lptracker.io/": [ - "lptracker.io" - ] - } - }, - { - "LucidMedia": { - "http://www.lucidmedia.com/": [ - "lucidmedia.com" - ] - } - }, - { - "m6d": { - "http://m6d.com/": [ - "m6d.com", - "media6degrees.com" - ] - } - }, - { - "Madhouse": { - "http://www.madhouse.cn/": [ - "madhouse.cn" - ] - } - }, - { - "Madison Logic": { - "http://www.madisonlogic.com/": [ - "dinclinx.com", - "madisonlogic.com" - ] - } - }, - { - "madvertise": { - "http://madvertise.com/": [ - "madvertise.com" - ] - } - }, - { - "Magnetic": { - "http://www.magnetic.com/": [ - "domdex.com", - "domdex.net", - "magnetic.com", - "qjex.net" - ] - } - }, - { - "Magnify360": { - "http://www.magnify360.com/": [ - "dialogmgr.com", - "magnify360.com" - ] - } - }, - { - "MailChimp": { - "http://mailchimp.com/": [ - "campaign-archive1.com", - "list-manage.com", - "mailchimp.com" - ] - } - }, - { - "Manifest": { - "http://www.manifest.ru/": [ - "bannerbank.ru", - "manifest.ru" - ] - } - }, - { - "Marchex": { - "http://www.marchex.com/": [ - "industrybrains.com", - "marchex.com" - ] - } - }, - { - "Marimedia": { - "http://www.marimedia.net/": [ - "marimedia.net" - ] - } - }, - { - "MarketGid": { - "http://www.marketgid.com/": [ - "dt00.net", - "dt07.net", - "marketgid.com" - ] - } - }, - { - "Marketo": { - "http://www.marketo.com/": [ - "marketo.com", - "marketo.net" - ] - } - }, - { - "Martini Media": { - "http://martinimedianetwork.com/": [ - "martiniadnetwork.com", - "martinimedianetwork.com" - ] - } - }, - { - "mashero": { - "http://www.mashero.com/": [ - "mashero.com" - ] - } - }, - { - "Match.com": { - "http://www.match.com/": [ - "chemistry.com", - "match.com", - "meetic-partners.com" - ] - } - }, - { - "Matomy": { - "http://www.matomy.com/": [ - "adnetinteractive.com", - "adsmarket.com", - "matomy.com", - "matomymarket.com", - "matomymedia.com", - "mediawhiz.com", - "optimatic.com", - "xtendmedia.com" - ] - } - }, - { - "MaxBounty": { - "http://www.maxbounty.com/": [ - "maxbounty.com", - "mb01.com" - ] - } - }, - { - "MaxPoint": { - "http://maxpointinteractive.com/": [ - "maxpointinteractive.com", - "maxusglobal.com", - "mxptint.net" - ] - } - }, - { - "MdotM": { - "http://mdotm.com/": [ - "mdotm.com" - ] - } - }, - { - "MediaBrix": { - "http://www.mediabrix.com/": [ - "mediabrix.com" - ] - } - }, - { - "MediaCom": { - "http://www.mediacom.com/": [ - "mediacom.com" - ] - } - }, - { - "mediaFORGE": { - "http://www.mediaforge.com/": [ - "mediaforge.com" - ] - } - }, - { - "Medialets": { - "http://www.medialets.com/": [ - "medialets.com" - ] - } - }, - { - "MediaMath": { - "http://www.mediamath.com/": [ - "adroitinteractive.com", - "designbloxlive.com", - "mathtag.com", - "mediamath.com" - ] - } - }, - { - "media.net": { - "http://www.media.net/": [ - "media.net" - ] - } - }, - { - "Mediaocean": { - "http://www.mediaocean.com/": [ - "adbuyer.com", - "mediaocean.com" - ] - } - }, - { - "MediaShakers": { - "http://www.mediashakers.com/": [ - "media-servers.net", - "mediashakers.com" - ] - } - }, - { - "MediaTrust": { - "http://www.mediatrust.com/": [ - "mediatrust.com" - ] - } - }, - { - "Medicx Media Solutions": { - "http://www.medicxmedia.com/": [ - "medicxmedia.com" - ] - } - }, - { - "MegaIndex": { - "http://www.megaindex.ru/": [ - "megaindex.ru" - ] - } - }, - { - "Mercent": { - "http://www.mercent.com/": [ - "mercent.com" - ] - } - }, - { - "MerchantAdvantage": { - "http://www.merchantadvantage.com/": [ - "merchantadvantage.com" - ] - } - }, - { - "Merchenta": { - "http://www.merchenta.com/": [ - "merchenta.com" - ] - } - }, - { - "Merkle": { - "https://www.merkleinc.com/": [ - "rimmkaufman.com", - "rkdms.com" - ] - } - }, - { - "Meta Network": { - "http://www.metanetwork.com/": [ - "metanetwork.com" - ] - } - }, - { - "Meteor": { - "http://www.meteorsolutions.com/": [ - "meteorsolutions.com" - ] - } - }, - { - "MetrixLab": { - "https://www.metrixlab.com": [ - "adoftheyear.com", - "crm-metrix.com", - "customerconversio.com", - "metrixlab.com", - "opinionbar.com" - ] - } - }, - { - "MicroAd": { - "http://www.microad.jp/": [ - "microad.jp" - ] - } - }, - { - "Microsoft": { - "http://www.microsoft.com/": [ - "adbureau.net", - "adecn.com", - "aquantive.com", - "msads.net", - "netconversions.com", - "roiservice.com" - ] - } - }, - { - "Millennial Media": { - "http://www.millennialmedia.com/": [ - "decktrade.com", - "millennialmedia.com", - "mydas.mobi" - ] - } - }, - { - "Mindset Media": { - "http://www.mindset-media.com/": [ - "mindset-media.com", - "mmismm.com" - ] - } - }, - { - "Mirando": { - "http://www.mirando.de/": [ - "mirando.de" - ] - } - }, - { - "Mixpo": { - "http://www.mixpo.com/": [ - "mixpo.com" - ] - } - }, - { - "Moat": { - "http://www.moat.com/": [ - "moat.com", - "moatads.com" - ] - } - }, - { - "MobFox": { - "http://www.mobfox.com/": [ - "mobfox.com" - ] - } - }, - { - "Mobials": { - "http://mobials.com": [ - "mobials.com" - ] - } - }, - { - "MobileAdTrading": { - "https://mobileadtrading.com/": [ - "mobileadtrading.com" - ] - } - }, - { - "Mobile Meteor": { - "http://mobilemeteor.com/": [ - "mobilemeteor.com", - "showmeinn.com" - ] - } - }, - { - "Mobile Storm": { - "http://mobilestorm.com/": [ - "mobilestorm.com" - ] - } - }, - { - "MobVision": { - "http://www.mobvision.com/": [ - "admoda.com", - "mobvision.com" - ] - } - }, - { - "Mocean Mobile": { - "http://www.moceanmobile.com/": [ - "moceanmobile.com" - ] - } - }, - { - "Mochila": { - "http://www.mochila.com/": [ - "mochila.com" - ] - } - }, - { - "Mojiva": { - "http://www.mojiva.com/": [ - "mojiva.com" - ] - } - }, - { - "Monetate": { - "http://monetate.com/": [ - "monetate.com", - "monetate.net" - ] - } - }, - { - "MONETIZEdigital": { - "https://www.cpalead.com/": [ - "cpalead.com" - ] - } - }, - { - "Monetize More": { - "http://monetizemore.com/": [ - "monetizemore.com" - ] - } - }, - { - "Monoloop": { - "http://www.monoloop.com/": [ - "monoloop.com" - ] - } - }, - { - "Monster": { - "http://www.monster.com/": [ - "monster.com" - ] - } - }, - { - "Moolah Media": { - "http://www.moolahmedia.com/": [ - "moolah-media.com", - "moolahmedia.com" - ] - } - }, - { - "MoPub": { - "http://www.mopub.com/": [ - "mopub.com" - ] - } - }, - { - "MovieLush.com": { - "https://www.movielush.com/": [ - "affbuzzads.com", - "movielush.com" - ] - } - }, - { - "Multiple Stream Media": { - "http://www.multiplestreammktg.com/": [ - "adclickmedia.com", - "multiplestreammktg.com" - ] - } - }, - { - "MUNDO Media": { - "http://www.mundomedia.com/": [ - "mundomedia.com", - "silver-path.com" - ] - } - }, - { - "MyCounter": { - "http://mycounter.com.ua/": [ - "mycounter.com.ua" - ] - } - }, - { - "MyPressPlus": { - "http://www.mypressplus.com/": [ - "mypressplus.com", - "ppjol.net" - ] - } - }, - { - "myThings": { - "http://www.mythings.com/": [ - "mythings.com", - "mythingsmedia.com" - ] - } - }, - { - "MyWebGrocer": { - "http://www.mywebgrocer.com/": [ - "mywebgrocer.com" - ] - } - }, - { - "Nanigans": { - "http://www.nanigans.com/": [ - "nanigans.com" - ] - } - }, - { - "NativeAds": { - "https://nativeads.com/": [ - "nativeads.com" - ] - } - }, - { - "Nativo": { - "http://www.nativo.net/": [ - "postrelease.com" - ] - } - }, - { - "Navegg": { - "http://www.navegg.com/": [ - "navdmp.com", - "navegg.com" - ] - } - }, - { - "NetAffiliation": { - "http://www.netaffiliation.com/": [ - "netaffiliation.com" - ] - } - }, - { - "NetBina": { - "http://www.netbina.com/": [ - "netbina.com" - ] - } - }, - { - "NetElixir": { - "http://www.netelixir.com/": [ - "adelixir.com", - "netelixir.com" - ] - } - }, - { - "Netmining": { - "http://www.netmining.com/": [ - "netmining.com", - "netmng.com" - ] - } - }, - { - "Net-Results": { - "http://www.net-results.com/": [ - "cdnma.com", - "net-results.com", - "nr7.us" - ] - } - }, - { - "NetSeer": { - "http://www.netseer.com/": [ - "netseer.com" - ] - } - }, - { - "NetShelter": { - "http://netshelter.com/": [ - "netshelter.com", - "netshelter.net" - ] - } - }, - { - "Neustar": { - "http://www.neustar.biz/": [ - "adadvisor.net", - "neustar.biz" - ] - } - }, - { - "newtention": { - "http://newtention.de/": [ - "newtention.de", - "newtention.net", - "newtentionassets.net" - ] - } - }, - { - "Nexage": { - "http://nexage.com/": [ - "nexage.com" - ] - } - }, - { - "Nextag": { - "http://www.nextag.com/": [ - "nextag.com" - ] - } - }, - { - "NextPerformance": { - "http://www.nextperformance.com/": [ - "nextperformance.com", - "nxtck.com" - ] - } - }, - { - "Nielsen": { - "http://www.nielsen.com/": [ - "imrworldwide.com", - "imrworldwide.net" - ] - } - }, - { - "Ninua": { - "http://www.ninua.com/": [ - "networkedblogs.com", - "ninua.com" - ] - } - }, - { - "Nokta": { - "http://www.noktamedya.com/": [ - "noktamedya.com", - "virgul.com" - ] - } - }, - { - "NowSpots": { - "http://nowspots.com/": [ - "nowspots.com" - ] - } - }, - { - "nrelate": { - "http://nrelate.com/": [ - "nrelate.com" - ] - } - }, - { - "Nuffnang": { - "http://www.nuffnang.com.my/": [ - "nuffnang.com", - "nuffnang.com.my" - ] - } - }, - { - "nugg.ad": { - "http://www.nugg.ad/": [ - "nugg.ad", - "nuggad.net" - ] - } - }, - { - "Ohana Media": { - "http://www.ohana-media.com/": [ - "adohana.com", - "ohana-media.com", - "ohanaqb.com" - ] - } - }, - { - "Omnicom Group": { - "http://www.omnicomgroup.com/": [ - "accuenmedia.com", - "omnicomgroup.com", - "p-td.com" - ] - } - }, - { - "onAd": { - "http://www.onad.eu/": [ - "onad.eu" - ] - } - }, - { - "Onclusive": { - "https://onclusive.com/": [ - "airpr.com" - ] - } - }, - { - "OneAd": { - "https://www.onead.com.tw/": [ - "guoshipartners.com", - "onevision.com.tw" - ] - } - }, - { - "One iota": { - "http://www.itsoneiota.com/": [ - "itsoneiota.com", - "oneiota.co.uk" - ] - } - }, - { - "Oneupweb": { - "http://www.oneupweb.com/": [ - "oneupweb.com", - "sodoit.com" - ] - } - }, - { - "OnlineMetrix": { - "http://h.online-metrix.net": [ - "online-metrix.net" - ] - } - }, - { - "Open New Media": { - "http://www.onm.de/": [ - "onm.de" - ] - } - }, - { - "OpenX": { - "http://openx.com/": [ - "liftdna.com", - "openx.com", - "openx.net", - "openx.org", - "openxenterprise.com", - "servedbyopenx.com" - ] - } - }, - { - "Opera": { - "http://www.opera.com/": [ - "mobiletheory.com", - "opera.com", - "operamediaworks.com", - "operasoftware.com" - ] - } - }, - { - "OPT": { - "http://www.opt.ne.jp/": [ - "advg.jp", - "opt.ne.jp", - "p-advg.com" - ] - } - }, - { - "Optify": { - "http://www.optify.net/": [ - "optify.net" - ] - } - }, - { - "Optimal": { - "http://optim.al/": [ - "cpmadvisors.com", - "cpmatic.com", - "nprove.com", - "optim.al", - "orbengine.com", - "xa.net" - ] - } - }, - { - "OptimumResponse": { - "http://www.optimumresponse.com/": [ - "optimumresponse.com" - ] - } - }, - { - "OptinMonster": { - "https://optinmonster.com/": [ - "optinmonster.com", - "optnmstr.com" - ] - } - }, - { - "OptMD": { - "http://optmd.com/": [ - "optmd.com" - ] - } - }, - { - "Oracle": { - "http://www.oracle.com/": [ - "estara.com" - ] - } - }, - { - "OrangeSoda": { - "http://www.orangesoda.com/": [ - "orangesoda.com", - "otracking.com" - ] - } - }, - { - "Outbrain": { - "http://www.outbrain.com/": [ - "outbrain.com", - "sphere.com", - "visualrevenue.com" - ] - } - }, - { - "Out There Media": { - "http://www.out-there-media.com/": [ - "out-there-media.com" - ] - } - }, - { - "Oversee.net": { - "http://www.oversee.net/": [ - "dsnextgen.com", - "oversee.net" - ] - } - }, - { - "OwnerIQ": { - "http://www.owneriq.com/": [ - "owneriq.com", - "owneriq.net" - ] - } - }, - { - "OxaMedia": { - "http://www.oxamedia.com/": [ - "adconnexa.com", - "adsbwm.com", - "oxamedia.com" - ] - } - }, - { - "PageFair": { - "https://pagefair.com/": [ - "pagefair.com", - "pagefair.net" - ] - } - }, - { - "Paid-To-Promote.net": { - "http://www.paid-to-promote.net/": [ - "paid-to-promote.net" - ] - } - }, - { - "Pardot": { - "http://www.pardot.com/": [ - "pardot.com" - ] - } - }, - { - "PayHit": { - "http://www.payhit.com/": [ - "payhit.com" - ] - } - }, - { - "Paypopup.com": { - "http://www.paypopup.com/": [ - "lzjl.com", - "paypopup.com" - ] - } - }, - { - "PebblePost": { - "https://www.pebblepost.com/": [ - "pbbl.co" - ] - } - }, - { - "Peer39": { - "http://www.peer39.com/": [ - "peer39.com", - "peer39.net" - ] - } - }, - { - "PeerFly": { - "http://peerfly.com/": [ - "peerfly.com" - ] - } - }, - { - "Performancing": { - "http://performancing.com/": [ - "performancing.com" - ] - } - }, - { - "PerimeterX": { - "https://www.perimeterx.com": [ - "perimeterx.net" - ] - } - }, - { - "Pheedo": { - "http://site.pheedo.com/": [ - "pheedo.com" - ] - } - }, - { - "Pictela": { - "http://www.pictela.com/": [ - "pictela.com", - "pictela.net" - ] - } - }, - { - "PinPoll": { - "https://pinpoll.com/": [ - "pinpoll.com" - ] - } - }, - { - "Pixel.sg": { - "http://www.pixel.sg/": [ - "pixel.sg" - ] - } - }, - { - "Piximedia": { - "http://www.piximedia.com/": [ - "piximedia.com" - ] - } - }, - { - "Pixlee": { - "https://www.pixlee.com/": [ - "pixlee.com" - ] - } - }, - { - "PLATFORM ONE": { - "http://www.platform-one.co.jp/": [ - "platform-one.co.jp" - ] - } - }, - { - "plista": { - "http://www.plista.com/": [ - "plista.com" - ] - } - }, - { - "PocketCents": { - "http://pocketcents.com/": [ - "pocketcents.com" - ] - } - }, - { - "Polar Mobile": { - "http://polarmobile.com": [ - "mediavoice.com", - "polarmobile.com" - ] - } - }, - { - "Politads": { - "http://politads.com/": [ - "politads.com" - ] - } - }, - { - "Polymorph": { - "http://getpolymorph.com/": [ - "adsnative.com", - "getpolymorph.com" - ] - } - }, - { - "Pontiflex": { - "http://www.pontiflex.com/": [ - "pontiflex.com" - ] - } - }, - { - "PopAds": { - "https://www.popads.net/": [ - "popads.net", - "popadscdn.net" - ] - } - }, - { - "PopRule": { - "http://poprule.com/": [ - "gocampaignlive.com", - "poprule.com" - ] - } - }, - { - "Popunder.ru": { - "http://popunder.ru/": [ - "popunder.ru" - ] - } - }, - { - "Po.st": { - "http://www.po.st/": [ - "po.st" - ] - } - }, - { - "Powerlinks": { - "https://www.powerlinks.com/": [ - "powerlinks.com" - ] - } - }, - { - "PPCProtect": { - "https://ppcprotect.com": [ - "ppcprotect.com" - ] - } - }, - { - "PrecisionClick": { - "http://www.precisionclick.com/": [ - "precisionclick.com" - ] - } - }, - { - "PredictAd": { - "http://www.predictad.com/": [ - "predictad.com" - ] - } - }, - { - "Pressflex": { - "http://www.pressflex.com/": [ - "blogads.com", - "pressflex.com" - ] - } - }, - { - "Prime Visibility": { - "http://www.primevisibility.com/": [ - "adcde.com", - "addlvr.com", - "adonnetwork.com", - "adonnetwork.net", - "adtrgt.com", - "bannertgt.com", - "cptgt.com", - "cpvfeed.com", - "cpvtgt.com", - "dashboardad.net", - "popcde.com", - "primevisibility.com", - "sdfje.com", - "urtbk.com" - ] - } - }, - { - "Primis": { - "https://www.primis.tech": [ - "sekindo.com" - ] - } - }, - { - "PrismApp": { - "https://www.prismapp.io/": [ - "prismapp.io" - ] - } - }, - { - "Proclivity": { - "http://www.proclivitymedia.com/": [ - "proclivitymedia.com", - "proclivitysystems.com", - "pswec.com" - ] - } - }, - { - "Project Wonderful": { - "http://www.projectwonderful.com/": [ - "projectwonderful.com" - ] - } - }, - { - "PrometheusIntelligenceTechnology": { - "https://prometheusintelligencetechnology.com/": [ - "prometheusintelligencetechnology.com" - ] - } - }, - { - "Propeller Ads": { - "http://propellerads.com/": [ - "propellerads.com" - ] - } - }, - { - "Prosperent": { - "http://prosperent.com/": [ - "prosperent.com" - ] - } - }, - { - "Protected Media": { - "http://www.protected.media/": [ - "ad-score.com", - "protected.media" - ] - } - }, - { - "Provers": { - "http://provers.pro": [ - "provers.pro" - ] - } - }, - { - "Psonstrentie": { - "http://psonstrentie.info": [ - "psonstrentie.info" - ] - } - }, - { - "Public-Idées": { - "http://www.publicidees.com/": [ - "publicidees.com" - ] - } - }, - { - "Publishers Clearing House": { - "http://www.pch.com/": [ - "pch.com" - ] - } - }, - { - "PubMatic": { - "http://www.pubmatic.com/": [ - "pubmatic.com", - "revinet.com" - ] - } - }, - { - "PulsePoint": { - "https://www.pulsepoint.com/": [ - "pulsepoint.com" - ] - } - }, - { - "quadrantOne": { - "http://www.quadrantone.com/": [ - "quadrantone.com" - ] - } - }, - { - "Quake Marketing": { - "http://quakemarketing.com/": [ - "quakemarketing.com" - ] - } - }, - { - "Quantcast": { - "http://www.quantcast.com/": [ - "quantcast.com", - "quantcount.com", - "quantserve.com" - ] - } - }, - { - "QuantumAdvertising": { - "http://quantum-advertising.com": [ - "quantum-advertising.com" - ] - } - }, - { - "QuinStreet": { - "http://quinstreet.com/": [ - "qnsr.com", - "qsstats.com", - "quinstreet.com" - ] - } - }, - { - "QUISMA": { - "https://quisma.com/": [ - "iaded.com", - "quisma.com", - "quismatch.com", - "xaded.com", - "xmladed.com" - ] - } - }, - { - "Radial": { - "https://www.radial.com": [ - "gsicommerce.com", - "gsimedia.net" - ] - } - }, - { - "Radiate Media": { - "http://www.radiatemedia.com/": [ - "matchbin.com", - "radiatemedia.com" - ] - } - }, - { - "RadiumOne": { - "http://www.radiumone.com/": [ - "gwallet.com", - "radiumone.com" - ] - } - }, - { - "Radius Marketing": { - "http://www.radiusmarketing.com/": [ - "radiusmarketing.com" - ] - } - }, - { - "Rambler": { - "http://www.rambler.ru/": [ - "rambler.ru" - ] - } - }, - { - "Rapleaf": { - "http://www.rapleaf.com/": [ - "rapleaf.com", - "rlcdn.com" - ] - } - }, - { - "ReachLocal": { - "http://www.reachlocal.com/": [ - "reachlocal.com", - "rlcdn.net" - ] - } - }, - { - "React2Media": { - "http://www.react2media.com/": [ - "react2media.com" - ] - } - }, - { - "Redux Media": { - "http://reduxmedia.com/": [ - "reduxmedia.com" - ] - } - }, - { - "Rekko": { - "http://rekko.com/": [ - "convertglobal.com", - "rekko.com" - ] - } - }, - { - "Reklamport": { - "http://www.reklamport.com/": [ - "reklamport.com" - ] - } - }, - { - "Reklam Store": { - "http://reklamstore.com/": [ - "reklamstore.com" - ] - } - }, - { - "Reklamz": { - "http://www.reklamz.com/": [ - "reklamz.com" - ] - } - }, - { - "Relevad": { - "http://www.relevad.com/": [ - "relestar.com", - "relevad.com" - ] - } - }, - { - "Renegade Internet": { - "http://www.renegadeinternet.com/": [ - "advertserve.com", - "renegadeinternet.com" - ] - } - }, - { - "Reporo": { - "http://www.reporo.com/": [ - "buzzcity.com" - ] - } - }, - { - "ResolutionMedia": { - "https://nonstoppartner.net/": [ - "nonstoppartner.net" - ] - } - }, - { - "Resolution Media": { - "http://resolutionmedia.com/": [ - "resolutionmedia.com" - ] - } - }, - { - "Resonate": { - "http://www.resonateinsights.com/": [ - "reson8.com", - "resonateinsights.com", - "resonatenetworks.com" - ] - } - }, - { - "Responsys": { - "http://www.responsys.com/": [ - "responsys.com" - ] - } - }, - { - "ReTargeter": { - "http://www.retargeter.com/": [ - "retargeter.com" - ] - } - }, - { - "Retirement Living": { - "www.retirement-living.com/": [ - "blvdstatus.com", - "retirement-living.com" - ] - } - }, - { - "RevContent": { - "http://revcontent.com/": [ - "revcontent.com" - ] - } - }, - { - "RevenueMax": { - "http://revenuemax.de/": [ - "revenuemax.de" - ] - } - }, - { - "Rhythm": { - "http://rhythmnewmedia.com/": [ - "1rx.io", - "rhythmnewmedia.com", - "rhythmone.com", - "rhythmxchange.com", - "rnmd.net" - ] - } - }, - { - "RichAudience": { - "https://richaudience.com/": [ - "richaudience.com" - ] - } - }, - { - "RichRelevance": { - "http://www.richrelevance.com/": [ - "richrelevance.com" - ] - } - }, - { - "RightAction": { - "http://rightaction.com/": [ - "rightaction.com" - ] - } - }, - { - "RMBN": { - "http://rmbn.net/": [ - "rmbn.net", - "rmbn.ru" - ] - } - }, - { - "RMM": { - "http://www.rmmonline.com/": [ - "rmmonline.com" - ] - } - }, - { - "Rocket Fuel": { - "http://rocketfuel.com/": [ - "rfihub.com", - "rfihub.net", - "rocketfuel.com", - "ru4.com", - "xplusone.com" - ] - } - }, - { - "Rovion": { - "http://www.rovion.com/": [ - "rovion.com" - ] - } - }, - { - "rtk": { - "http://rtk.io/": [ - "rtk.io" - ] - } - }, - { - "RubiconProject": { - "http://rubiconproject.com/": [ - "adsbyisocket.com", - "isocket.com", - "rubiconproject.com" - ] - } - }, - { - "RunAds": { - "http://www.runads.com/": [ - "runads.com", - "rundsp.com" - ] - } - }, - { - "RuTarget": { - "http://www.rutarget.ru/": [ - "rutarget.ru" - ] - } - }, - { - "Sabavision": { - "http://www.sabavision.com": [ - "sabavision.com" - ] - } - }, - { - "Sabre": { - "http://www.sabre.com/": [ - "reztrack.com", - "sabre.com", - "sabrehospitality.com" - ] - } - }, - { - "Salesforce.com": { - "http://www.salesforce.com/": [ - "salesforce.com" - ] - } - }, - { - "Samurai Factory": { - "http://www.samurai-factory.jp/": [ - "samurai-factory.jp", - "shinobi.jp" - ] - } - }, - { - "SAP": { - "https://www.sap.com": [ - "seewhy.com" - ] - } - }, - { - "Sapient": { - "http://www.sapient.com/": [ - "bridgetrack.com", - "sapient.com" - ] - } - }, - { - "SAS": { - "http://www.sas.com/": [ - "aimatch.com", - "sas.com" - ] - } - }, - { - "Scandinavian AdNetworks": { - "http://www.scandinavianadnetworks.com/": [ - "scandinavianadnetworks.com" - ] - } - }, - { - "Scribol": { - "http://scribol.com/": [ - "scribol.com" - ] - } - }, - { - "SearchForce": { - "http://www.searchforce.com/": [ - "searchforce.com", - "searchforce.net" - ] - } - }, - { - "Seevast": { - "http://www.seevast.com/": [ - "kanoodle.com", - "pulse360.com", - "seevast.com", - "syndigonetworks.com" - ] - } - }, - { - "Selectable Media": { - "http://selectablemedia.com/": [ - "nabbr.com", - "selectablemedia.com" - ] - } - }, - { - "Semantiqo": { - "http://semantiqo.com/": [ - "semantiqo.com" - ] - } - }, - { - "Semasio": { - "http://www.semasio.com/": [ - "semasio.com", - "semasio.net" - ] - } - }, - { - "SevenAds": { - "http://www.sevenads.net/": [ - "sevenads.net" - ] - } - }, - { - "SexInYourCity": { - "http://www.sexinyourcity.com/": [ - "sexinyourcity.com" - ] - } - }, - { - "ShaftTraffic": { - "https://shafttraffic.com": [ - "libertystmedia.com" - ] - } - }, - { - "ShareASale": { - "http://www.shareasale.com/": [ - "shareasale.com" - ] - } - }, - { - "Sharethrough": { - "http://sharethrough.com/": [ - "sharethrough.com" - ] - } - }, - { - "Shopzilla": { - "http://www.shopzilla.com/": [ - "shopzilla.com" - ] - } - }, - { - "Shortest": { - "http://shorte.st/": [ - "shorte.st" - ] - } - }, - { - "Silverpop": { - "http://www.silverpop.com/": [ - "mkt51.net", - "pages05.net", - "silverpop.com", - "vtrenz.net" - ] - } - }, - { - "Simpli.fi": { - "http://www.simpli.fi/": [ - "simpli.fi" - ] - } - }, - { - "SiteScout": { - "http://www.sitescout.com/": [ - "sitescout.com" - ] - } - }, - { - "Skimlinks": { - "http://skimlinks.com/": [ - "skimlinks.com", - "skimresources.com" - ] - } - }, - { - "Skupe Net": { - "http://www.skupenet.com/": [ - "adcentriconline.com", - "skupenet.com" - ] - } - }, - { - "Smaato": { - "http://www.smaato.com/": [ - "smaato.com" - ] - } - }, - { - "SmartAdServer": { - "http://smartadserver.com/": [ - "smartadserver.com" - ] - } - }, - { - "SmartyAds": { - "https://smartyads.com/": [ - "smartyads.com" - ] - } - }, - { - "Smiley Media": { - "http://www.smileymedia.com/": [ - "smileymedia.com" - ] - } - }, - { - "Smowtion": { - "http://smowtion.com/": [ - "smowtion.com" - ] - } - }, - { - "Snap": { - "http://www.snap.com/": [ - "snap.com" - ] - } - }, - { - "SocialChorus": { - "http://www.socialchorus.com/": [ - "halogenmediagroup.com", - "halogennetwork.com", - "socialchorus.com" - ] - } - }, - { - "SocialInterface": { - "http://socialinterface.com/": [ - "ratevoice.com", - "socialinterface.com" - ] - } - }, - { - "SocialTwist": { - "http://tellafriend.socialtwist.com/": [ - "socialtwist.com" - ] - } - }, - { - "sociomantic labs": { - "http://www.sociomantic.com/": [ - "sociomantic.com" - ] - } - }, - { - "Socital": { - "https://www.socital.com": [ - "socital.com" - ] - } - }, - { - "Sojern": { - "https://www.sojern.com": [ - "sojern.com" - ] - } - }, - { - "SomoAudience": { - "https://somoaudience.com/": [ - "somoaudience.com" - ] - } - }, - { - "Sonobi": { - "http://sonobi.com/": [ - "sonobi.com" - ] - } - }, - { - "sophus3": { - "http://www.sophus3.com/": [ - "sophus3.co.uk", - "sophus3.com" - ] - } - }, - { - "Sortable": { - "https://www.sortable.com/": [ - "deployads.com" - ] - } - }, - { - "Sovrn": { - "https://www.sovrn.com/": [ - "sovrn.com" - ] - } - }, - { - "Space Chimp Media": { - "http://spacechimpmedia.com/": [ - "spacechimpmedia.com" - ] - } - }, - { - "Sparklit": { - "http://www.sparklit.com/": [ - "adbutler.com", - "sparklit.com" - ] - } - }, - { - "Spark Studios": { - "http://www.sparkstudios.com/": [ - "sparkstudios.com" - ] - } - }, - { - "Specific Media": { - "http://www.specificmedia.com/": [ - "adviva.co.uk", - "adviva.net", - "sitemeter.com", - "specificclick.net", - "specificmedia.co.uk", - "specificmedia.com" - ] - } - }, - { - "Spectate": { - "http://spectate.com/": [ - "spectate.com" - ] - } - }, - { - "Sponge": { - "http://spongegroup.com/": [ - "spongegroup.com" - ] - } - }, - { - "Spongecell": { - "http://www.spongecell.com/": [ - "spongecell.com" - ] - } - }, - { - "SponsorAds": { - "http://www.sponsorads.de/": [ - "sponsorads.de" - ] - } - }, - { - "Spot200": { - "http://spot200.com/": [ - "spot200.com" - ] - } - }, - { - "SpotX": { - "https://www.spotx.tv": [ - "spotx.tv" - ] - } - }, - { - "SpotXchange": { - "http://www.spotxchange.com/": [ - "spotxchange.com" - ] - } - }, - { - "SpringServe": { - "https://springserve.com/": [ - "springserve.com" - ] - } - }, - { - "StackAdapt": { - "https://www.stackadapt.com/": [ - "stackadapt.com" - ] - } - }, - { - "StarGames": { - "https://www.stargames.net/": [ - "stargamesaffiliate.com" - ] - } - }, - { - "SteelHouse": { - "http://www.steelhouse.com/": [ - "steelhouse.com", - "steelhousemedia.com" - ] - } - }, - { - "Storygize": { - "http://www.storygize.com/": [ - "storygize.com", - "storygize.net" - ] - } - }, - { - "Streamray": { - "http://streamray.com/": [ - "cams.com", - "streamray.com" - ] - } - }, - { - "StrikeAd": { - "http://www.strikead.com/": [ - "strikead.com" - ] - } - }, - { - "StrongMail": { - "http://www.strongmail.com/": [ - "popularmedia.com" - ] - } - }, - { - "Struq": { - "http://struq.com/": [ - "struq.com" - ] - } - }, - { - "Sublime Skinz": { - "http://sublime.xyz/": [ - "ayads.co", - "sublime.xyz" - ] - } - }, - { - "Suite 66": { - "http://www.suite66.com/": [ - "suite66.com" - ] - } - }, - { - "Summit": { - "http://www.summit.co.uk/": [ - "summitmedia.co.uk" - ] - } - }, - { - "Superfish": { - "http://www.superfish.com/": [ - "superfish.com" - ] - } - }, - { - "SupersonicAds": { - "http://www.supersonicads.com/": [ - "supersonicads.com" - ] - } - }, - { - "Survata": { - "https://www.survata.com/": [ - "survata.com" - ] - } - }, - { - "Switch": { - "http://www.switchconcepts.com/": [ - "ethicalads.net", - "switchadhub.com", - "switchconcepts.co.uk", - "switchconcepts.com" - ] - } - }, - { - "Swoop": { - "http://swoop.com/": [ - "swoop.com" - ] - } - }, - { - "SymphonyAM": { - "http://www.factortg.com/": [ - "factortg.com" - ] - } - }, - { - "Syncapse": { - "http://www.syncapse.com/": [ - "clickable.net", - "syncapse.com" - ] - } - }, - { - "Syrup Ad": { - "http://adotsolution.com/": [ - "adotsolution.com" - ] - } - }, - { - "Taboola": { - "https://www.taboola.com/": [ - "perfectmarket.com", - "taboola.com" - ] - } - }, - { - "Tailsweep": { - "http://www.tailsweep.com/": [ - "tailsweep.com" - ] - } - }, - { - "Taleria": { - "https://outstream.telaria.com/": [ - "freeskreen.com" - ] - } - }, - { - "Tapad": { - "http://www.tapad.com/": [ - "tapad.com" - ] - } - }, - { - "Tapgage": { - "http://www.tapgage.com/": [ - "bizmey.com", - "tapgage.com" - ] - } - }, - { - "TapIt!": { - "http://tapit.com/": [ - "tapit.com" - ] - } - }, - { - "Tap.me": { - "http://tap.me/": [ - "tap.me" - ] - } - }, - { - "Targetix": { - "http://targetix.net/": [ - "targetix.net" - ] - } - }, - { - "Tatto Media": { - "http://tattomedia.com/": [ - "quicknoodles.com", - "tattomedia.com" - ] - } - }, - { - "Teadma": { - "http://www.teadma.com/": [ - "teadma.com" - ] - } - }, - { - "Teads.tv": { - "http://teads.tv/": [ - "ebuzzing.com", - "teads.tv" - ] - } - }, - { - "Technorati": { - "http://technorati.com/": [ - "technorati.com", - "technoratimedia.com" - ] - } - }, - { - "TellApart": { - "http://tellapart.com/": [ - "tellapart.com", - "tellapt.com" - ] - } - }, - { - "Telstra": { - "http://www.telstra.com.au/": [ - "sensis.com.au", - "sensisdata.com.au", - "sensisdigitalmedia.com.au", - "telstra.com.au" - ] - } - }, - { - "Terra": { - "http://www.terra.com.br/": [ - "eztargetmedia.com", - "terra.com.br" - ] - } - }, - { - "The Numa Group": { - "http://www.thenumagroup.com/": [ - "hittail.com", - "thenumagroup.com" - ] - } - }, - { - "The Search Agency": { - "http://www.thesearchagency.com/": [ - "thesearchagency.com", - "thesearchagency.net" - ] - } - }, - { - "The Trade Desk": { - "http://thetradedesk.com/": [ - "adsrvr.org", - "thetradedesk.com" - ] - } - }, - { - "Think Realtime": { - "http://www.thinkrealtime.com/": [ - "echosearch.com", - "esm1.net", - "thinkrealtime.com" - ] - } - }, - { - "Tinder": { - "http://tinder.com/": [ - "carbonads.com", - "tinder.com" - ] - } - }, - { - "TiqIQ": { - "http://www.tiqiq.com/": [ - "tiqiq.com" - ] - } - }, - { - "Tisoomi": { - "http://www.tisoomi.com/": [ - "adternal.com", - "tisoomi.com" - ] - } - }, - { - "TLVMedia": { - "http://tlvmedia.com/": [ - "tlvmedia.com" - ] - } - }, - { - "Todacell": { - "http://www.todacell.com/": [ - "todacell.com" - ] - } - }, - { - "ToneFuse": { - "http://tonefuse.com/": [ - "tonefuse.com" - ] - } - }, - { - "ToneMedia": { - "http://tonemedia.com/": [ - "clickfuse.com", - "tonemedia.com" - ] - } - }, - { - "TouchCommerce": { - "http://www.touchcommerce.com/": [ - "inq.com", - "touchcommerce.com" - ] - } - }, - { - "TrackingSoft": { - "http://trackingsoft.com/": [ - "trackingsoft.com" - ] - } - }, - { - "Tradedoubler": { - "http://www.tradedoubler.com/": [ - "tradedoubler.com" - ] - } - }, - { - "TradeTracker": { - "http://www.tradetracker.com/": [ - "tradetracker.com", - "tradetracker.net" - ] - } - }, - { - "TrafficHaus": { - "http://www.traffichaus.com/": [ - "traffichaus.com", - "traffichouse.com" - ] - } - }, - { - "TrafficRevenue": { - "http://www.trafficrevenue.net/": [ - "trafficrevenue.net" - ] - } - }, - { - "Traffiq": { - "http://www.traffiq.com/": [ - "traffiq.com" - ] - } - }, - { - "Trafmag": { - "http://trafmag.com/": [ - "trafmag.com" - ] - } - }, - { - "Traverse": { - "http://www.traversedata.com/": [ - "traversedlp.com" - ] - } - }, - { - "Travora Media": { - "http://www.travoramedia.com/": [ - "traveladnetwork.com", - "traveladvertising.com", - "travoramedia.com" - ] - } - }, - { - "Tremor Video": { - "http://www.tremorvideo.com/": [ - "scanscout.com", - "tmnetads.com", - "tremorhub.com", - "tremormedia.com", - "tremorvideo.com" - ] - } - }, - { - "Triggit": { - "http://triggit.com/": [ - "triggit.com" - ] - } - }, - { - "TripleLift": { - "http://triplelift.com/": [ - "3lift.com", - "triplelift.com" - ] - } - }, - { - "TruEffect": { - "http://www.trueffect.com/": [ - "adlegend.com", - "trueffect.com" - ] - } - }, - { - "TrustX": { - "https://trustx.org/": [ - "trustx.org" - ] - } - }, - { - "TubeMogul": { - "http://www.tubemogul.com/": [ - "tmogul.com", - "tubemogul.com" - ] - } - }, - { - "Twelvefold": { - "http://www.twelvefold.com/": [ - "buzzlogic.com", - "twelvefold.com" - ] - } - }, - { - "Twitter": { - "https://twitter.com/": [ - "ads-twitter.com" - ] - } - }, - { - "Twyn Group": { - "http://www.twyn.com/": [ - "twyn-group.com", - "twyn.com" - ] - } - }, - { - "Tyroo": { - "http://www.tyroo.com/": [ - "tyroo.com" - ] - } - }, - { - "ucfunnel": { - "https://www.ucfunnel.com/": [ - "aralego.com", - "ucfunnel.com" - ] - } - }, - { - "uCoz": { - "http://www.ucoz.com/": [ - "ucoz.ae", - "ucoz.br", - "ucoz.com", - "ucoz.du", - "ucoz.fr", - "ucoz.net", - "ucoz.ru" - ] - } - }, - { - "Unanimis": { - "http://www.unanimis.co.uk/": [ - "unanimis.co.uk" - ] - } - }, - { - "Underdog Media": { - "http://www.underdogmedia.com/": [ - "udmserve.net", - "underdogmedia.com" - ] - } - }, - { - "Undertone": { - "http://www.undertone.com/": [ - "undertone.com", - "undertonenetworks.com", - "undertonevideo.com" - ] - } - }, - { - "UniQlick": { - "http://www.uniqlick.com/": [ - "51network.com", - "uniqlick.com", - "wanmo.com" - ] - } - }, - { - "Unruly": { - "https://unruly.co/": [ - "unrulymedia.com" - ] - } - }, - { - "Upland": { - "https://uplandsoftware.com/": [ - "leadlander.com", - "trackalyzer.com" - ] - } - }, - { - "up-value": { - "http://www.up-value.de/": [ - "up-value.de" - ] - } - }, - { - "Value Ad": { - "http://valuead.com/": [ - "valuead.com" - ] - } - }, - { - "Various": { - "http://www.various.com/": [ - "amigos.com", - "getiton.com", - "medley.com", - "nostringsattached.com", - "various.com" - ] - } - }, - { - "Vdopia": { - "http://www.vdopia.com/": [ - "ivdopia.com", - "vdopia.com" - ] - } - }, - { - "Veeseo": { - "http://veeseo.com": [ - "veeseo.com" - ] - } - }, - { - "Velocity Media": { - "http://adsvelocity.com/": [ - "adsvelocity.com" - ] - } - }, - { - "Velti": { - "http://www.velti.com/": [ - "mobclix.com", - "velti.com" - ] - } - }, - { - "Vemba": { - "https://www.vemba.com/": [ - "vemba.com" - ] - } - }, - { - "Venatus Media": { - "http://venatusmedia.com": [ - "venatusmedia.com" - ] - } - }, - { - "Vendemore": { - "https://vendemore.com/": [ - "vendemore.com" - ] - } - }, - { - "Vendio": { - "http://www.vendio.com/": [ - "singlefeed.com", - "vendio.com" - ] - } - }, - { - "Veoxa": { - "http://www.veoxa.com/": [ - "veoxa.com" - ] - } - }, - { - "Veremedia": { - "http://www.veremedia.com/": [ - "veremedia.com" - ] - } - }, - { - "VerticalHealth": { - "https://www.verticalhealth.com/": [ - "verticalhealth.net" - ] - } - }, - { - "VerticalResponse": { - "http://www.verticalresponse.com/": [ - "verticalresponse.com", - "vresp.com" - ] - } - }, - { - "Vibrant Media": { - "http://www.vibrantmedia.com/": [ - "intellitxt.com", - "picadmedia.com", - "vibrantmedia.com" - ] - } - }, - { - "VideoIntelligence": { - "https://www.vi.ai/": [ - "vi.ai" - ] - } - }, - { - "VigLink": { - "http://www.viglink.com/": [ - "viglink.com" - ] - } - }, - { - "VisibleBrands": { - "http://www.visbrands.com/": [ - "visbrands.com" - ] - } - }, - { - "Visible Measures": { - "http://www.visiblemeasures.com/": [ - "viewablemedia.net", - "visiblemeasures.com" - ] - } - }, - { - "VisualDNA": { - "http://www.visualdna.com/": [ - "vdna-assets.com", - "visualdna-stats.com", - "visualdna.com" - ] - } - }, - { - "Vizu": { - "http://www.vizu.com/": [ - "vizu.com" - ] - } - }, - { - "Vizury": { - "http://www.vizury.com/": [ - "vizury.com" - ] - } - }, - { - "Vserv": { - "http://www.vserv.com/": [ - "vserv.com", - "vserv.mobi" - ] - } - }, - { - "Vuble": { - "https://vuble.tv/us/": [ - "mediabong.com" - ] - } - }, - { - "Wahoha": { - "http://wahoha.com/": [ - "contentwidgets.net", - "wahoha.com" - ] - } - }, - { - "Wayfair": { - "https://www.wayfair.com/": [ - "wayfair.com" - ] - } - }, - { - "WebAds": { - "http://www.webads.co.uk/": [ - "webads.co.uk" - ] - } - }, - { - "Web.com": { - "http://www.web.com/": [ - "feedperfect.com", - "web.com" - ] - } - }, - { - "WebGozar.com": { - "http://www.webgozar.com/": [ - "webgozar.com", - "webgozar.ir" - ] - } - }, - { - "Webmecanik": { - "https://www.webmecanik.com/": [ - "webmecanik.com" - ] - } - }, - { - "WebMetro": { - "http://www.webmetro.com/": [ - "dsmmadvantage.com", - "webmetro.com" - ] - } - }, - { - "Weborama": { - "http://weborama.com/": [ - "weborama.com", - "weborama.fr" - ] - } - }, - { - "Webtraffic": { - "http://www.webtraffic.se/": [ - "webtraffic.no", - "webtraffic.se" - ] - } - }, - { - "WideOrbit": { - "https://www.wideorbit.com/": [ - "dep-x.com" - ] - } - }, - { - "WiredMinds": { - "http://www.wiredminds.com/": [ - "wiredminds.com", - "wiredminds.de" - ] - } - }, - { - "Wishabi": { - "http://wishabi.com": [ - "wishabi.com", - "wishabi.net" - ] - } - }, - { - "WordStream": { - "http://www.wordstream.com/": [ - "wordstream.com" - ] - } - }, - { - "WPP": { - "http://www.wpp.com/": [ - "247realmedia.com", - "accelerator-media.com", - "acceleratorusa.com", - "decdna.net", - "decideinteractive.com", - "gmads.net", - "groupm.com", - "kantarmedia.com", - "mecglobal.com", - "mindshare.nl", - "mookie1.com", - "pm14.com", - "realmedia.com", - "targ.ad", - "themig.com", - "wpp.com", - "xaxis.com" - ] - } - }, - { - "xAd": { - "http://www.xad.com/": [ - "xad.com" - ] - } - }, - { - "Xertive Media": { - "http://www.xertivemedia.com/": [ - "admanager-xertive.com", - "xertivemedia.com" - ] - } - }, - { - "xplosion interactive": { - "http://www.xplosion.de/": [ - "xplosion.de" - ] - } - }, - { - "Xrost DS": { - "http://www.adplan-ds.com/": [ - "adplan-ds.com" - ] - } - }, - { - "Yabuka": { - "http://www.yabuka.com/": [ - "yabuka.com" - ] - } - }, - { - "Yahoo!": { - "http://www.yahoo.com/": [ - "adinterax.com", - "adrevolver.com", - "ads.yahoo.com", - "adserver.yahoo.com", - "advertising.yahoo.com", - "bluelithium.com", - "dapper.net", - "flurry.com", - "interclick.com", - "marketingsolutions.yahoo.com", - "overture.com", - "rightmedia.com", - "rmxads.com", - "secure-adserver.com", - "thewheelof.com", - "yieldmanager.com", - "yieldmanager.net", - "yldmgrimg.net" - ] - } - }, - { - "Yandex": { - "http://www.yandex.com/": [ - "adfox.yandex.ru", - "an.yandex.ru", - "awaps.yandex.ru", - "mc.yandex.ru", - "moikrug.ru", - "web-visor.com", - "yandex.ru/clck/click", - "yandex.ru/clck/counter", - "yandex.ru/cycounter", - "yandex.ru/portal/set/any", - "yandex.ru/set/s/rsya-tag-users/data" - ] - } - }, - { - "Ybrant Digital": { - "http://www.ybrantdigital.com/": [ - "addynamix.com", - "adserverplus.com", - "oridian.com", - "ybrantdigital.com" - ] - } - }, - { - "YD": { - "http://www.ydworld.com/": [ - "ydworld.com", - "yieldivision.com" - ] - } - }, - { - "YellowHammer": { - "http://www.yhmg.com/": [ - "attracto.com", - "clickhype.com", - "yellowhammermg.com", - "yhmg.com" - ] - } - }, - { - "Yes Ads": { - "http://yesads.com/": [ - "yesads.com" - ] - } - }, - { - "YieldAds": { - "http://yieldads.com/": [ - "yieldads.com" - ] - } - }, - { - "YieldBids": { - "http://ybx.io/": [ - "ybx.io" - ] - } - }, - { - "YieldBot": { - "http://yieldbot.com/": [ - "yldbt.com" - ] - } - }, - { - "YieldBuild": { - "http://yieldbuild.com/": [ - "yieldbuild.com" - ] - } - }, - { - "Yieldify": { - "https://www.yieldify.com/": [ - "yieldify.com" - ] - } - }, - { - "Yieldlab": { - "http://www.yieldlab.de/": [ - "yieldlab.de", - "yieldlab.net" - ] - } - }, - { - "Yieldmo": { - "https://yieldmo.com": [ - "yieldmo.com" - ] - } - }, - { - "YieldNexus": { - "https://www.yieldnexus.com/": [ - "ynxs.io" - ] - } - }, - { - "YOC": { - "http://group.yoc.com/": [ - "yoc-performance.com", - "yoc.com" - ] - } - }, - { - "Yoggrt": { - "http://www.yoggrt.com/": [ - "yoggrt.com" - ] - } - }, - { - "youknowbest": { - "http://www.youknowbest.com/": [ - "youknowbest.com" - ] - } - }, - { - "YuMe": { - "http://www.yume.com/": [ - "yume.com", - "yumenetworks.com" - ] - } - }, - { - "ZafulAffiliate": { - "https://affiliate.zaful.com/": [ - "affasi.com", - "gw-ec.com", - "zaful.com" - ] - } - }, - { - "Zango": { - "http://www.zango.com/": [ - "metricsdirect.com", - "zango.com" - ] - } - }, - { - "zanox": { - "http://www.zanox.com/": [ - "buy.at", - "zanox-affiliate.de", - "zanox.com" - ] - } - }, - { - "zapunited": { - "http://www.zapunited.com/": [ - "zaparena.com", - "zapunited.com" - ] - } - }, - { - "ZEDO": { - "http://www.zedo.com/": [ - "zedo.com", - "zincx.com" - ] - } - }, - { - "Zefir": { - "https://ze-fir.com/": [ - "ze-fir.com" - ] - } - }, - { - "Zemanta": { - "http://www.zemanta.com/": [ - "zemanta.com" - ] - } - }, - { - "ZestAd": { - "http://www.zestad.com/": [ - "zestad.com" - ] - } - }, - { - "Zeta Email Solutions": { - "http://www.zetaemailsolutions.com/": [ - "insightgrit.com", - "zetaemailsolutions.com" - ] - } - }, - { - "Zumobi": { - "http://www.zumobi.com/": [ - "zumobi.com" - ] - } - }, - { - "ZypMedia": { - "http://www.zypmedia.com/": [ - "extend.tv", - "zypmedia.com" - ] - } - } - ], - "Content": [ - { - "33Across": { - "http://33across.com/": [ - "tynt.com" - ] - } - }, - { - "ActivEngage": { - "http://www.activengage.com/": [ - "activengage.com" - ] - } - }, - { - "Adap.tv": { - "http://adap.tv/": [ - "adap.tv" - ] - } - }, - { - "Adobe": { - "http://www.adobe.com/": [ - "adobe.com", - "fyre.co", - "livefyre.com", - "typekit.com" - ] - } - }, - { - "Akamai": { - "http://www.akamai.com/": [ - "abmr.net", - "akamai.com", - "edgesuite.net" - ] - } - }, - { - "AKQA": { - "http://www.akqa.com/": [ - "akqa.com", - "srtk.net" - ] - } - }, - { - "Amazon.com": { - "http://www.amazon.com/": [ - "alexa.com", - "amazon.com", - "cloudfront.net" - ] - } - }, - { - "AOL": { - "http://www.aol.com/": [ - "5min.com", - "aim.com", - "aol.com", - "aolanswers.com", - "aolcdn.com", - "aoltechguru.com", - "autoblog.com", - "cambio.com", - "dailyfinance.com", - "editions.com", - "engadget.com", - "games.com", - "homesessive.com", - "huffingtonpost.com", - "joystiq.com", - "kitchendaily.com", - "makers.com", - "mandatory.com", - "mapquest.com", - "moviefone.com", - "noisecreep.com", - "patch.com", - "pawnation.com", - "shortcuts.com", - "shoutcast.com", - "spinner.com", - "stylelist.com", - "stylemepretty.com", - "surphace.com", - "techcrunch.com", - "theboombox.com", - "theboot.com", - "tuaw.com", - "userplane.com", - "winamp.com" - ] - } - }, - { - "Automattic": { - "http://automattic.com/": [ - "automattic.com", - "gravatar.com", - "intensedebate.com" - ] - } - }, - { - "Baynote": { - "http://www.baynote.com/": [ - "baynote.com", - "baynote.net" - ] - } - }, - { - "Bazaarvoice": { - "http://www.bazaarvoice.com/": [ - "bazaarvoice.com" - ] - } - }, - { - "BigDoor": { - "http://www.bigdoor.com/": [ - "bigdoor.com", - "onetruefan.com" - ] - } - }, - { - "Brightcove": { - "http://www.brightcove.com/": [ - "brightcove.com" - ] - } - }, - { - "Browser-Update.org": { - "www.browser-update.org/": [ - "browser-update.org" - ] - } - }, - { - "BTBuckets": { - "http://btbuckets.com/": [ - "btbuckets.com" - ] - } - }, - { - "Buffer": { - "http://bufferapp.com/": [ - "bufferapp.com" - ] - } - }, - { - "Bunchball": { - "http://www.bunchball.com/": [ - "bunchball.com" - ] - } - }, - { - "buySAFE": { - "http://www.buysafe.com/": [ - "buysafe.com" - ] - } - }, - { - "BuzzFeed": { - "http://www.buzzfeed.com/": [ - "buzzfed.com", - "buzzfeed.com" - ] - } - }, - { - "Cbox": { - "http://www.cbox.ws/": [ - "cbox.ws" - ] - } - }, - { - "CBS Interactive": { - "http://www.cbsinteractive.com/": [ - "cbsinteractive.com", - "com.com" - ] - } - }, - { - "Cedexis": { - "http://www.cedexis.com/": [ - "cedexis.com", - "cedexis.net" - ] - } - }, - { - "Certona": { - "http://www.certona.com/": [ - "certona.com", - "res-x.com" - ] - } - }, - { - "ClipSyndicate": { - "http://www.clipsyndicate.com/": [ - "clipsyndicate.com" - ] - } - }, - { - "Collarity": { - "http://www.collarity.com/": [ - "collarity.com" - ] - } - }, - { - "Conduit": { - "http://www.conduit.com/": [ - "conduit-banners.com", - "conduit-services.com", - "conduit.com", - "wibiya.com" - ] - } - }, - { - "Congoo": { - "http://www.congoo.com/": [ - "congoo.com" - ] - } - }, - { - "Contact At Once!": { - "http://www.contactatonce.com/": [ - "contactatonce.com" - ] - } - }, - { - "Conviva": { - "http://www.conviva.com/": [ - "conviva.com" - ] - } - }, - { - "DailyMe": { - "http://dailyme.com/": [ - "dailyme.com", - "newstogram.com" - ] - } - }, - { - "DataSift": { - "http://datasift.com/": [ - "datasift.com", - "tweetmeme.com" - ] - } - }, - { - "Disqus": { - "http://disqus.com/": [ - "disqus.com" - ] - } - }, - { - "Echo": { - "http://aboutecho.com/": [ - "aboutecho.com", - "haloscan.com", - "js-kit.com" - ] - } - }, - { - "Facebook": { - "http://www.facebook.com/": [ - "fbcdn.net", - "instagram.com", - "messenger.com" - ] - } - }, - { - "Flattr": { - "http://flattr.com/": [ - "flattr.com" - ] - } - }, - { - "FreeWheel": { - "http://www.freewheel.tv/": [ - "freewheel.tv", - "fwmrm.net" - ] - } - }, - { - "Genius.com": { - "http://www.genius.com/": [ - "genius.com" - ] - } - }, - { - "Get Satisfaction": { - "https://getsatisfaction.com/": [ - "getsatisfaction.com" - ] - } - }, - { - "Gigya": { - "http://www.gigya.com/": [ - "gigcount.com", - "gigya.com" - ] - } - }, - { - "Global Takeoff": { - "http://www.globaltakeoff.com/": [ - "globaltakeoff.com", - "globaltakeoff.net" - ] - } - }, - { - "GoGrid": { - "http://www.gogrid.com/": [ - "formalyzer.com", - "gogrid.com", - "komli.net" - ] - } - }, - { - "Google": { - "http://www.google.com/": [ - "accounts.google.com", - "apis.google.com", - "appengine.google.com", - "apture.com", - "blogger.com", - "books.google.com", - "checkout.google.com", - "chrome.google.com", - "code.google.com", - "codesearch.google.com", - "docs.google.com", - "drive.google.com", - "earth.google.com", - "encrypted.google.com", - "feedburner.com", - "feedburner.google.com", - "feedproxy.google.com", - "finance.google.com", - "ggpht.com", - "gmodules.com", - "google-melange.com", - "google.ad", - "google.ae", - "google.al", - "google.am", - "google.as", - "google.at", - "google.az", - "google.ba", - "google.be", - "google.bf", - "google.bg", - "google.bi", - "google.bj", - "google.bs", - "google.bt", - "google.by", - "google.ca", - "google.cat", - "google.cd", - "google.cf", - "google.cg", - "google.ch", - "google.ci", - "google.cl", - "google.cm", - "google.cn", - "google.co.ao", - "google.co.bw", - "google.co.ck", - "google.co.cr", - "google.co.id", - "google.co.il", - "google.co.in", - "google.co.jp", - "google.co.ke", - "google.co.kr", - "google.co.ls", - "google.co.ma", - "google.co.mz", - "google.co.nz", - "google.co.th", - "google.co.tz", - "google.co.ug", - "google.co.uk", - "google.co.uz", - "google.co.ve", - "google.co.vi", - "google.co.za", - "google.co.zm", - "google.co.zw", - "google.com", - "google.com.af", - "google.com.ag", - "google.com.ai", - "google.com.ar", - "google.com.au", - "google.com.bd", - "google.com.bh", - "google.com.bn", - "google.com.bo", - "google.com.br", - "google.com.bz", - "google.com.co", - "google.com.cu", - "google.com.cy", - "google.com.do", - "google.com.ec", - "google.com.eg", - "google.com.et", - "google.com.fj", - "google.com.gh", - "google.com.gi", - "google.com.gt", - "google.com.hk", - "google.com.jm", - "google.com.kh", - "google.com.kw", - "google.com.lb", - "google.com.ly", - "google.com.mm", - "google.com.mt", - "google.com.mx", - "google.com.my", - "google.com.na", - "google.com.nf", - "google.com.ng", - "google.com.ni", - "google.com.np", - "google.com.om", - "google.com.pa", - "google.com.pe", - "google.com.pg", - "google.com.ph", - "google.com.pk", - "google.com.pr", - "google.com.py", - "google.com.qa", - "google.com.sa", - "google.com.sb", - "google.com.sg", - "google.com.sl", - "google.com.sv", - "google.com.tj", - "google.com.tr", - "google.com.tw", - "google.com.ua", - "google.com.uy", - "google.com.vc", - "google.com.vn", - "google.cv", - "google.cz", - "google.de", - "google.dj", - "google.dk", - "google.dm", - "google.dz", - "google.ee", - "google.es", - "google.fi", - "google.fm", - "google.fr", - "google.ga", - "google.ge", - "google.gg", - "google.gl", - "google.gm", - "google.gp", - "google.gr", - "google.gy", - "google.hn", - "google.hr", - "google.ht", - "google.hu", - "google.ie", - "google.im", - "google.iq", - "google.is", - "google.it", - "google.je", - "google.jo", - "google.kg", - "google.ki", - "google.kz", - "google.la", - "google.li", - "google.lk", - "google.lt", - "google.lu", - "google.lv", - "google.md", - "google.me", - "google.mg", - "google.mk", - "google.ml", - "google.mn", - "google.ms", - "google.mu", - "google.mv", - "google.mw", - "google.ne", - "google.nl", - "google.no", - "google.nr", - "google.nu", - "google.pl", - "google.pn", - "google.ps", - "google.pt", - "google.ro", - "google.rs", - "google.ru", - "google.rw", - "google.sc", - "google.se", - "google.sh", - "google.si", - "google.sk", - "google.sm", - "google.sn", - "google.so", - "google.st", - "google.td", - "google.tg", - "google.tk", - "google.tl", - "google.tm", - "google.tn", - "google.to", - "google.tt", - "google.vg", - "google.vu", - "google.ws", - "googleapis.com", - "googleartproject.com", - "googleusercontent.com", - "groups.google.com", - "gstatic.com", - "health.google.com", - "images.google.com", - "investor.google.com", - "knol.google.com", - "maps.google.com", - "music.google.com", - "news.google.com", - "panoramio.com", - "picasa.google.com", - "picasaweb.google.com", - "play.google.com", - "postini.com", - "recaptcha.net", - "script.google.com", - "shopping.google.com", - "sites.google.com", - "sketchup.google.com", - "support.google.com", - "talk.google.com", - "talkgadget.google.com", - "toolbar.google.com", - "translate.google.com", - "trends.google.com", - "video.google.com", - "videos.google.com", - "wallet.google.com", - "youtube.com" - ] - } - }, - { - "Gravity": { - "http://www.gravity.com/": [ - "gravity.com", - "grvcdn.com" - ] - } - }, - { - "Heyzap": { - "http://www.heyzap.com/": [ - "heyzap.com" - ] - } - }, - { - "HubSpot": { - "http://www.hubspot.com/": [ - "hubspot.com" - ] - } - }, - { - "IBM": { - "http://www.ibm.com/": [ - "xtify.com" - ] - } - }, - { - "iovation": { - "http://www.iovation.com/": [ - "iesnare.com", - "iovation.com" - ] - } - }, - { - "Kaltura": { - "http://corp.kaltura.com/": [ - "kaltura.com" - ] - } - }, - { - "kikin": { - "http://www.kikin.com/": [ - "kikin.com" - ] - } - }, - { - "Limelight Networks": { - "http://www.limelight.com/": [ - "clickability.com", - "limelight.com", - "llnwd.net" - ] - } - }, - { - "LivePerson": { - "http://www.liveperson.net/": [ - "liveperson.net" - ] - } - }, - { - "LiveRail": { - "http://liverail.com/": [ - "liverail.com" - ] - } - }, - { - "LongTail Video": { - "http://www.longtailvideo.com/": [ - "longtailvideo.com", - "ltassrv.com" - ] - } - }, - { - "Markit": { - "http://www.markit.com/": [ - "markit.com", - "wsod.com" - ] - } - }, - { - "MashLogic": { - "http://www.mashlogic.com/": [ - "mashlogic.com" - ] - } - }, - { - "McAfee": { - "http://www.mcafee.com/": [ - "mcafee.com", - "scanalert.com" - ] - } - }, - { - "Microsoft": { - "http://www.microsoft.com/": [ - "bing.com", - "gamesforwindows.com", - "getgamesmart.com", - "healthvault.com", - "ieaddons.com", - "iegallery.com", - "live.com", - "microsoft.com", - "microsoftalumni.com", - "microsoftalumni.org", - "microsoftstore.com", - "msn.com", - "msndirect.com", - "office.com", - "officelive.com", - "outlook.com", - "s-msn.com", - "skype.com", - "windowsphone.com", - "worldwidetelescope.org", - "xbox.com", - "zune.com", - "zune.net" - ] - } - }, - { - "NDN": { - "http://www.newsinc.com/": [ - "newsinc.com" - ] - } - }, - { - "Oberon Media": { - "http://www.oberon-media.com/": [ - "blaze.com", - "oberon-media.com" - ] - } - }, - { - "Ooyala": { - "http://www.ooyala.com/": [ - "oo4.com", - "ooyala.com" - ] - } - }, - { - "Oracle": { - "http://www.oracle.com/": [ - "atgsvcs.com", - "instantservice.com", - "istrack.com", - "oracle.com" - ] - } - }, - { - "Peerius": { - "http://www.peerius.com/": [ - "peerius.com" - ] - } - }, - { - "Pinterest": { - "http://pinterest.com/": [ - "pinimg.com", - "pinterest.com" - ] - } - }, - { - "PunchTab": { - "http://www.punchtab.com/": [ - "punchtab.com" - ] - } - }, - { - "RIM": { - "http://www.rim.com/": [ - "rim.com", - "scoreloop.com" - ] - } - }, - { - "Salesforce.com": { - "http://www.salesforce.com/": [ - "salesforceliveagent.com" - ] - } - }, - { - "SAY": { - "http://saymedia.com/": [ - "saymedia.com", - "typepad.com", - "videoegg.com" - ] - } - }, - { - "ScribeFire": { - "http://www.scribefire.com/": [ - "scribefire.com" - ] - } - }, - { - "Six Apart": { - "http://www.sixapart.com/": [ - "sixapart.com" - ] - } - }, - { - "Skribit": { - "http://skribit.com/": [ - "skribit.com" - ] - } - }, - { - "SnapEngage": { - "http://www.snapengage.com/": [ - "snapengage.com" - ] - } - }, - { - "Spring Metrics": { - "http://www.springmetrics.com/": [ - "springmetrics.com" - ] - } - }, - { - "Synacor": { - "http://www.synacor.com/": [ - "synacor.com" - ] - } - }, - { - "ThingLink": { - "http://www.thinglink.com/": [ - "thinglink.com" - ] - } - }, - { - "Thismoment": { - "http://www.thismoment.com/": [ - "thismoment.com" - ] - } - }, - { - "Thummit": { - "http://www.thummit.com/": [ - "thummit.com" - ] - } - }, - { - "Topsy": { - "http://topsy.com/": [ - "topsy.com" - ] - } - }, - { - "TraceMyIP.org": { - "http://www.tracemyip.org/": [ - "tracemyip.org" - ] - } - }, - { - "Trackset": { - "http://www.trackset.com/": [ - "trackset.com" - ] - } - }, - { - "Trovus": { - "http://www.trovus.co.uk/": [ - "trovus.co.uk" - ] - } - }, - { - "Trumba": { - "http://www.trumba.com/": [ - "trumba.com" - ] - } - }, - { - "TRUSTe": { - "http://www.truste.com/": [ - "truste.com" - ] - } - }, - { - "TurnTo": { - "http://www.turntonetworks.com/": [ - "turnto.com", - "turntonetworks.com" - ] - } - }, - { - "Tweetboard": { - "http://tweetboard.com/": [ - "tweetboard.com" - ] - } - }, - { - "Twitter Counter": { - "http://twittercounter.com/": [ - "twittercounter.com" - ] - } - }, - { - "UberMedia": { - "http://ubermedia.com/": [ - "tweetup.com", - "ubermedia.com" - ] - } - }, - { - "UberTags": { - "http://ubertags.com/": [ - "ubertags.com" - ] - } - }, - { - "Unbounce": { - "http://unbounce.com/": [ - "unbounce.com" - ] - } - }, - { - "Uptrends": { - "http://www.uptrends.com/": [ - "uptrends.com" - ] - } - }, - { - "Usability Sciences": { - "http://www.usabilitysciences.com/": [ - "usabilitysciences.com", - "webiqonline.com" - ] - } - }, - { - "UserVoice": { - "http://www.uservoice.com/": [ - "uservoice.com" - ] - } - }, - { - "Vertical Acuity": { - "http://www.verticalacuity.com/": [ - "verticalacuity.com" - ] - } - }, - { - "VG WORT": { - "http://www.vgwort.de/": [ - "vgwort.de" - ] - } - }, - { - "Videology": { - "http://www.videologygroup.com/": [ - "tidaltv.com", - "videologygroup.com" - ] - } - }, - { - "Viewbix": { - "http://www.viewbix.com/": [ - "qoof.com", - "viewbix.com" - ] - } - }, - { - "Vimeo": { - "http://vimeo.com/": [ - "vimeo.com", - "vimeocdn.com" - ] - } - }, - { - "VINDICO": { - "http://vindicogroup.com/": [ - "vindicogroup.com", - "vindicosuite.com" - ] - } - }, - { - "Voice2Page": { - "http://www.voice2page.com/": [ - "voice2page.com" - ] - } - }, - { - "WebsiteAlive": { - "http://www.websitealive.com/": [ - "websitealive.com", - "websitealive0.com", - "websitealive1.com", - "websitealive2.com", - "websitealive3.com", - "websitealive4.com", - "websitealive5.com", - "websitealive6.com", - "websitealive7.com", - "websitealive8.com", - "websitealive9.com" - ] - } - }, - { - "Yahoo!": { - "http://www.yahoo.com/": [ - "answers.yahoo.com", - "apps.yahoo.com", - "autos.yahoo.com", - "biz.yahoo.com", - "developer.yahoo.com", - "everything.yahoo.com", - "finance.yahoo.com", - "flickr.com", - "games.yahoo.com", - "groups.yahoo.com", - "help.yahoo.com", - "hotjobs.yahoo.com", - "info.yahoo.com", - "local.yahoo.com", - "luminate.com", - "messages.yahoo.com", - "movies.yahoo.com", - "msg.yahoo.com", - "news.yahoo.com", - "omg.yahoo.com", - "pipes.yahoo.com", - "pixazza.com", - "realestate.yahoo.com", - "search.yahoo.com", - "shine.yahoo.com", - "smallbusiness.yahoo.com", - "sports.yahoo.com", - "staticflickr.com", - "suggestions.yahoo.com", - "travel.yahoo.com", - "tumblr.com", - "upcoming.yahoo.com", - "webhosting.yahoo.com", - "widgets.yahoo.com", - "www.yahoo.com", - "yahooapis.com", - "yahoofs.com", - "yimg.com", - "ypolicyblog.com", - "yuilibrary.com", - "zenfs.com" - ] - } - }, - { - "Yandex": { - "http://www.yandex.com/": [ - "kinopoisk.ru", - "yandex.by", - "yandex.com", - "yandex.com.tr", - "yandex.ru", - "yandex.st", - "yandex.ua" - ] - } - }, - { - "Zendesk": { - "http://www.zendesk.com/": [ - "zendesk.com" - ] - } - }, - { - "Zopim": { - "https://www.zopim.com/": [ - "zopim.com" - ] - } - } - ], - "Analytics": [ - { - "63 Squares": { - "http://63squares.com/": [ - "63squares.com", - "i-stats.com" - ] - } - }, - { - "Acxiom": { - "http://www.acxiom.com/": [ - "acxiom.com", - "acxiomapac.com", - "mm7.net", - "pippio.com" - ] - } - }, - { - "AddFreeStats": { - "http://www.addfreestats.com/": [ - "3dstats.com", - "addfreestats.com" - ] - } - }, - { - "Adloox": { - "http://www.adloox.com/": [ - "adloox.com", - "adlooxtracking.com" - ] - } - }, - { - "Adventori": { - "https://adventori.com": [ - "adventori.com" - ] - } - }, - { - "AIData": { - "http://www.aidata.me/": [ - "advombat.ru", - "aidata.me" - ] - } - }, - { - "AivaLabs": { - "https://aivalabs.com": [ - "aivalabs.com" - ] - } - }, - { - "Akamai": { - "http://www.akamai.com/": [ - "go-mpulse.net" - ] - } - }, - { - "Amadesa": { - "http://www.amadesa.com/": [ - "amadesa.com" - ] - } - }, - { - "Amazing Counters": { - "http://amazingcounters.com/": [ - "amazingcounters.com" - ] - } - }, - { - "Amazon.com": { - "http://www.amazon.com/": [ - "alexametrics.com" - ] - } - }, - { - "Amplitude": { - "https://amplitude.com/": [ - "amplitude.com" - ] - } - }, - { - "anormal-media.de": { - "http://anormal-media.de/": [ - "anormal-media.de", - "anormal-tracker.de" - ] - } - }, - { - "AT Internet": { - "http://www.atinternet.com/": [ - "at-o.net", - "atinternet.com", - "xiti.com" - ] - } - }, - { - "Attracta": { - "https://www.attracta.com/": [ - "attracta.com" - ] - } - }, - { - "Automattic": { - "http://automattic.com/": [ - "polldaddy.com" - ] - } - }, - { - "AvantLink": { - "http://www.avantlink.com/": [ - "avmws.com" - ] - } - }, - { - "Awio": { - "http://www.awio.com/": [ - "awio.com", - "w3counter.com", - "w3roi.com" - ] - } - }, - { - "Belstat": { - "http://www.belstat.com/": [ - "belstat.be", - "belstat.com", - "belstat.de", - "belstat.fr", - "belstat.nl" - ] - } - }, - { - "BetssonPalantir": { - "https://betssonpalantir.com/": [ - "betssonpalantir.com" - ] - } - }, - { - "BlogCounter.com": { - "http://www.blogcounter.de/": [ - "blogcounter.de" - ] - } - }, - { - "BloomReach": { - "http://www.bloomreach.com/": [ - "p.brsrvr.com" - ] - } - }, - { - "BlueCava": { - "http://www.bluecava.com/": [ - "bluecava.com" - ] - } - }, - { - "Bluemetrix": { - "http://www.bluemetrix.com/": [ - "bluemetrix.com", - "bmmetrix.com" - ] - } - }, - { - "Bombora": { - "https://bombora.com/": [ - "ml314.com" - ] - } - }, - { - "Branch": { - "https://branch.io/": [ - "branch.io" - ] - } - }, - { - "Branica": { - "http://www.branica.com/": [ - "branica.com" - ] - } - }, - { - "BrightEdge": { - "http://www.brightedge.com/": [ - "b0e8.com", - "brightedge.com" - ] - } - }, - { - "Bubblestat": { - "http://www.bubblestat.com/": [ - "bubblestat.com" - ] - } - }, - { - "Cardlytics": { - "http://www.cardlytics.com/": [ - "cardlytics.com" - ] - } - }, - { - "Chartbeat": { - "http://chartbeat.com/": [ - "chartbeat.com", - "chartbeat.net" - ] - } - }, - { - "Clickdensity": { - "http://www.clickdensity.com/": [ - "clickdensity.com" - ] - } - }, - { - "ClickGuard": { - "https://www.clickguard.com/": [ - "clickguard.com" - ] - } - }, - { - "ClickTale": { - "http://www.clicktale.com/": [ - "clicktale.com", - "clicktale.net", - "pantherssl.com" - ], - "session-replay": "true" - } - }, - { - "ClixMetrix": { - "http://www.clixmetrix.com/": [ - "clixmetrix.com" - ] - } - }, - { - "Clixpy": { - "http://clixpy.com/": [ - "clixpy.com" - ] - } - }, - { - "ClustrMaps": { - "http://www.clustrmaps.com/": [ - "clustrmaps.com" - ] - } - }, - { - "CNZZ": { - "http://www.cnzz.com/": [ - "cnzz.com" - ] - } - }, - { - "Compuware": { - "http://www.compuware.com/": [ - "axf8.net", - "compuware.com", - "gomez.com" - ] - } - }, - { - "comScore": { - "http://www.comscore.com/": [ - "certifica.com", - "comscore.com", - "mdotlabs.com", - "scorecardresearch.com", - "sitestat.com", - "voicefive.com" - ] - } - }, - { - "Connexity": { - "http://www.connexity.com/": [ - "connexity.com", - "connexity.net" - ] - } - }, - { - "Convert Insights": { - "http://www.convert.com/": [ - "convert.com", - "reedge.com" - ] - } - }, - { - "Convertro": { - "http://www.convertro.com/": [ - "convertro.com" - ] - } - }, - { - "Crazy Egg": { - "http://www.crazyegg.com/": [ - "cetrk.com", - "crazyegg.com" - ] - } - }, - { - "Crowd Science": { - "http://crowdscience.com/": [ - "crowdscience.com" - ] - } - }, - { - "Cya2": { - "http://cya2.net/": [ - "cya2.net" - ] - } - }, - { - "Dataium": { - "http://www.dataium.com/": [ - "collserve.com", - "dataium.com" - ] - } - }, - { - "Deep Intent": { - "https://www.deepintent.com/": [ - "deepintent.com" - ] - } - }, - { - "Demandbase": { - "http://www.demandbase.com/": [ - "company-target.com", - "demandbase.com" - ] - } - }, - { - "DirectCORP": { - "http://www.directcorp.de/": [ - "ipcounter.de" - ] - } - }, - { - "DistilNetworks": { - "https://www.distilnetworks.com/": [ - "distiltag.com" - ] - } - }, - { - "DoubleVerify": { - "http://www.doubleverify.com/": [ - "doubleverify.com" - ] - } - }, - { - "dwstat.com": { - "http://www.dwstat.cn/": [ - "dwstat.cn" - ] - } - }, - { - "ECSAnalytics": { - "https://www.theecsinc.com/": [ - "ecsanalytics.com" - ] - } - }, - { - "EFF": { - "https://www.eff.org/": [ - "do-not-tracker.org", - "eviltracker.net", - "trackersimulator.org" - ] - } - }, - { - "eProof.com": { - "http://www.eproof.com/": [ - "eproof.com" - ] - } - }, - { - "etracker": { - "http://www.etracker.com/": [ - "etracker.com", - "etracker.de", - "sedotracker.com", - "sedotracker.de" - ] - } - }, - { - "Eulerian Technologies": { - "http://www.eulerian.com/": [ - "eulerian.com", - "eulerian.net" - ] - } - }, - { - "eXTReMe digital": { - "http://extremetracking.com/": [ - "extreme-dm.com", - "extremetracking.com" - ] - } - }, - { - "Eyeota": { - "http://eyeota.net/": [ - "eyeota.net" - ] - } - }, - { - "Feedjit": { - "http://feedjit.com/": [ - "feedjit.com" - ] - } - }, - { - "Flashtalking": { - "http://www.flashtalking.com/": [ - "encoremetrics.com", - "sitecompass.com" - ] - } - }, - { - "Footprint": { - "http://www.footprintlive.com/": [ - "footprintlive.com" - ] - } - }, - { - "Free Online Users": { - "http://www.freeonlineusers.com/": [ - "freeonlineusers.com" - ] - } - }, - { - "Free-PageRank.com": { - "http://www.free-pagerank.com/": [ - "free-pagerank.com" - ] - } - }, - { - "Friends2Follow": { - "https://friends2follow.com/": [ - "antifraudjs.friends2follow.com" - ] - } - }, - { - "Fullstory": { - "https://www.fullstory.com/": [ - "fullstory.com" - ], - "session-replay": "true" - } - }, - { - "GetSiteControl": { - "https://getsitecontrol.com/": [ - "getsitecontrol.com" - ] - } - }, - { - "GfK Group": { - "http://www.gfk.com/": [ - "daphnecm.com", - "gfk.com", - "gfkdaphne.com" - ] - } - }, - { - "GitHub": { - "https://github.com/": [ - "gaug.es" - ] - } - }, - { - "Go Daddy": { - "http://www.godaddy.com/": [ - "godaddy.com", - "trafficfacts.com" - ] - } - }, - { - "Google": { - "http://www.google.com/": [ - "google-analytics.com", - "postrank.com" - ] - } - }, - { - "GoSquared": { - "https://www.gosquared.com/": [ - "gosquared.com" - ] - } - }, - { - "GoStats": { - "http://gostats.com/": [ - "gostats.com" - ] - } - }, - { - "GrapheneMedia": { - "http://graphenemedia.in/": [ - "graphenedigitalanalytics.in" - ] - } - }, - { - "GTop": { - "http://www.gtop.ro/": [ - "gtop.ro", - "gtopstats.com" - ] - } - }, - { - "Hearst": { - "http://www.hearst.com/": [ - "raasnet.com", - "redaril.com" - ] - } - }, - { - "Histats": { - "http://www.histats.com/": [ - "histats.com" - ] - } - }, - { - "HitsLink": { - "http://www.hitslink.com/": [ - "hitslink.com" - ] - } - }, - { - "Hit Sniffer": { - "http://www.hitsniffer.com/": [ - "hitsniffer.com" - ] - } - }, - { - "Hotjar": { - "https://www.hotjar.com": [ - "hotjar.com" - ] - } - }, - { - "HubSpot": { - "http://www.hubspot.com/": [ - "hs-analytics.net" - ] - } - }, - { - "IBM": { - "http://www.ibm.com/": [ - "cmcore.com", - "coremetrics.com", - "ibm.com" - ] - } - }, - { - "InboundWriter": { - "http://www.inboundwriter.com/": [ - "enquisite.com", - "inboundwriter.com" - ] - } - }, - { - "Infernotions": { - "https://infernotions.com/": [ - "infernotions.com" - ] - } - }, - { - "INFOnline": { - "https://www.infonline.de/": [ - "infonline.de", - "ioam.de", - "ivwbox.de" - ] - } - }, - { - "InfoStars": { - "http://infostars.ru/": [ - "hotlog.ru", - "infostars.ru" - ] - } - }, - { - "Inspectlet": { - "http://www.inspectlet.com/": [ - "inspectlet.com" - ] - } - }, - { - "IntelligenceFocus": { - "http://www.intelligencefocus.com/": [ - "domodomain.com", - "intelligencefocus.com" - ] - } - }, - { - "iPerceptions": { - "http://www.iperceptions.com/": [ - "iperceptions.com" - ] - } - }, - { - "IslayTech": { - "http://islay.tech": [ - "islay.tech" - ] - } - }, - { - "ItIsATracker": { - "https://itisatracker.com/": [ - "itisatracker.com" - ], - "dnt": "eff" - } - }, - { - "KeyMetric": { - "http://www.keymetric.net/": [ - "keymetric.net" - ] - } - }, - { - "KISSmetrics": { - "http://kissmetrics.com/": [ - "kissmetrics.com" - ] - } - }, - { - "Kitcode": { - "http://src.kitcode.net/": [ - "src.kitcode.net" - ] - } - }, - { - "LeadForensics": { - "https://www.leadforensics.com": [ - "leadforensics.com" - ] - } - }, - { - "LineZing": { - "http://www.linezing.com/": [ - "linezing.com" - ] - } - }, - { - "LivePerson": { - "http://www.liveperson.net/": [ - "liveperson.com", - "nuconomy.com" - ] - } - }, - { - "Logdy": { - "http://logdy.com/": [ - "logdy.com" - ] - } - }, - { - "Lotame": { - "http://www.lotame.com/": [ - "crwdcntrl.net", - "lotame.com" - ] - } - }, - { - "LuckyOrange": { - "https://www.luckyorange.com": [ - "luckyorange.com", - "luckyorange.net" - ], - "session-replay": "true" - } - }, - { - "Lynchpin": { - "http://www.lynchpin.com/": [ - "lynchpin.com", - "lypn.com" - ] - } - }, - { - "Lyris": { - "http://www.lyris.com/": [ - "clicktracks.com", - "lyris.com" - ] - } - }, - { - "Lytiks": { - "http://www.lytiks.com/": [ - "lytiks.com" - ] - } - }, - { - "MarkMonitor": { - "https://www.markmonitor.com": [ - "9c9media.ca", - "markmonitor.com" - ] - } - }, - { - "Marktest": { - "http://www.marktest.com/": [ - "marktest.com", - "marktest.pt" - ] - } - }, - { - "MaxMind": { - "https://www.maxmind.com/en/home": [ - "maxmind.com", - "mmapiws.com" - ] - } - }, - { - "Médiamétrie-eStat": { - "http://www.mediametrie-estat.com/": [ - "estat.com", - "mediametrie-estat.com" - ] - } - }, - { - "Merkle": { - "https://www.merkleinc.com/": [ - "merkleinc.com", - "rkdms.com" - ] - } - }, - { - "Mixpanel": { - "https://mixpanel.com/": [ - "mixpanel.com", - "mxpnl.com" - ] - } - }, - { - "Mongoose Metrics": { - "http://www.mongoosemetrics.com/": [ - "mongoosemetrics.com" - ] - } - }, - { - "Monitus": { - "http://www.monitus.net/": [ - "monitus.net" - ] - } - }, - { - "motigo": { - "http://motigo.com/": [ - "motigo.com", - "nedstatbasic.net" - ] - } - }, - { - "Mouseflow": { - "http://mouseflow.com/": [ - "mouseflow.com" - ] - } - }, - { - "MyPagerank.Net": { - "http://www.mypagerank.net/": [ - "mypagerank.net" - ] - } - }, - { - "Mystighty": { - "http://mystighty.info/": [ - "mystighty.info", - "sweeterge.info" - ] - } - }, - { - "Narrative": { - "http://narrative.io/2/": [ - "narrative.io" - ] - } - }, - { - "Net Applications": { - "http://www.netapplications.com/": [ - "hitsprocessor.com", - "netapplications.com" - ] - } - }, - { - "New Relic": { - "http://newrelic.com/": [ - "newrelic.com", - "nr-data.net" - ] - } - }, - { - "NewsRight": { - "http://www.newsright.com/": [ - "apnewsregistry.com" - ] - } - }, - { - "NextSTAT": { - "http://www.nextstat.com/": [ - "nextstat.com" - ] - } - }, - { - "Nielsen": { - "http://www.nielsen.com/": [ - "glanceguide.com", - "nielsen.com" - ] - } - }, - { - "NuDataSecurity": { - "https://nudatasecurity.com/": [ - "nudatasecurity.com" - ] - } - }, - { - "nurago": { - "http://www.nurago.com/": [ - "nurago.com", - "nurago.de", - "sensic.net" - ] - } - }, - { - "Observer": { - "http://observerapp.com/": [ - "observerapp.com" - ] - } - }, - { - "OnAudience": { - "http://www.onaudience.com/": [ - "behavioralengine.com", - "onaudience.com" - ] - } - }, - { - "OneStat": { - "http://www.onestat.com/": [ - "onestat.com" - ] - } - }, - { - "Openstat": { - "https://www.openstat.ru/": [ - "openstat.ru", - "spylog.com" - ] - } - }, - { - "Opentracker": { - "http://www.opentracker.net/": [ - "opentracker.net" - ] - } - }, - { - "Opolen": { - "https://opolen.com.br": [ - "opolen.com.br" - ] - } - }, - { - "Optimizely": { - "https://www.optimizely.com/": [ - "optimizely.com" - ] - } - }, - { - "Oracle": { - "http://www.oracle.com/": [ - "eloqua.com", - "maxymiser.com" - ] - } - }, - { - "ÖWA": { - "http://www.oewa.at/": [ - "oewa.at", - "oewabox.at" - ] - } - }, - { - "Parse.ly": { - "http://parsely.com/": [ - "parsely.com" - ] - } - }, - { - "PersianStat.com": { - "http://www.persianstat.com/": [ - "persianstat.com" - ] - } - }, - { - "Phonalytics": { - "http://www.phonalytics.com/": [ - "phonalytics.com" - ] - } - }, - { - "phpMyVisites": { - "http://www.phpmyvisites.us/": [ - "phpmyvisites.us" - ] - } - }, - { - "Piwik": { - "http://piwik.org/": [ - "piwik.org" - ] - } - }, - { - "PixAnalytics": { - "https://pixanalytics.com/": [ - "pixanalytics.com" - ] - } - }, - { - "Poool": { - "http://poool.fr/": [ - "poool.fr" - ] - } - }, - { - "Pronunciator": { - "http://www.pronunciator.com/": [ - "pronunciator.com", - "visitorville.com" - ] - } - }, - { - "Qualaroo": { - "http://qualaroo.com/": [ - "kissinsights.com", - "qualaroo.com" - ] - } - }, - { - "QuinStreet": { - "http://quinstreet.com/": [ - "thecounter.com" - ] - } - }, - { - "Quintelligence": { - "http://www.quintelligence.com/": [ - "quintelligence.com" - ] - } - }, - { - "RadarURL": { - "http://radarurl.com/": [ - "radarurl.com" - ] - } - }, - { - "Research Now": { - "http://www.researchnow.com/": [ - "researchnow.com", - "valuedopinions.co.uk" - ] - } - }, - { - "Retail Automata": { - "https://retailautomata.com": [ - "retailautomata.com" - ] - } - }, - { - "Revtracks": { - "http://revtrax.com/": [ - "revtrax.com" - ] - } - }, - { - "Ringier": { - "http://ringier.cz/": [ - "ringier.cz" - ] - } - }, - { - "Rollick": { - "https://gorollick.com": [ - "rollick.io" - ] - } - }, - { - "Roxr": { - "http://roxr.net/": [ - "getclicky.com", - "roxr.net", - "staticstuff.net" - ] - } - }, - { - "Safecount": { - "http://www.safecount.net/": [ - "dl-rms.com", - "dlqm.net", - "questionmarket.com", - "safecount.net" - ] - } - }, - { - "SageMetrics": { - "http://www.sagemetrics.com/": [ - "sageanalyst.net", - "sagemetrics.com" - ] - } - }, - { - "Salesintelligence": { - "https://salesintelligence.pl/": [ - "plugin.management" - ] - } - }, - { - "SeeVolution": { - "https://www.seevolution.com/": [ - "seevolution.com", - "svlu.net" - ] - } - }, - { - "Segment.io": { - "https://segment.io/": [ - "segment.io" - ] - } - }, - { - "SendPulse": { - "https://sendpulse.com/": [ - "sendpulse.com" - ] - } - }, - { - "SessionCam": { - "https://sessioncam.com/": [ - "sessioncam.com" - ], - "session-replay": "true" - } - }, - { - "ShinyStat": { - "http://www.shinystat.com/": [ - "shinystat.com" - ] - } - }, - { - "Smartlook": { - "https://www.smartlook.com/": [ - "smartlook.com" - ], - "session-replay": "true" - } - }, - { - "Snoobi": { - "http://www.snoobi.com/": [ - "snoobi.com" - ] - } - }, - { - "Sourcepoint": { - "https://www.sourcepoint.com/": [ - "summerhamster.com" - ] - } - }, - { - "Sputnik.ru": { - "http://sputnik.ru": [ - "sputnik.ru" - ] - } - }, - { - "StackTrack": { - "http://stat-track.com": [ - "stat-track.com" - ] - } - }, - { - "stat4u": { - "http://stat.4u.pl/": [ - "4u.pl" - ] - } - }, - { - "StatCounter": { - "http://statcounter.com/": [ - "statcounter.com" - ] - } - }, - { - "Statisfy": { - "http://statisfy.net": [ - "statisfy.net" - ] - } - }, - { - "STATSIT": { - "http://www.statsit.com/": [ - "statsit.com" - ] - } - }, - { - "Storeland": { - "https://storeland.ru/": [ - "storeland.ru" - ] - } - }, - { - "Stratigent": { - "http://www.stratigent.com/": [ - "stratigent.com" - ] - } - }, - { - "Tealium": { - "https://tealium.com": [ - "tealiumiq.com" - ] - } - }, - { - "TechSolutions": { - "https://www.techsolutions.com.tw/": [ - "techsolutions.com.tw" - ] - } - }, - { - "TENSQUARE": { - "http://www.tensquare.com/": [ - "tensquare.com" - ] - } - }, - { - "The Heron Partnership": { - "http://www.heronpartners.com.au/": [ - "heronpartners.com.au", - "marinsm.com" - ] - } - }, - { - "TNS": { - "http://www.tnsglobal.com/": [ - "sesamestats.com", - "statistik-gallup.net", - "tns-counter.ru", - "tns-cs.net", - "tnsglobal.com" - ] - } - }, - { - "TrackingSoft": { - "http://trackingsoft.com/": [ - "roia.biz", - "trackingsoft.com" - ] - } - }, - { - "TrafficScore": { - "https://trafficscore.com/": [ - "trafficscore.com" - ] - } - }, - { - "Twitter": { - "https://twitter.com/": [ - "crashlytics.com", - "tweetdeck.com" - ] - } - }, - { - "Umbel": { - "https://www.umbel.com/": [ - "umbel.com" - ] - } - }, - { - "User Local": { - "http://nakanohito.jp/": [ - "nakanohito.jp" - ] - } - }, - { - "V12 Data": { - "https://www.v12data.com/": [ - "v12data.com", - "v12group.com" - ] - } - }, - { - "Vertster": { - "http://www.vertster.com/": [ - "vertster.com" - ] - } - }, - { - "VisiStat": { - "http://www.visistat.com/": [ - "sa-as.com", - "visistat.com" - ] - } - }, - { - "Visit Streamer": { - "http://www.visitstreamer.com/": [ - "visitstreamer.com" - ] - } - }, - { - "vistrac": { - "http://vistrac.com/": [ - "vistrac.com" - ] - } - }, - { - "ViziSense": { - "http://www.vizisense.com/": [ - "vizisense.com", - "vizisense.net" - ] - } - }, - { - "Webclicktracker": { - "http://www.webclicktracker.com/": [ - "webclicktracker.com" - ] - } - }, - { - "Web Stats": { - "http://www.onlinewebstats.com/": [ - "onlinewebstats.com" - ] - } - }, - { - "Web Tracking Services": { - "http://www.webtrackingservices.com/": [ - "web-stat.com", - "webtrackingservices.com" - ] - } - }, - { - "Web Traxs": { - "http://www.webtraxs.com/": [ - "webtraxs.com" - ] - } - }, - { - "Webtrekk": { - "http://www.webtrekk.com/": [ - "webtrekk.com", - "webtrekk.net" - ] - } - }, - { - "Webtrends": { - "http://webtrends.com/": [ - "reinvigorate.net", - "webtrends.com", - "webtrendslive.com" - ] - } - }, - { - "White Ops": { - "https://www.whiteops.com/": [ - "adzmath.com", - "whiteops.com" - ] - } - }, - { - "whos.amung.us": { - "http://whos.amung.us/": [ - "amung.us" - ] - } - }, - { - "Wingify": { - "http://wingify.com/": [ - "visualwebsiteoptimizer.com", - "wingify.com" - ] - } - }, - { - "Woopra": { - "http://www.woopra.com/": [ - "woopra-ns.com", - "woopra.com" - ] - } - }, - { - "WOW Analytics": { - "http://www.wowanalytics.co.uk/": [ - "wowanalytics.co.uk" - ] - } - }, - { - "WPP": { - "http://www.wpp.com/": [ - "compete.com" - ] - } - }, - { - "Wysistat": { - "http://www.wysistat.com/": [ - "wysistat.com" - ] - } - }, - { - "Yahoo!": { - "http://www.yahoo.com/": [ - "analytics.yahoo.com" - ] - } - }, - { - "YellowTracker": { - "http://www.yellowtracker.com/": [ - "yellowtracker.com" - ] - } - }, - { - "YSance": { - "https://www.ysance.com/data-services/fr/home/": [ - "y-track.com" - ] - } - } - ], - "Fingerprinting": [ - { - "Adabra": { - "https://www.adabra.com/": [ - "adabra.com" - ] - } - }, - { - "Adbot": { - "https://adbot.tw/": [ - "adbot.tw" - ] - } - }, - { - "AdGainerSolutions": { - "http://adgainersolutions.com/adgainer/": [ - "adgainersolutions.com" - ] - } - }, - { - "AdMaven": { - "https://ad-maven.com/": [ - "ad-maven.com", - "agreensdistra.info", - "boudja.com", - "rensovetors.info", - "wrethicap.info" - ] - } - }, - { - "Admicro": { - "http://www.admicro.vn/": [ - "admicro.vn", - "vcmedia.vn" - ] - } - }, - { - "Adnium": { - "https://adnium.com": [ - "adnium.com", - "montwam.top" - ] - } - }, - { - "AdScore": { - "http://www.adscoremarketing.com/": [ - "adsco.re" - ] - } - }, - { - "AdYouLike": { - "https://www.adyoulike.com/": [ - "pulpix.com" - ] - } - }, - { - "AivaLabs": { - "https://aivalabs.com": [ - "aivalabs.com" - ] - } - }, - { - "Albacross": { - "https://albacross.com": [ - "albacross.com" - ] - } - }, - { - "AppCast": { - "https://appcast.io/": [ - "appcast.io" - ] - } - }, - { - "AuditedMedia": { - "https://auditedmedia.com/": [ - "aamapi.com", - "aamsitecertifier.com", - "auditedmedia.com" - ] - } - }, - { - "Augur": { - "http://www.augur.io/": [ - "augur.io" - ] - } - }, - { - "Azet": { - "http://mediaimpact.sk/": [ - "azetklik.sk", - "rsz.sk" - ] - } - }, - { - "BetssonPalantir": { - "https://betssonpalantir.com/": [ - "betssonpalantir.com" - ] - } - }, - { - "BigClick": { - "http://bigclick.me/": [ - "bgclck.me", - "xcvgdf.party" - ] - } - }, - { - "BitMedia": { - "https://bitmedia.io/": [ - "bitmedia.io" - ] - } - }, - { - "BlueCava": { - "http://www.bluecava.com/": [ - "bluecava.com" - ] - } - }, - { - "BoostBox": { - "https://www.boostbox.com.br/": [ - "boostbox.com.br" - ] - } - }, - { - "Brandcrumb": { - "http://www.brandcrumb.com": [ - "brandcrumb.com" - ] - } - }, - { - "BreakTime": { - "https://www.breaktime.com.tw/": [ - "breaktime.com.tw" - ] - } - }, - { - "BrightEdge": { - "http://www.brightedge.com/": [ - "b0e8.com" - ] - } - }, - { - "C3 Metrics": { - "http://c3metrics.com/": [ - "attributionmodel.com", - "c3metrics.com", - "c3tag.com" - ] - } - }, - { - "CallSource": { - "https://www.callsource.com/": [ - "leadtrackingdata.com" - ] - } - }, - { - "CartsGuru": { - "https://carts.guru/": [ - "carts.guru" - ] - } - }, - { - "ClearLink": { - "https://www.clearlink.com/": [ - "clearlink.com" - ] - } - }, - { - "Clickayab": { - "http://www.clickyab.com": [ - "clickyab.com" - ] - } - }, - { - "ClickFrog": { - "https://clickfrog.ru/": [ - "bashirian.biz", - "buckridge.link", - "franecki.net", - "quitzon.net", - "reichelcormier.bid", - "wisokykulas.bid" - ] - } - }, - { - "ClickGuard": { - "https://www.clickguard.com/": [ - "clickguard.com" - ] - } - }, - { - "Clixtell": { - "https://www.clixtell.com/": [ - "clixtell.com" - ] - } - }, - { - "Consumable": { - "http://consumable.com/": [ - "consumable.com" - ] - } - }, - { - "dmpxs": { - "http://bob.dmpxs.com": [ - "dmpxs.com" - ] - } - }, - { - "ECSAnalytics": { - "https://www.theecsinc.com/": [ - "ecsanalytics.com" - ] - } - }, - { - "EroAdvertising": { - "http://www.ero-advertising.com/": [ - "ero-advertising.com" - ] - } - }, - { - "eyeReturn Marketing": { - "http://www.eyereturnmarketing.com/": [ - "eyereturn.com", - "eyereturnmarketing.com" - ] - } - }, - { - "Fanplayr": { - "https://fanplayr.com/": [ - "fanplayr.com" - ] - } - }, - { - "Foresee": { - "https://www.foresee.com": [ - "answerscloud.com", - "foresee.com" - ] - } - }, - { - "Friends2Follow": { - "https://friends2follow.com/": [ - "antifraudjs.friends2follow.com" - ] - } - }, - { - "FuelX": { - "https://fuelx.com/": [ - "fuel451.com", - "fuelx.com" - ] - } - }, - { - "Gleam": { - "https://gleam.io/": [ - "fraudjs.io" - ] - } - }, - { - "GrapheneMedia": { - "http://graphenemedia.in/": [ - "graphenedigitalanalytics.in" - ] - } - }, - { - "Gruner + Jahr": { - "http://www.guj.de/": [ - "ligatus.com" - ] - } - }, - { - "HilltopAds": { - "https://hilltopads.com/": [ - "hilltopads.net", - "shoporielder.pro" - ] - } - }, - { - "HotelChamp": { - "https://www.hotelchamp.com": [ - "hotelchamp.com" - ] - } - }, - { - "iMedia": { - "http://www.imedia.cz": [ - "imedia.cz" - ] - } - }, - { - "IslayTech": { - "http://islay.tech": [ - "islay.tech" - ] - } - }, - { - "ismatlab.com": { - "http://ismatlab.com": [ - "ismatlab.com" - ] - } - }, - { - "Itch": { - "https://itch.io/": [ - "itch.io" - ] - } - }, - { - "justuno": { - "https://www.justuno.com/": [ - "justuno.com" - ] - } - }, - { - "Konduto": { - "http://konduto.com": [ - "k-analytix.com", - "konduto.com" - ] - } - }, - { - "LeadsHub": { - "https://ztsrv.com/": [ - "ztsrv.com" - ] - } - }, - { - "lptracker": { - "https://lptracker.io/": [ - "lptracker.io" - ] - } - }, - { - "MaxMind": { - "https://www.maxmind.com/en/home": [ - "maxmind.com", - "mmapiws.com" - ] - } - }, - { - "Mercadopago": { - "https://www.mercadopago.com/": [ - "mercadopago.com" - ] - } - }, - { - "Mobials": { - "http://mobials.com": [ - "mobials.com" - ] - } - }, - { - "Mystighty": { - "http://mystighty.info/": [ - "mystighty.info", - "sweeterge.info" - ] - } - }, - { - "Negishim": { - "http://www.negishim.org": [ - "negishim.org" - ] - } - }, - { - "NuDataSecurity": { - "https://nudatasecurity.com/": [ - "nudatasecurity.com" - ] - } - }, - { - "OneAd": { - "https://www.onead.com.tw/": [ - "guoshipartners.com", - "onevision.com.tw" - ] - } - }, - { - "OnlineMetrix": { - "http://h.online-metrix.net": [ - "online-metrix.net" - ] - } - }, - { - "Opolen": { - "https://opolen.com.br": [ - "opolen.com.br" - ] - } - }, - { - "PaymentsMB": { - "https://paymentsmb.com": [ - "paymentsmb.com" - ] - } - }, - { - "Paypal": { - "https://www.paypal.com": [ - "simility.com" - ] - } - }, - { - "PerimeterX": { - "https://www.perimeterx.com": [ - "perimeterx.net" - ] - } - }, - { - "PixAnalytics": { - "https://pixanalytics.com/": [ - "pixanalytics.com" - ] - } - }, - { - "Pixlee": { - "https://www.pixlee.com/": [ - "pixlee.com" - ] - } - }, - { - "Poool": { - "http://poool.fr/": [ - "poool.fr" - ] - } - }, - { - "PPCProtect": { - "https://ppcprotect.com": [ - "ppcprotect.com" - ] - } - }, - { - "PrismApp": { - "https://www.prismapp.io/": [ - "prismapp.io" - ] - } - }, - { - "PrometheusIntelligenceTechnology": { - "https://prometheusintelligencetechnology.com/": [ - "prometheusintelligencetechnology.com" - ] - } - }, - { - "Provers": { - "http://provers.pro": [ - "provers.pro" - ] - } - }, - { - "Psonstrentie": { - "http://psonstrentie.info": [ - "psonstrentie.info" - ] - } - }, - { - "Rollick": { - "https://gorollick.com": [ - "rollick.io" - ] - } - }, - { - "SAP": { - "https://www.sap.com": [ - "seewhy.com" - ] - } - }, - { - "Selectable Media": { - "http://selectablemedia.com/": [ - "nabbr.com", - "selectablemedia.com" - ] - } - }, - { - "Semantiqo": { - "http://semantiqo.com/": [ - "semantiqo.com" - ] - } - }, - { - "SendPulse": { - "https://sendpulse.com/": [ - "sendpulse.com" - ] - } - }, - { - "ShaftTraffic": { - "https://shafttraffic.com": [ - "libertystmedia.com" - ] - } - }, - { - "Shortest": { - "http://shorte.st/": [ - "shorte.st" - ] - } - }, - { - "SiftScience": { - "https://sift.com/": [ - "siftscience.com" - ] - } - }, - { - "Signifyd": { - "https://www.signifyd.com/": [ - "signifyd.com" - ] - } - }, - { - "Smi": { - "http://24smi.net": [ - "24smi.net" - ] - } - }, - { - "Socital": { - "https://www.socital.com": [ - "socital.com" - ] - } - }, - { - "Storeland": { - "https://storeland.ru/": [ - "storeland.ru" - ] - } - }, - { - "Stripe": { - "https://stripe.com": [ - "stripe.network" - ] - } - }, - { - "TechSolutions": { - "https://www.techsolutions.com.tw/": [ - "techsolutions.com.tw" - ] - } - }, - { - "tongdun.cn": { - "https://www.tongdun.cn/?lan=EN": [ - "fraudmetrix.cn", - "tongdun.net" - ] - } - }, - { - "Upland": { - "https://uplandsoftware.com/": [ - "leadlander.com", - "sf14g.com" - ] - } - }, - { - "Vendemore": { - "https://vendemore.com/": [ - "vendemore.com" - ] - } - }, - { - "VerticalHealth": { - "https://www.verticalhealth.com/": [ - "verticalhealth.net" - ] - } - }, - { - "Webmecanik": { - "https://www.webmecanik.com/": [ - "webmecanik.com" - ] - } - }, - { - "WideOrbit": { - "https://www.wideorbit.com/": [ - "dep-x.com" - ] - } - }, - { - "YSance": { - "https://www.ysance.com/data-services/fr/home/": [ - "y-track.com" - ] - } - }, - { - "ZafulAffiliate": { - "https://affiliate.zaful.com/": [ - "affasi.com", - "gw-ec.com", - "zaful.com" - ] - } - }, - { - "Zefir": { - "https://ze-fir.com/": [ - "ze-fir.com" - ] - } - } - ], - "Social": [ - { - "AddThis": { - "http://www.addthis.com/": [ - "addthis.com", - "addthiscdn.com", - "addthisedge.com", - "clearspring.com", - "connectedads.net", - "xgraph.com", - "xgraph.net" - ] - } - }, - { - "Causes": { - "http://www.causes.com/": [ - "causes.com" - ] - } - }, - { - "Digg": { - "http://digg.com/": [ - "digg.com" - ] - } - }, - { - "Facebook": { - "http://www.facebook.com/": [ - "apps.fbsbx.com", - "atdmt.com", - "facebook.com", - "facebook.de", - "facebook.fr", - "facebook.net", - "fb.com", - "fbsbx.com", - "friendfeed.com" - ] - } - }, - { - "Google": { - "http://www.google.com/": [ - "developers.google.com", - "gmail.com", - "googlemail.com", - "inbox.google.com", - "mail.google.com", - "orkut.com", - "plus.google.com", - "plusone.google.com", - "smartlock.google.com", - "voice.google.com", - "wave.google.com" - ] - } - }, - { - "LinkedIn": { - "http://www.linkedin.com/": [ - "licdn.com", - "linkedin.com" - ] - } - }, - { - "Lockerz": { - "http://lockerz.com/": [ - "lockerz.com" - ] - } - }, - { - "Mail.Ru": { - "http://mail.ru/": [ - "list.ru", - "mail.ru" - ] - } - }, - { - "Meebo": { - "https://www.meebo.com/": [ - "meebo.com", - "meebocdn.net" - ] - } - }, - { - "Papaya": { - "http://papayamobile.com/": [ - "papayamobile.com" - ] - } - }, - { - "reddit": { - "http://www.reddit.com/": [ - "reddit.com" - ] - } - }, - { - "Shareaholic": { - "http://www.shareaholic.com/": [ - "shareaholic.com" - ] - } - }, - { - "ShareThis": { - "http://sharethis.com/": [ - "sharethis.com" - ] - } - }, - { - "StumbleUpon": { - "http://www.stumbleupon.com/": [ - "stumble-upon.com", - "stumbleupon.com" - ] - } - }, - { - "Twitter": { - "https://twitter.com/": [ - "twimg.com", - "twitter.com", - "twitter.jp" - ] - } - }, - { - "VKontakte": { - "http://vk.com/": [ - "userapi.com", - "vk.com", - "vkontakte.ru" - ] - } - }, - { - "Yahoo!": { - "http://www.yahoo.com/": [ - "address.yahoo.com", - "alerts.yahoo.com", - "avatars.yahoo.com", - "buzz.yahoo.com", - "calendar.yahoo.com", - "edit.yahoo.com", - "legalredirect.yahoo.com", - "login.yahoo.com", - "mail.yahoo.com", - "my.yahoo.com", - "mybloglog.com", - "notepad.yahoo.com", - "pulse.yahoo.com", - "rocketmail.com", - "webmessenger.yahoo.com", - "ymail.com" - ] - } - } - ], - "Cryptomining": [ - { - "a.js": { - "http://zymerget.bid": [ - "alflying.date", - "alflying.win", - "anybest.site", - "flightsy.bid", - "flightsy.win", - "flightzy.bid", - "flightzy.date", - "flightzy.win", - "zymerget.bid", - "zymerget.faith" - ], - "performance": "true" - } - }, - { - "CashBeet": { - "http://cashbeet.com": [ - "cashbeet.com", - "serv1swork.com" - ] - } - }, - { - "CoinHive": { - "https://coinhive.com": [ - "ad-miner.com", - "authedmine.com", - "bmst.pw", - "cnhv.co", - "coin-hive.com", - "coinhive.com", - "wsservices.org" - ], - "performance": "true" - } - }, - { - "CoinPot": { - "http://coinpot.co": [ - "coinpot.co" - ], - "performance": "true" - } - }, - { - "CryptoLoot": { - "https://crypto-loot.com": [ - "cryptaloot.pro", - "crypto-loot.com", - "cryptolootminer.com", - "flashx.pw", - "gitgrub.pro", - "reauthenticator.com", - "statdynamic.com", - "webmine.pro" - ], - "performance": "true" - } - }, - { - "CryptoWebMiner": { - "https://www.crypto-webminer.com": [ - "bitcoin-pay.eu", - "crypto-webminer.com", - "ethpocket.de", - "ethtrader.de" - ] - } - }, - { - "Gridcash": { - "https://www.gridcash.net/": [ - "adless.io", - "gridcash.net" - ], - "performance": "true" - } - }, - { - "JSE": { - "http://jsecoin.com": [ - "freecontent.bid", - "freecontent.date", - "freecontent.stream", - "hashing.win", - "hostingcloud.racing", - "hostingcloud.science", - "jsecoin.com" - ], - "performance": "true" - } - }, - { - "MinerAlt": { - "http://mineralt.io": [ - "1q2w3.website", - "analytics.blue", - "aster18cdn.nl", - "belicimo.pw", - "besstahete.info", - "dinorslick.icu", - "feesocrald.com", - "gramombird.com", - "istlandoll.com", - "mepirtedic.com", - "mineralt.io", - "pampopholf.com", - "tercabilis.info", - "tulip18.com", - "vidzi.tv", - "yololike.space" - ], - "performance": "true" - } - }, - { - "Minescripts": { - "http://minescripts.info": [ - "minescripts.info", - "sslverify.info" - ], - "performance": "true" - } - }, - { - "MineXMR": { - "http://minexmr.stream": [ - "minexmr.stream" - ], - "performance": "true" - } - }, - { - "NeroHut": { - "https://nerohut.com": [ - "nerohut.com", - "nhsrv.cf" - ], - "performance": "true" - } - }, - { - "Service4refresh": { - "https://service4refresh.info": [ - "service4refresh.info" - ] - } - }, - { - "SpareChange": { - "http://sparechange.io": [ - "sparechange.io" - ], - "performance": "true" - } - }, - { - "SwiftMining": { - "https://swiftmining.win/": [ - "swiftmining.win" - ] - } - }, - { - "Webmine": { - "https://webmine.cz/": [ - "authedwebmine.cz", - "webmine.cz" - ] - } - }, - { - "WebminePool": { - "http://webminepool.com": [ - "webminepool.com" - ], - "performance": "true" - } - }, - { - "Webmining": { - "https://webmining.co/": [ - "webmining.co" - ] - } - } - ] - } + "license": "Copyright 2010-2019 Disconnect, Inc. / This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. / This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. / You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.", + "categories": { + "Advertising": [ + { + "2leep.com": { + "http://2leep.com/": ["2leep.com"] + } + }, + { + "33Across": { + "http://33across.com/": ["33across.com"] + } + }, + { + "365Media": { + "http://365media.com/": ["365media.com"] + } + }, + { + "4INFO": { + "http://www.4info.com/": ["4info.com", "adhaven.com"] + } + }, + { + "4mads": { + "http://4mads.com/": ["4mads.com"] + } + }, + { + "Abax Interactive": { + "http://abaxinteractive.com/": ["abaxinteractive.com"] + } + }, + { + "Accelia": { + "http://www.accelia.net/": ["accelia.net", "durasite.net"] + } + }, + { + "Accordant Media": { + "http://www.accordantmedia.com/": ["accordantmedia.com"] + } + }, + { + "Acquisio": { + "http://www.acquisio.com/": ["acquisio.com", "clickequations.net"] + } + }, + { + "Actisens": { + "http://www.actisens.com/": ["actisens.com", "gestionpub.com"] + } + }, + { + "ActiveConversion": { + "http://www.activeconversion.com/": [ + "activeconversion.com", + "activemeter.com" + ] + } + }, + { + "Act-On": { + "http://www.act-on.com/": ["act-on.com", "actonsoftware.com"] + } + }, + { + "Acuity": { + "http://www.acuity.com/": [ + "acuity.com", + "acuityads.com", + "acuityplatform.com" + ] + } + }, + { + "AD2ONE": { + "http://www.ad2onegroup.com/": ["ad2onegroup.com"] + } + }, + { + "Ad4Game": { + "http://ad4game.com/": ["ad4game.com"] + } + }, + { + "ad6media": { + "http://www.ad6media.fr/": ["ad6media.fr"] + } + }, + { + "Adabra": { + "https://www.adabra.com/": ["adabra.com"] + } + }, + { + "Adality": { + "http://adality.de/": ["adality.de", "adrtx.net"] + } + }, + { + "AdaptiveAds": { + "http://www.adaptiveads.com/": ["adaptiveads.com"] + } + }, + { + "Adaptly": { + "http://adaptly.com/": ["adaptly.com"] + } + }, + { + "Adara Media": { + "http://www.adaramedia.com/": [ + "adaramedia.com", + "opinmind.com", + "yieldoptimizer.com" + ] + } + }, + { + "Adatus": { + "http://www.adatus.com/": ["adatus.com"] + } + }, + { + "Adbot": { + "https://adbot.tw/": ["adbot.tw"] + } + }, + { + "Adbrain": { + "http://www.adbrain.com/": ["adbrain.com", "adbrn.com"] + } + }, + { + "adBrite": { + "http://www.adbrite.com/": ["adbrite.com"] + } + }, + { + "Adbroker.de": { + "http://adbroker.de/": ["adbroker.de"] + } + }, + { + "Adchemy": { + "http://www.adchemy.com/": ["adchemy.com"] + } + }, + { + "AdCirrus": { + "http://adcirrus.com/": ["adcirrus.com"] + } + }, + { + "Ad Decisive": { + "http://www.addecisive.com/": ["a2dfp.net", "addecisive.com"] + } + }, + { + "addGloo": { + "http://www.addgloo.com/": ["addgloo.com"] + } + }, + { + "Addvantage Media": { + "http://www.addvantagemedia.com/": ["addvantagemedia.com"] + } + }, + { + "Ad Dynamo": { + "http://www.addynamo.com/": ["addynamo.com", "addynamo.net"] + } + }, + { + "Adelphic": { + "https://adelphic.com/": ["adelphic.com", "ipredictive.com"] + } + }, + { + "AdEngage": { + "http://adengage.com/": ["adengage.com"] + } + }, + { + "AD Europe": { + "http://www.adeurope.com/": ["adeurope.com"] + } + }, + { + "AdExtent": { + "http://www.adextent.com/": ["adextent.com"] + } + }, + { + "AdF.ly": { + "http://adf.ly/": ["adf.ly"] + } + }, + { + "Adfonic": { + "http://adfonic.com/": ["adfonic.com"] + } + }, + { + "Adforge": { + "http://adforgeinc.com/": ["adforgeinc.com"] + } + }, + { + "Adform": { + "http://www.adform.com/": [ + "adform.com", + "adform.net", + "adformdsp.net" + ] + } + }, + { + "AdFox": { + "http://adfox.ru/": ["adfox.ru"] + } + }, + { + "AdFrontiers": { + "http://www.adfrontiers.com/": ["adfrontiers.com"] + } + }, + { + "Adfunky": { + "http://www.adfunky.com/": ["adfunky.com", "adfunkyserver.com"] + } + }, + { + "Adfusion": { + "http://www.adfusion.com/": ["adfusion.com"] + } + }, + { + "AdGainerSolutions": { + "http://adgainersolutions.com/adgainer/": ["adgainersolutions.com"] + } + }, + { + "AdGent Digital": { + "http://www.adgentdigital.com/": [ + "adgentdigital.com", + "shorttailmedia.com" + ] + } + }, + { + "AdGibbon": { + "http://www.adgibbon.com/": ["adgibbon.com"] + } + }, + { + "Adglare": { + "https://www.adglare.com/": ["adglare.com", "adglare.net"] + } + }, + { + "adhood": { + "http://www.adhood.com/": ["adhood.com"] + } + }, + { + "Adiant": { + "http://www.adiant.com/": ["adblade.com", "adiant.com"] + } + }, + { + "AdInsight": { + "http://www.adinsight.com/": ["adinsight.com", "adinsight.eu"] + } + }, + { + "AdIQuity": { + "http://adiquity.com/": ["adiquity.com"] + } + }, + { + "ADITION": { + "http://www.adition.com/": ["adition.com"] + } + }, + { + "AdJug": { + "http://www.adjug.com/": ["adjug.com"] + } + }, + { + "AdJuggler": { + "http://www.adjuggler.com/": ["adjuggler.com", "adjuggler.net"] + } + }, + { + "Adjust": { + "https://adjust.com": ["adjust.com"] + } + }, + { + "AdKeeper": { + "http://www.adkeeper.com/": ["adkeeper.com", "akncdn.com"] + } + }, + { + "AdKernel": { + "http://adkernel.com": ["adkernel.com"] + } + }, + { + "Ad Knife": { + "http://static.adknife.com/": ["adknife.com"] + } + }, + { + "Adknowledge": { + "http://www.adknowledge.com/": [ + "adknowledge.com", + "adparlor.com", + "bidsystem.com", + "cubics.com", + "lookery.com" + ] + } + }, + { + "AdLantis": { + "http://www.adlantis.jp/": ["adimg.net", "adlantis.jp"] + } + }, + { + "AdLeave": { + "http://www.adleave.com/": ["adleave.com"] + } + }, + { + "Adlibrium": { + "http://www.adlibrium.com/": ["adlibrium.com"] + } + }, + { + "Adlucent": { + "http://adlucent.com": ["adlucent.com"] + } + }, + { + "Ad Magnet": { + "http://www.admagnet.com/": ["admagnet.com", "admagnet.net"] + } + }, + { + "Admarketplace": { + "http://www.admarketplace.com/": [ + "admarketplace.com", + "admarketplace.net", + "ampxchange.com" + ] + } + }, + { + "AdMarvel": { + "http://www.admarvel.com/": ["admarvel.com"] + } + }, + { + "AdMatrix": { + "http://www.admatrix.jp/": ["admatrix.jp"] + } + }, + { + "AdMaven": { + "https://ad-maven.com/": [ + "ad-maven.com", + "agreensdistra.info", + "boudja.com", + "rensovetors.info", + "wrethicap.info" + ] + } + }, + { + "AdMaximizer Network": { + "http://admaximizer.com/": ["admaximizer.com"] + } + }, + { + "AdMedia": { + "http://www.admedia.com/": ["admedia.com"] + } + }, + { + "Admeta": { + "http://www.admeta.com/": ["admeta.com", "atemda.com"] + } + }, + { + "Admicro": { + "http://www.admicro.vn/": ["admicro.vn", "vcmedia.vn"] + } + }, + { + "Admixer": { + "https://admixer.co.kr/main": ["admixer.co.kr"] + } + }, + { + "Admized": { + "http://www.admized.com/": ["admized.com"] + } + }, + { + "Admobile": { + "http://admobile.com/": ["admobile.com"] + } + }, + { + "Admotion": { + "http://www.admotion.com/": ["admotion.com", "nspmotion.com"] + } + }, + { + "Adnetik": { + "http://adnetik.com/": ["adnetik.com", "wtp101.com"] + } + }, + { + "AdNetwork.net": { + "http://www.adnetwork.net/": ["adnetwork.net"] + } + }, + { + "Adnium": { + "https://adnium.com": ["adnium.com"] + } + }, + { + "adnologies": { + "http://www.adnologies.com/": ["adnologies.com", "heias.com"] + } + }, + { + "Adobe": { + "http://www.adobe.com/": [ + "2o7.net", + "auditude.com", + "demdex.com", + "demdex.net", + "dmtracker.com", + "efrontier.com", + "everestads.net", + "everestjs.net", + "everesttech.net", + "hitbox.com", + "omniture.com", + "omtrdc.net", + "touchclarity.com" + ] + } + }, + { + "AdOcean": { + "http://www.adocean-global.com/": ["adocean-global.com", "adocean.pl"] + } + }, + { + "Adometry": { + "http://www.adometry.com/": ["adometry.com", "dmtry.com"] + } + }, + { + "Adomik": { + "http://www.adomik.com/": ["adomik.com"] + } + }, + { + "AdOnion": { + "http://www.adonion.com/": ["adonion.com"] + } + }, + { + "Adorika": { + "http://www.clickotmedia.com/": ["clickotmedia.com"] + } + }, + { + "Adotmob": { + "https://adotmob.com/": ["adotmob.com"] + } + }, + { + "ADP Dealer Services": { + "http://www.adpdealerservices.com/": [ + "admission.net", + "adpdealerservices.com", + "cobalt.com" + ] + } + }, + { + "ad pepper media": { + "http://www.adpepper.us/": ["adpepper.com", "adpepper.us"] + } + }, + { + "AdPerfect": { + "http://www.adperfect.com/": ["adperfect.com"] + } + }, + { + "Adperium": { + "http://www.adperium.com/": ["adperium.com"] + } + }, + { + "Adpersia": { + "http://www.adpersia.com/": ["adpersia.com"] + } + }, + { + "adPrecision": { + "http://adprecision.net/": ["adprs.net", "aprecision.net"] + } + }, + { + "AdPredictive": { + "http://www.adpredictive.com/": ["adpredictive.com"] + } + }, + { + "AdReactor": { + "http://www.adreactor.com/": ["adreactor.com"] + } + }, + { + "AdReady": { + "http://www.adready.com/": ["adready.com", "adreadytractions.com"] + } + }, + { + "AdRevolution": { + "http://adrevolution.com/": ["adrevolution.com"] + } + }, + { + "AdRiver": { + "http://adriver.ru/": ["adriver.ru"] + } + }, + { + "adrolays": { + "http://adrolays.com/": ["adrolays.com", "adrolays.de"] + } + }, + { + "AdRoll": { + "http://www.adroll.com/": ["adroll.com"] + } + }, + { + "adscale": { + "http://www.adscale.de/": ["adscale.de"] + } + }, + { + "Adscience": { + "https://www.adscience.nl/": ["adscience.nl"] + } + }, + { + "AdServerPub": { + "http://www.adserverpub.com/": ["adserverpub.com"] + } + }, + { + "AdShuffle": { + "http://www.adshuffle.com/": ["adshuffle.com"] + } + }, + { + "AdSide": { + "http://www.adside.com/": ["adside.com", "doclix.com"] + } + }, + { + "AdSpeed": { + "http://www.adspeed.com/": ["adspeed.com", "adspeed.net"] + } + }, + { + "Adsperity": { + "https://www.adsperity.com/": ["adsperity.com"] + } + }, + { + "AdSpirit": { + "http://www.adspirit.de/": [ + "adspirit.com", + "adspirit.de", + "adspirit.net" + ] + } + }, + { + "Adsrevenue.net": { + "http://adsrevenue.net/": ["adsrevenue.net"] + } + }, + { + "AdStir": { + "https://en.ad-stir.com/": ["ad-stir.com"] + } + }, + { + "AdsTours": { + "http://www.adstours.com/": ["adstours.com", "clickintext.net"] + } + }, + { + "Adsty": { + "http://adsty.com/": ["adsty.com", "adx1.com"] + } + }, + { + "Adsupply": { + "http://www.adsupply.com/": ["4dsply.com", "adsupply.com"] + } + }, + { + "Adswizz": { + "http://adswizz.com": ["adswizz.com"] + } + }, + { + "ADTECH": { + "http://www.adtech.com/": ["adtech.com", "adtech.de", "adtechus.com"] + } + }, + { + "Adtegrity.com": { + "http://www.adtegrity.com/": ["adtegrity.com", "adtegrity.net"] + } + }, + { + "ADTELLIGENCE": { + "http://www.adtelligence.de/": ["adtelligence.de"] + } + }, + { + "Adthink": { + "https://adthink.com/": ["adthink.com", "audienceinsights.net"] + } + }, + { + "AdTiger": { + "http://www.adtiger.de/": ["adtiger.de"] + } + }, + { + "AdTruth": { + "http://adtruth.com/": ["adtruth.com"] + } + }, + { + "Adult AdWorld": { + "http://adultadworld.com/": ["adultadworld.com"] + } + }, + { + "Adultmoda": { + "http://www.adultmoda.com/": ["adultmoda.com"] + } + }, + { + "Adventive": { + "http://adventive.com/": ["adventive.com"] + } + }, + { + "Adverline": { + "http://www.adverline.com/": ["adnext.fr", "adverline.com"] + } + }, + { + "Adversal.com": { + "http://www.adversal.com/": ["adv-adserver.com", "adversal.com"] + } + }, + { + "Adverticum": { + "http://www.adverticum.com/": [ + "adsmart.com", + "adverticum.com", + "adverticum.net" + ] + } + }, + { + "Advertise.com": { + "http://www.advertise.com/": ["advertise.com"] + } + }, + { + "AdvertiseSpace": { + "http://www.advertisespace.com/": ["advertisespace.com"] + } + }, + { + "Advert Stream": { + "http://www.advertstream.com/": ["advertstream.com"] + } + }, + { + "Advisor Media": { + "http://advisormedia.cz/": ["advisormedia.cz"] + } + }, + { + "Adworx": { + "http://adworx.at/": ["adworx.at", "adworx.be", "adworx.nl"] + } + }, + { + "AdXpansion": { + "http://www.adxpansion.com/": ["adxpansion.com"] + } + }, + { + "Adxvalue": { + "http://adxvalue.com/": ["adxvalue.com", "adxvalue.de"] + } + }, + { + "adyard": { + "http://adyard.de/": ["adyard.de"] + } + }, + { + "AdYield": { + "http://www.adyield.com/": ["adxyield.com", "adyield.com"] + } + }, + { + "AdYouLike": { + "https://www.adyoulike.com/": [ + "adyoulike.com", + "omnitagjs.com", + "pulpix.com" + ] + } + }, + { + "ADZ": { + "http://www.adzcentral.com/": ["adzcentral.com"] + } + }, + { + "Adzerk": { + "http://www.adzerk.com/": ["adzerk.com", "adzerk.net"] + } + }, + { + "adzly": { + "http://www.adzly.com/": ["adzly.com"] + } + }, + { + "Aegis Group": { + "http://www.aemedia.com/": ["aemedia.com", "bluestreak.com"] + } + }, + { + "AERIFY MEDIA": { + "http://aerifymedia.com/": ["aerifymedia.com", "anonymous-media.com"] + } + }, + { + "Affectv": { + "http://affectv.co.uk/": ["affectv.co.uk"] + } + }, + { + "affilinet": { + "http://www.affili.net/": [ + "affili.net", + "affilinet-inside.de", + "banner-rotation.com", + "successfultogether.co.uk" + ] + } + }, + { + "Affine": { + "http://www.affine.tv/": ["affine.tv", "affinesystems.com"] + } + }, + { + "Affinity": { + "http://www.affinity.com/": ["affinity.com"] + } + }, + { + "AfterDownload": { + "http://www.afterdownload.com/": ["afdads.com", "afterdownload.com"] + } + }, + { + "Aim4Media": { + "http://aim4media.com/": ["aim4media.com"] + } + }, + { + "Airpush": { + "http://www.airpush.com/": ["airpush.com"] + } + }, + { + "AK": { + "http://www.aggregateknowledge.com/": [ + "aggregateknowledge.com", + "agkn.com" + ] + } + }, + { + "Akamai": { + "http://www.akamai.com/": ["imiclk.com"] + } + }, + { + "Albacross": { + "https://albacross.com": ["albacross.com"] + } + }, + { + "AllStarMediaGroup": { + "http://allstarmediagroup.com/": ["allstarmediagroup.com"] + } + }, + { + "Aloodo": { + "https://aloodo.com/": ["aloodo.com"] + } + }, + { + "AlterGeo": { + "http://altergeo.ru/": ["altergeo.ru"] + } + }, + { + "Amazon.com": { + "http://www.amazon.com/": [ + "amazon-adsystem.com", + "amazon.ca", + "amazon.co.jp", + "amazon.co.uk", + "amazon.de", + "amazon.es", + "amazon.fr", + "amazon.it", + "assoc-amazon.com" + ] + } + }, + { + "Ambient Digital": { + "http://ambientdigital.com.vn/": [ + "adnetwork.vn", + "ambientdigital.com.vn" + ] + } + }, + { + "Amobee": { + "http://amobee.com/": [ + "adconion.com", + "amgdgt.com", + "amobee.com", + "euroclick.com", + "smartclip.com", + "turn.com" + ] + } + }, + { + "AndBeyond": { + "http://andbeyond.media/": ["andbeyond.media"] + } + }, + { + "Answers.com": { + "http://www.answers.com/": ["dsply.com"] + } + }, + { + "AOL": { + "http://www.aol.com/": [ + "adsonar.com", + "adtechjp.com", + "advertising.com", + "aolcloud.net", + "atwola.com", + "leadback.com", + "tacoda.net", + "vidible.tv" + ] + } + }, + { + "AppCast": { + "https://appcast.io/": ["appcast.io"] + } + }, + { + "Appenda": { + "http://www.appenda.com/": ["appenda.com"] + } + }, + { + "AppFlood": { + "http://appflood.com/": ["appflood.com"] + } + }, + { + "Appier": { + "http://appier.com/": ["appier.com"] + } + }, + { + "Applifier": { + "http://www.applifier.com/": ["applifier.com"] + } + }, + { + "Applovin": { + "http://www.applovin.com/": ["applovin.com"] + } + }, + { + "AppNexus": { + "http://www.appnexus.com/": [ + "adlantic.nl", + "adnxs.com", + "adrdgt.com", + "alenty.com", + "appnexus.com" + ] + } + }, + { + "AppsFlyer": { + "http://appsflyer.com/": ["appsflyer.com"] + } + }, + { + "appssavvy": { + "http://appssavvy.com/": ["appssavvy.com"] + } + }, + { + "Arkwrights Homebrew": { + "http://www.arkwrightshomebrew.com/": [ + "arkwrightshomebrew.com", + "ctasnet.com" + ] + } + }, + { + "AT Internet": { + "http://www.atinternet.com/": ["hit-parade.com"] + } + }, + { + "ATN": { + "http://affiliatetracking.com/": ["affiliatetracking.com"] + } + }, + { + "Atoomic.com": { + "http://www.atoomic.com/": ["atoomic.com"] + } + }, + { + "Atrinsic": { + "http://atrinsic.com/": ["atrinsic.com"] + } + }, + { + "AT&T": { + "http://www.att.com/": ["att.com", "yp.com"] + } + }, + { + "Audience2Media": { + "http://www.audience2media.com/": ["audience2media.com"] + } + }, + { + "Audience Ad Network": { + "http://audienceadnetwork.com/": ["audienceadnetwork.com"] + } + }, + { + "AudienceScience": { + "http://www.audiencescience.com/": [ + "audiencescience.com", + "revsci.net", + "targetingmarketplace.com", + "wunderloop.net" + ] + } + }, + { + "Augme": { + "http://www.augme.com/": ["augme.com", "hipcricket.com"] + } + }, + { + "Augur": { + "http://www.augur.io/": ["augur.io"] + } + }, + { + "AUTOCENTRE.UA": { + "http://www.autocentre.ua/": ["am.ua", "autocentre.ua"] + } + }, + { + "Automattic": { + "http://automattic.com/": ["pubmine.com"] + } + }, + { + "Avalanchers": { + "http://www.avalanchers.com/": ["avalanchers.com"] + } + }, + { + "AvantLink": { + "http://www.avantlink.com/": ["avantlink.com"] + } + }, + { + "Avocet": { + "https://avocet.io/": ["avocet.io"] + } + }, + { + "Avsads": { + "http://avsads.com/": ["avsads.com"] + } + }, + { + "AWeber": { + "http://www.aweber.com/": ["aweber.com"] + } + }, + { + "Awin": { + "http://www.awin.com/": [ + "digitalwindow.com", + "dwin1.com", + "perfiliate.com" + ] + } + }, + { + "Azet": { + "http://mediaimpact.sk/": ["azetklik.sk", "rsz.sk"] + } + }, + { + "BackBeat Media": { + "http://www.backbeatmedia.com/": ["backbeatmedia.com"] + } + }, + { + "Bannerconnect": { + "http://www.bannerconnect.net/": ["bannerconnect.net"] + } + }, + { + "Barilliance": { + "http://www.barilliance.com/": ["barilliance.com"] + } + }, + { + "BaronsNetworks": { + "http://baronsoffers.com/": ["baronsoffers.com"] + } + }, + { + "Batanga Network": { + "http://www.batanganetwork.com/": [ + "batanga.com", + "batanganetwork.com" + ] + } + }, + { + "BeachFront": { + "http://beachfront.com/": ["beachfront.com"] + } + }, + { + "Beanstock Media": { + "http://www.beanstockmedia.com/": ["beanstockmedia.com"] + } + }, + { + "beencounter": { + "http://www.beencounter.com/": ["beencounter.com"] + } + }, + { + "Begun": { + "http://www.begun.ru/": ["begun.ru"] + } + }, + { + "belboon": { + "http://www.belboon.com/": ["adbutler.de", "belboon.com"] + } + }, + { + "Betgenius": { + "http://www.betgenius.com/": ["betgenius.com", "connextra.com"] + } + }, + { + "BetweenDigital": { + "http://betweendigital.com": ["betweendigital.com"] + } + }, + { + "Bidfluence": { + "https://www.bidfluence.com/": ["bidfluence.com"] + } + }, + { + "Bidr": { + "http://bidr.io": ["bidr.io"] + } + }, + { + "BidSwitch": { + "https://www.bidswitch.com/": ["bidswitch.net", "mfadsrvr.com"] + } + }, + { + "Bidtellect": { + "https://www.bidtellect.com/": ["bidtellect.com", "bttrack.com"] + } + }, + { + "BidVertiser": { + "http://www.bidvertiser.com/": ["bidvertiser.com"] + } + }, + { + "BigClick": { + "http://bigclick.me/": ["bgclck.me", "xcvgdf.party"] + } + }, + { + "bigmirnet": { + "http://www.bigmir.net/": ["bigmir.net"] + } + }, + { + "BinLayer": { + "http://binlayer.com/": ["binlayer.com"] + } + }, + { + "Bitcoin Plus": { + "http://www.bitcoinplus.com/": ["bitcoinplus.com"] + } + }, + { + "BitMedia": { + "https://bitmedia.io/": ["bitmedia.io"] + } + }, + { + "BittAds": { + "http://www.bittads.com/": ["bittads.com"] + } + }, + { + "Bizo": { + "http://www.bizo.com/": ["bizo.com", "bizographics.com"] + } + }, + { + "Black Label Ads": { + "http://www.blacklabelads.com/": ["blacklabelads.com"] + } + }, + { + "BlogCatalog": { + "http://www.blogcatalog.com/": ["blogcatalog.com"] + } + }, + { + "BlogFrog": { + "http://theblogfrog.com/": ["theblogfrog.com"] + } + }, + { + "BlogHer": { + "http://www.blogher.com/": ["blogher.com", "blogherads.com"] + } + }, + { + "BlogRollr": { + "http://blogrollr.com/": ["blogrollr.com"] + } + }, + { + "BLOOM Digital Platforms": { + "http://bloom-hq.com/": ["adgear.com", "adgrx.com", "bloom-hq.com"] + } + }, + { + "BlueKai": { + "http://www.bluekai.com/": [ + "bkrtx.com", + "bluekai.com", + "tracksimple.com" + ] + } + }, + { + "Blu Trumpet": { + "http://www.blutrumpet.com/": ["blutrumpet.com"] + } + }, + { + "Boo-Box": { + "http://boo-box.com/": ["boo-box.com"] + } + }, + { + "BoostBox": { + "https://www.boostbox.com.br/": ["boostbox.com.br"] + } + }, + { + "Bouncex": { + "https://www.bouncex.com/": [ + "bounceexchange.com", + "bouncex.com", + "bouncex.net" + ] + } + }, + { + "Brainient": { + "http://brainient.com/": ["brainient.com"] + } + }, + { + "Brand Affinity Technologies": { + "http://www.brandaffinity.net/": ["brandaffinity.net"] + } + }, + { + "Brandcrumb": { + "http://www.brandcrumb.com": ["brandcrumb.com"] + } + }, + { + "Brand.net": { + "http://www.brand.net/": ["brand.net"] + } + }, + { + "Brandscreen": { + "http://www.brandscreen.com/": ["brandscreen.com", "rtbidder.net"] + } + }, + { + "BreakTime": { + "https://www.breaktime.com.tw/": ["breaktime.com.tw"] + } + }, + { + "BrightRoll": { + "http://www.brightroll.com/": ["brightroll.com", "btrll.com"] + } + }, + { + "BrightTag": { + "http://www.brighttag.com/": [ + "brighttag.com", + "btstatic.com", + "thebrighttag.com" + ] + } + }, + { + "Brilig": { + "http://www.brilig.com/": ["brilig.com"] + } + }, + { + "BuckSense": { + "http://www.bucksense.com": ["bucksense.com"] + } + }, + { + "Burstly": { + "http://www.burstly.com/": ["burstly.com"] + } + }, + { + "Burst Media": { + "http://www.burstmedia.com/": [ + "burstbeacon.com", + "burstdirectads.com", + "burstmedia.com", + "burstnet.com", + "giantrealm.com" + ] + } + }, + { + "BusinessOnline": { + "http://www.businessol.com/": ["businessol.com"] + } + }, + { + "Button": { + "https://www.usebutton.com": ["usebutton.com"] + } + }, + { + "BuySellAds": { + "http://buysellads.com/": ["beaconads.com", "buysellads.com"] + } + }, + { + "Buysight": { + "http://www.buysight.com/": [ + "buysight.com", + "permuto.com", + "pulsemgr.com" + ] + } + }, + { + "BuzzParadise": { + "http://www.buzzparadise.com/": ["buzzparadise.com"] + } + }, + { + "BV! MEDIA": { + "http://www.bvmedia.ca/": [ + "bvmedia.ca", + "networldmedia.com", + "networldmedia.net" + ] + } + }, + { + "c1exchange": { + "https://c1exchange.com/": ["c1exchange.com"] + } + }, + { + "C3 Metrics": { + "http://c3metrics.com/": [ + "attributionmodel.com", + "c3metrics.com", + "c3tag.com" + ] + } + }, + { + "Cadreon": { + "http://www.cadreon.com/": ["cadreon.com"] + } + }, + { + "CampaignGrid": { + "http://www.campaigngrid.com/": ["campaigngrid.com"] + } + }, + { + "CAPITALDATA": { + "http://www.capitaldata.fr/": ["capitaldata.fr"] + } + }, + { + "Carambola": { + "https://www.carambola.com/": ["carambo.la"] + } + }, + { + "Caraytech": { + "http://www.caraytech.com.ar/": ["caraytech.com.ar", "e-planning.net"] + } + }, + { + "Cart.ro": { + "http://www.cart.ro/": ["cart.ro", "statistics.ro"] + } + }, + { + "CartsGuru": { + "https://carts.guru/": ["carts.guru"] + } + }, + { + "Casale Media": { + "http://www.casalemedia.com/": ["casalemedia.com", "medianet.com"] + } + }, + { + "CBproADS": { + "http://www.cbproads.com/": ["cbproads.com"] + } + }, + { + "Cedato": { + "https://www.cedato.com/": ["cedato.com"] + } + }, + { + "Chango": { + "http://www.chango.com/": ["chango.ca", "chango.com"] + } + }, + { + "ChannelAdvisor": { + "http://www.channeladvisor.com/": [ + "channeladvisor.com", + "searchmarketing.com" + ] + } + }, + { + "Channel Intelligence": { + "http://www.channelintelligence.com/": ["channelintelligence.com"] + } + }, + { + "Chartboost": { + "https://www.chartboost.com/": ["chartboost.com"] + } + }, + { + "CheckM8": { + "http://www.checkm8.com/": ["checkm8.com"] + } + }, + { + "Chitika": { + "http://chitika.com/": ["chitika.com", "chitika.net"] + } + }, + { + "ChoiceStream": { + "http://www.choicestream.com/": ["choicestream.com"] + } + }, + { + "ClearLink": { + "https://www.clearlink.com/": ["clearlink.com"] + } + }, + { + "ClearSaleing": { + "http://www.clearsaleing.com/": [ + "clearsaleing.com", + "csdata1.com", + "csdata2.com", + "csdata3.com" + ] + } + }, + { + "Clearsearch Media": { + "http://www.clearsearchmedia.com/": [ + "clearsearchmedia.com", + "csm-secure.com" + ] + } + }, + { + "ClearSight Interactive": { + "http://www.clearsightinteractive.com/": [ + "clearsightinteractive.com", + "csi-tracking.com" + ] + } + }, + { + "ClickAider": { + "http://clickaider.com/": ["clickaider.com"] + } + }, + { + "Clickayab": { + "http://www.clickyab.com": ["clickyab.com"] + } + }, + { + "Clickbooth": { + "http://www.clickbooth.com/": ["adtoll.com", "clickbooth.com"] + } + }, + { + "ClickDimensions": { + "http://www.clickdimensions.com/": ["clickdimensions.com"] + } + }, + { + "ClickDistrict": { + "http://www.clickdistrict.com/": [ + "clickdistrict.com", + "creative-serving.com" + ] + } + }, + { + "ClickFrog": { + "https://clickfrog.ru/": [ + "bashirian.biz", + "buckridge.link", + "clickfrog.ru", + "franecki.net", + "quitzon.net", + "reichelcormier.bid", + "wisokykulas.bid" + ] + } + }, + { + "ClickFuel": { + "http://clickfuel.com/": ["conversiondashboard.com"] + } + }, + { + "ClickInc": { + "http://www.clickinc.com/": ["clickinc.com"] + } + }, + { + "Clicksor": { + "http://www.clicksor.com/": ["clicksor.com", "clicksor.net"] + } + }, + { + "Clickwinks": { + "http://www.clickwinks.com/": ["clickwinks.com"] + } + }, + { + "ClicManager": { + "http://www.clicmanager.fr/": ["clicmanager.fr"] + } + }, + { + "Clixtell": { + "https://www.clixtell.com/": ["clixtell.com"] + } + }, + { + "Clove Network": { + "http://www.clovenetwork.com/": ["clovenetwork.com"] + } + }, + { + "Cognitive Match": { + "http://www.cognitivematch.com/": [ + "cmads.com.tw", + "cmadsasia.com", + "cmadseu.com", + "cmmeglobal.com", + "cognitivematch.com" + ] + } + }, + { + "Collective": { + "http://collective.com/": [ + "collective-media.net", + "collective.com", + "oggifinogi.com", + "tumri.com", + "tumri.net", + "yt1187.net" + ] + } + }, + { + "Commission Junction": { + "http://www.cj.com/": [ + "apmebf.com", + "awltovhc.com", + "cj.com", + "ftjcfx.com", + "kcdwa.com", + "qksz.com", + "qksz.net", + "tqlkg.com", + "yceml.net" + ] + } + }, + { + "Communicator Corp": { + "http://www.communicatorcorp.com/": ["communicatorcorp.com"] + } + }, + { + "Compass Labs": { + "http://compasslabs.com/": ["compasslabs.com"] + } + }, + { + "Complex Media": { + "http://www.complexmedianetwork.com/": [ + "complex.com", + "complexmedianetwork.com" + ] + } + }, + { + "comScore": { + "http://www.comscore.com/": [ + "adxpose.com", + "proxilinks.com", + "proximic.com", + "proximic.net" + ] + } + }, + { + "Connatix.com": { + "https://connatix.com/": ["connatix.com"] + } + }, + { + "Connexity": { + "http://www.connexity.com/": ["pricegrabber.com"] + } + }, + { + "Consilium Media": { + "http://www.consiliummedia.com/": ["consiliummedia.com"] + } + }, + { + "Consumable": { + "http://consumable.com/": ["consumable.com"] + } + }, + { + "CONTAXE": { + "http://www.contaxe.com/": ["contaxe.com"] + } + }, + { + "ContentABC": { + "http://contentabc.com/": ["contentabc.com"] + } + }, + { + "CONTEXTin": { + "http://www.contextin.com/": ["admailtiser.com", "contextin.com"] + } + }, + { + "ContextuAds": { + "http://www.contextuads.com/": [ + "agencytradingdesk.net", + "contextuads.com" + ] + } + }, + { + "CONTEXTWEB": { + "http://www.contextweb.com/": ["contextweb.com"] + } + }, + { + "ConvergeDirect": { + "http://www.convergedirect.com/": [ + "convergedirect.com", + "convergetrack.com" + ] + } + }, + { + "ConversantMedia": { + "http://conversantmedia.com": [ + "adserver.com", + "conversantmedia.com", + "dotomi.com", + "dtmpub.com", + "emjcd.com", + "fastclick.com", + "fastclick.net", + "greystripe.com", + "lduhtrp.net", + "mediaplex.com", + "valueclick.com", + "valueclick.net", + "valueclickmedia.com" + ] + } + }, + { + "ConversionRuler": { + "http://www.conversionruler.com/": ["conversionruler.com"] + } + }, + { + "Conversive": { + "http://www.conversive.nl/": ["conversive.nl"] + } + }, + { + "CoreMotives": { + "http://coremotives.com/": ["coremotives.com"] + } + }, + { + "Cox Digital Solutions": { + "http://www.coxdigitalsolutions.com/": [ + "adify.com", + "afy11.net", + "coxdigitalsolutions.com" + ] + } + }, + { + "CPMStar": { + "http://www.cpmstar.com/": ["cpmstar.com"] + } + }, + { + "CPX Interactive": { + "http://www.cpxinteractive.com/": [ + "adreadypixels.com", + "cpxadroit.com", + "cpxinteractive.com" + ] + } + }, + { + "Creafi": { + "http://www.creafi.com/": ["creafi.com"] + } + }, + { + "Crimtan": { + "http://www.crimtan.com/": ["crimtan.com"] + } + }, + { + "Crisp Media": { + "http://www.crispmedia.com/": ["crispmedia.com"] + } + }, + { + "Criteo": { + "http://www.criteo.com/": [ + "criteo.com", + "criteo.net", + "hlserve.com", + "hooklogic.com", + "storetail.io" + ] + } + }, + { + "Cross Pixel": { + "http://crosspixel.net/": [ + "crosspixel.net", + "crosspixelmedia.com", + "crsspxl.com" + ] + } + }, + { + "cXense": { + "http://www.cxense.com/": [ + "cxense.com", + "emediate.biz", + "emediate.com", + "emediate.dk", + "emediate.eu" + ] + } + }, + { + "Cyberplex": { + "http://www.cyberplex.com/": ["cyberplex.com"] + } + }, + { + "Dada": { + "http://dada.pro/": ["dada.pro", "simply.com"] + } + }, + { + "Datalogix": { + "http://www.datalogix.com/": ["nexac.com", "nextaction.net"] + } + }, + { + "DataXu": { + "http://www.dataxu.com/": [ + "dataxu.com", + "dataxu.net", + "mexad.com", + "w55c.net" + ] + } + }, + { + "Datonics": { + "http://datonics.com/": ["datonics.com", "pro-market.net"] + } + }, + { + "Datran Media": { + "http://www.datranmedia.com/": [ + "datranmedia.com", + "displaymarketplace.com" + ] + } + }, + { + "Datvantage": { + "http://datvantage.com/": ["datvantage.com"] + } + }, + { + "DC Storm": { + "http://www.dc-storm.com/": ["dc-storm.com", "stormiq.com"] + } + }, + { + "Dedicated Media": { + "http://www.dedicatedmedia.com/": [ + "dedicatedmedia.com", + "dedicatednetworks.com" + ] + } + }, + { + "Delivr": { + "http://delivr.com/": ["delivr.com", "percentmobile.com"] + } + }, + { + "Delta Projects": { + "http://www.deltaprojects.se/": [ + "adaction.se", + "de17a.com", + "deltaprojects.se" + ] + } + }, + { + "Demand Media": { + "http://www.demandmedia.com/": ["demandmedia.com", "indieclick.com"] + } + }, + { + "Deutsche Post DHL": { + "http://www.dp-dhl.com/": ["adcloud.com", "adcloud.net", "dp-dhl.com"] + } + }, + { + "Developer Media": { + "http://developermedia.com/": ["developermedia.com", "lqcdn.com"] + } + }, + { + "DG": { + "http://www.dgit.com/": [ + "dgit.com", + "eyeblaster.com", + "eyewonder.com", + "mdadx.com", + "serving-sys.com", + "unicast.com" + ] + } + }, + { + "dianomi": { + "http://www.dianomi.com/": ["dianomi.com"] + } + }, + { + "Didit": { + "http://www.didit.com/": ["did-it.com", "didit.com"] + } + }, + { + "DigitalAdConsortium": { + "https://www.dac.co.jp/": ["impact-ad.jp"] + } + }, + { + "Digital River": { + "http://www.digitalriver.com/": [ + "digitalriver.com", + "keywordmax.com", + "netflame.cc" + ] + } + }, + { + "Digital Target": { + "http://digitaltarget.ru": ["digitaltarget.ru"] + } + }, + { + "Digitize": { + "http://www.digitize.ie/": ["digitize.ie"] + } + }, + { + "DirectAdvert": { + "http://www.directadvert.ru/": ["directadvert.ru"] + } + }, + { + "Direct Response Group": { + "http://www.directresponsegroup.com/": [ + "directresponsegroup.com", + "ppctracking.net" + ] + } + }, + { + "Directtrack": { + "http://directtrack.com/": ["directtrack.com"] + } + }, + { + "Disqus": { + "http://disqus.com/": ["disqusads.com"] + } + }, + { + "DistrictM": { + "https://districtm.net": ["districtm.io"] + } + }, + { + "dmpxs": { + "http://bob.dmpxs.com": ["dmpxs.com"] + } + }, + { + "DoublePimp": { + "http://doublepimp.com/": ["doublepimp.com"] + } + }, + { + "DoublePositive": { + "http://www.doublepositive.com/": [ + "bid-tag.com", + "doublepositive.com" + ] + } + }, + { + "Drawbridge": { + "http://drawbrid.ge/": ["adsymptotic.com", "drawbrid.ge"] + } + }, + { + "DS-IQ": { + "http://www.ds-iq.com/": ["ds-iq.com"] + } + }, + { + "DSNR Group": { + "http://www.dsnrmg.com/": [ + "dsnrgroup.com", + "dsnrmg.com", + "traffiliate.com", + "z5x.com", + "z5x.net" + ] + } + }, + { + "DynAdmic": { + "https://dynadmic.com/": ["dynadmic.com", "dyntrk.com"] + } + }, + { + "DynamicOxygen": { + "http://www.dynamicoxygen.com/": [ + "dynamicoxygen.com", + "exitjunction.com" + ] + } + }, + { + "DynamicYield": { + "https://www.dynamicyield.com/": [ + "px-eu.dynamicyield.com", + "px.dynamicyield.com" + ] + } + }, + { + "Earnify": { + "http://earnify.com/": ["earnify.com"] + } + }, + { + "eBay": { + "http://www.ebay.com/": ["ebay.com"] + } + }, + { + "Effective Measure": { + "http://www.effectivemeasure.com/": [ + "effectivemeasure.com", + "effectivemeasure.net" + ] + } + }, + { + "ekolay": { + "http://www.ekolay.net/": ["e-kolay.net", "ekolay.net"] + } + }, + { + "Eleavers": { + "http://eleavers.com/": ["eleavers.com"] + } + }, + { + "Emego": { + "http://www.usemax.de/": ["usemax.de"] + } + }, + { + "Emerse": { + "https://www.emerse.com": ["emerse.com"] + } + }, + { + "EMX": { + "https://emxdigital.com/": [ + "brealtime.com", + "clearstream.tv", + "emxdgt.com", + "emxdigital.com" + ] + } + }, + { + "Enecto": { + "http://www.enecto.com/": ["enecto.com"] + } + }, + { + "engage:BDR": { + "http://engagebdr.com/": ["bnmla.com", "engagebdr.com"] + } + }, + { + "Engago Technology": { + "http://www.engago.com/": ["appmetrx.com", "engago.com"] + } + }, + { + "Engine Network": { + "http://enginenetwork.com/": ["enginenetwork.com"] + } + }, + { + "Ensighten": { + "http://www.ensighten.com/": ["ensighten.com"] + } + }, + { + "Entireweb": { + "http://www.entireweb.com/": ["entireweb.com"] + } + }, + { + "Epic Media Group": { + "http://www.theepicmediagroup.com/": [ + "epicadvertising.com", + "epicmarketplace.com", + "epicmobileads.com", + "theepicmediagroup.com", + "trafficmp.com" + ] + } + }, + { + "Epsilon": { + "http://www.epsilon.com/": ["epsilon.com"] + } + }, + { + "EQ Ads": { + "http://www.eqads.com/": ["eqads.com"] + } + }, + { + "EroAdvertising": { + "http://www.ero-advertising.com/": ["ero-advertising.com"] + } + }, + { + "Etarget": { + "http://etargetnet.com/": ["etarget.eu", "etargetnet.com"] + } + }, + { + "Etineria": { + "http://www.etineria.com/": ["adwitserver.com", "etineria.com"] + } + }, + { + "eTrigue": { + "http://www.etrigue.com/": ["etrigue.com"] + } + }, + { + "Evergage": { + "http://www.evergage.com": ["mybuys.com", "veruta.com"] + } + }, + { + "Everyday Health": { + "http://www.everydayhealth.com/": [ + "everydayhealth.com", + "waterfrontmedia.com" + ] + } + }, + { + "Evisions Marketing": { + "http://www.evisionsmarketing.com/": [ + "engineseeker.com", + "evisionsmarketing.com" + ] + } + }, + { + "Evolve": { + "http://www.evolvemediacorp.com/": [ + "evolvemediacorp.com", + "evolvemediametrics.com", + "gorillanation.com" + ] + } + }, + { + "eWayDirect": { + "http://www.ewaydirect.com/": ["ewaydirect.com", "ixs1.net"] + } + }, + { + "ewebse": { + "http://ewebse.com/": ["777seo.com", "ewebse.com"] + } + }, + { + "excitad": { + "http://excitad.com/": ["excitad.com"] + } + }, + { + "eXelate": { + "http://exelate.com/": ["exelate.com", "exelator.com"] + } + }, + { + "ExoClick": { + "http://www.exoclick.com/": ["exoclick.com"] + } + }, + { + "Exosrv": { + "http://main.exosrv.com/": ["exosrv.com"] + } + }, + { + "Experian": { + "http://www.experian.com/": ["audienceiq.com", "experian.com"] + } + }, + { + "expo-MAX": { + "http://expo-max.com/": ["expo-max.com"] + } + }, + { + "Exponential Interactive": { + "http://www.exponential.com/": [ + "adotube.com", + "exponential.com", + "fulltango.com", + "tribalfusion.com" + ] + } + }, + { + "Extension Factory": { + "http://www.extensionfactory.com/": ["extensionfactory.com"] + } + }, + { + "EXTENSIONS.RU": { + "http://extensions.ru/": ["extensions.ru"] + } + }, + { + "Eyeconomy": { + "http://www.eyeconomy.co.uk/": [ + "eyeconomy.co.uk", + "eyeconomy.com", + "sublimemedia.net" + ] + } + }, + { + "EyeNewton": { + "http://eyenewton.ru/": ["eyenewton.ru"] + } + }, + { + "eyeReturn Marketing": { + "http://www.eyereturnmarketing.com/": [ + "eyereturn.com", + "eyereturnmarketing.com" + ] + } + }, + { + "Eyeviewdigital": { + "http://www.eyeviewdigital.com/": ["eyeviewdigital.com"] + } + }, + { + "Facebook": { + "http://www.facebook.com/": ["atlassolutions.com"] + } + }, + { + "Facilitate Digital": { + "http://www.facilitatedigital.com/": [ + "adsfac.eu", + "adsfac.info", + "adsfac.net", + "adsfac.sg", + "adsfac.us", + "facilitatedigital.com" + ] + } + }, + { + "Fairfax Media": { + "http://www.fxj.com.au/": ["fairfax.com.au", "fxj.com.au"] + } + }, + { + "faithadnet": { + "http://www.faithadnet.com/": ["faithadnet.com"] + } + }, + { + "Fanplayr": { + "https://fanplayr.com/": ["fanplayr.com"] + } + }, + { + "Fathom": { + "http://www.fathomdelivers.com/": [ + "fathomdelivers.com", + "fathomseo.com" + ] + } + }, + { + "Federated Media": { + "http://www.federatedmedia.net/": [ + "federatedmedia.net", + "fmpub.net", + "lijit.com" + ] + } + }, + { + "FetchBack": { + "http://www.fetchback.com/": ["fetchback.com"] + } + }, + { + "Fiksu": { + "http://www.fiksu.com/": ["fiksu.com"] + } + }, + { + "FinancialContent": { + "http://www.financialcontent.com/": ["financialcontent.com"] + } + }, + { + "Fizz-Buzz Media": { + "http://www.fizzbuzzmedia.com/": [ + "fizzbuzzmedia.com", + "fizzbuzzmedia.net" + ] + } + }, + { + "Flashtalking": { + "http://www.flashtalking.com/": ["flashtalking.com"] + } + }, + { + "Flite": { + "http://www.flite.com/": ["flite.com", "widgetserver.com"] + } + }, + { + "Fluct": { + "https://corp.fluct.jp/": ["adingo.jp", "fluct.jp"] + } + }, + { + "Flytxt": { + "http://www.flytxt.com/": ["flytxt.com"] + } + }, + { + "Forbes": { + "http://www.forbes.com/": ["brandsideplatform.com", "forbes.com"] + } + }, + { + "Fox One Stop Media": { + "http://www.foxonestop.com/": [ + "fimserve.com", + "foxnetworks.com", + "foxonestop.com", + "mobsmith.com", + "myads.com", + "othersonline.com" + ] + } + }, + { + "FreakOut": { + "http://fout.jp/": ["fout.jp"] + } + }, + { + "Freedom Communications": { + "http://www.freedom.com/": ["freedom.com"] + } + }, + { + "FreeWheel": { + "http://www.freewheel.tv/": ["stickyadstv.com"] + } + }, + { + "FriendFinder Networks": { + "http://ffn.com/": ["adultfriendfinder.com", "ffn.com", "pop6.com"] + } + }, + { + "Friends2Follow": { + "https://friends2follow.com/": ["tracking.friends2follow.com"] + } + }, + { + "Frog Sex": { + "http://www.frogsex.com/": ["double-check.com", "frogsex.com"] + } + }, + { + "FuelX": { + "https://fuelx.com/": ["fuel451.com", "fuelx.com"] + } + }, + { + "Future Ads": { + "https://www.futureads.com/": ["futureads.com", "resultlinks.com"] + } + }, + { + "Fyber": { + "https://www.fyber.com/": ["fyber.com"] + } + }, + { + "Game Advertising Online": { + "http://www.game-advertising-online.com/": [ + "game-advertising-online.com" + ] + } + }, + { + "Games2win": { + "http://www.games2win.com/": ["games2win.com", "inviziads.com"] + } + }, + { + "Gamned": { + "http://www.gamned.com/": ["gamned.com"] + } + }, + { + "Gannett": { + "http://www.gannett.com/": ["gannett.com", "pointroll.com"] + } + }, + { + "GB-World": { + "http://www.gb-world.net/": ["gb-world.net"] + } + }, + { + "Gemius": { + "http://www.gemius.com/": ["gemius.com", "gemius.pl"] + } + }, + { + "Genesis Media": { + "http://www.genesismedia.com/": [ + "genesismedia.com", + "genesismediaus.com" + ] + } + }, + { + "GENIEE": { + "https://geniee.co.jp/": ["geniee.co.jp", "gssprt.jp"] + } + }, + { + "GENIE GROUP": { + "http://www.geniegroupltd.co.uk/": ["geniegroupltd.co.uk"] + } + }, + { + "GeoAds": { + "http://www.geoads.com/": ["geoads.com"] + } + }, + { + "GetGlue": { + "http://getglue.com/": ["getglue.com", "smrtlnks.com"] + } + }, + { + "GetIntent": { + "http://getintent.com/": ["adhigh.net", "getintent.com"] + } + }, + { + "GISMAds": { + "http://www.gismads.jp/": ["gismads.jp"] + } + }, + { + "Glam Media": { + "http://www.glammedia.com/": ["glam.com", "glammedia.com"] + } + }, + { + "Gleam": { + "https://gleam.io/": ["fraudjs.io", "gleam.io"] + } + }, + { + "Globe7": { + "http://www.globe7.com/": ["globe7.com"] + } + }, + { + "GoDataFeed": { + "http://godatafeed.com/": ["godatafeed.com"] + } + }, + { + "Goldbach": { + "http://www.goldbachgroup.com/": ["goldbach.com", "goldbachgroup.com"] + } + }, + { + "GoldSpot Media": { + "http://www.goldspotmedia.com/": ["goldspotmedia.com"] + } + }, + { + "Google": { + "http://www.google.com/": [ + "2mdn.net", + "admeld.com", + "admob.com", + "adservice.google.ca", + "adservice.google.com", + "adwords.google.com", + "cc-dt.com", + "destinationurl.com", + "doubleclick.net", + "googleadservices.com", + "googlesyndication.com", + "googletagservices.com", + "invitemedia.com", + "smtad.net", + "teracent.com", + "teracent.net", + "ytsa.net" + ] + } + }, + { + "Grapeshot": { + "http://www.grapeshot.co.uk/": ["grapeshot.co.uk"] + } + }, + { + "Graphnium": { + "https://www.graphinium.com/": ["crm4d.com"] + } + }, + { + "Grocery Shopping Network": { + "http://www.groceryshopping.net/": ["groceryshopping.net"] + } + }, + { + "GroovinAds": { + "http://www.groovinads.com/": ["groovinads.com"] + } + }, + { + "Gruner + Jahr": { + "http://www.guj.de/": ["guj.de", "ligatus.com"] + } + }, + { + "GumGum": { + "http://gumgum.com/": ["gumgum.com"] + } + }, + { + "Gunggo": { + "http://www.gunggo.com/": ["gunggo.com"] + } + }, + { + "Hands Mobile": { + "http://www.hands.com.br/": ["hands.com.br"] + } + }, + { + "Harrenmedia": { + "http://www.harrenmedia.com/": [ + "harrenmedia.com", + "harrenmedianetwork.com" + ] + } + }, + { + "HealthPricer": { + "http://www.healthpricer.com/": ["adacado.com", "healthpricer.com"] + } + }, + { + "Hearst": { + "http://www.hearst.com/": [ + "hearst.com", + "ic-live.com", + "iclive.com", + "icrossing.com", + "sptag.com", + "sptag1.com", + "sptag2.com", + "sptag3.com" + ] + } + }, + { + "HilltopAds": { + "https://hilltopads.com/": [ + "hilltopads.com", + "hilltopads.net", + "shoporielder.pro" + ] + } + }, + { + "Hi-media": { + "http://www.hi-media.com/": ["comclick.com", "hi-media.com"] + } + }, + { + "Horyzon Media": { + "http://www.horyzon-media.com/": ["horyzon-media.com"] + } + }, + { + "HotMart": { + "https://www.hotmart.com/en/": ["hotmart.com"] + } + }, + { + "HOTWords": { + "http://www.hotwords.com/": ["hotwords.com", "hotwords.es"] + } + }, + { + "HP": { + "http://www.hp.com/": ["hp.com", "optimost.com"] + } + }, + { + "Httpool": { + "http://www.httpool.com/": ["httpool.com"] + } + }, + { + "HUNT Mobile Ads": { + "http://www.huntmads.com/": ["huntmads.com"] + } + }, + { + "Hurra.com": { + "http://www.hurra.com/": ["hurra.com"] + } + }, + { + "IAB": { + "https://iabtechlab.com/": ["digitru.st"] + } + }, + { + "IAC": { + "http://www.iac.com/": ["iac.com", "iacadvertising.com"] + } + }, + { + "iBehavior": { + "http://www.i-behavior.com/": ["i-behavior.com", "ib-ibi.com"] + } + }, + { + "IBM": { + "http://www.ibm.com/": ["unica.com"] + } + }, + { + "ID5": { + "http://id5.io/": ["id5-sync.com"] + } + }, + { + "IDG": { + "http://www.idg.com/": ["idg.com", "idgtechnetwork.com"] + } + }, + { + "iEntry": { + "http://www.ientry.com/": ["600z.com", "ientry.com"] + } + }, + { + "IgnitAd": { + "http://www.ignitad.com/": ["ignitad.com"] + } + }, + { + "IgnitionOne": { + "http://www.ignitionone.com/": [ + "ignitionone.com", + "ignitionone.net", + "searchignite.com" + ] + } + }, + { + "Improve Digital": { + "www.improvedigital.com/": ["360yield.com", "improvedigital.com"] + } + }, + { + "Inadco": { + "http://www.inadco.com/": [ + "anadcoads.com", + "inadco.com", + "inadcoads.com" + ] + } + }, + { + "IndexExchange": { + "https://www.indexexchange.com": ["indexexchange.com"] + } + }, + { + "Infectious Media": { + "http://www.infectiousmedia.com/": [ + "impressiondesk.com", + "infectiousmedia.com" + ] + } + }, + { + "Inflection Point Media": { + "http://www.inflectionpointmedia.com/": ["inflectionpointmedia.com"] + } + }, + { + "Infogroup": { + "http://www.infogroup.com/": ["infogroup.com"] + } + }, + { + "Infolinks": { + "http://www.infolinks.com/": ["infolinks.com"] + } + }, + { + "Infra-Ad": { + "http://www.infra-ad.com/": ["infra-ad.com"] + } + }, + { + "InMobi": { + "http://www.inmobi.com/": [ + "aerserv.com", + "inmobi.com", + "sproutinc.com" + ] + } + }, + { + "inneractive": { + "http://inner-active.com/": ["inner-active.com"] + } + }, + { + "Innity": { + "http://innity.com/": ["innity.com"] + } + }, + { + "InsightExpress": { + "http://www.insightexpress.com/": [ + "insightexpress.com", + "insightexpressai.com" + ] + } + }, + { + "InSkin Media": { + "http://inskinmedia.com/": ["inskinmedia.com"] + } + }, + { + "Instinctive": { + "https://instinctive.io/": ["instinctive.io", "instinctiveads.com"] + } + }, + { + "Integral Ad Science": { + "https://integralads.com/": [ + "adsafemedia.com", + "adsafeprotected.com", + "iasds01.com", + "integralads.com" + ] + } + }, + { + "Intent Media": { + "http://www.intentmedia.com/": ["intentmedia.com", "intentmedia.net"] + } + }, + { + "Intergi": { + "http://intergi.com/": ["intergi.com"] + } + }, + { + "Intermarkets": { + "http://www.intermarkets.net/": ["intermarkets.net"] + } + }, + { + "Intermundo Media": { + "http://intermundomedia.com/": ["intermundomedia.com"] + } + }, + { + "Internet Brands": { + "http://www.internetbrands.com/": ["ibpxl.com", "internetbrands.com"] + } + }, + { + "Interpolls": { + "http://www.interpolls.com/": ["interpolls.com"] + } + }, + { + "Inuvo": { + "http://inuvo.com/": ["inuvo.com"] + } + }, + { + "InvestingChannel": { + "http://investingchannel.com/": ["investingchannel.com"] + } + }, + { + "IponWeb": { + "https://www.iponweb.com/": ["iponweb.com", "iponweb.net"] + } + }, + { + "iPROM": { + "http://www.iprom.si/": [ + "centraliprom.com", + "iprom.net", + "iprom.si", + "mediaiprom.com" + ] + } + }, + { + "iPromote": { + "http://www.ipromote.com/": ["ipromote.com"] + } + }, + { + "iProspect": { + "http://www.iprospect.com/": ["clickmanage.com", "iprospect.com"] + } + }, + { + "ISI Technologies": { + "http://digbro.com/": ["adversalservers.com", "digbro.com"] + } + }, + { + "ismatlab.com": { + "http://ismatlab.com": ["ismatlab.com"] + } + }, + { + "I.UA": { + "http://www.i.ua/": ["i.ua"] + } + }, + { + "Jaroop": { + "http://www.jaroop.com/": ["jaroop.com"] + } + }, + { + "JasperLabs": { + "http://www.jasperlabs.com/": ["jasperlabs.com"] + } + }, + { + "Jemm": { + "http://jemmgroup.com/": ["jemmgroup.com"] + } + }, + { + "Jink": { + "http://www.jink.de/": ["jink.de", "jinkads.com"] + } + }, + { + "Jirbo": { + "http://jirbo.com/": ["adcolony.com", "jirbo.com"] + } + }, + { + "Jivox": { + "http://www.jivox.com/": ["jivox.com"] + } + }, + { + "JobThread": { + "http://www.jobthread.com/": ["jobthread.com"] + } + }, + { + "JuicyAds": { + "http://www.juicyads.com/": ["juicyads.com"] + } + }, + { + "Jumptap": { + "http://www.jumptap.com/": ["jumptap.com"] + } + }, + { + "justuno": { + "https://www.justuno.com/": ["justuno.com"] + } + }, + { + "Kargo": { + "https://kargo.com/": ["kargo.com"] + } + }, + { + "Kenshoo": { + "http://www.kenshoo.com/": ["kenshoo.com", "xg4ken.com"] + } + }, + { + "Keyade": { + "http://www.keyade.com/": ["keyade.com"] + } + }, + { + "Keywee": { + "https://keywee.co": ["keywee.co"] + } + }, + { + "KissMyAds": { + "http://kissmyads.com/": ["kissmyads.com"] + } + }, + { + "Kitara Media": { + "http://www.kitaramedia.com/": ["103092804.com", "kitaramedia.com"] + } + }, + { + "KIT digital": { + "http://kitd.com/": ["keewurd.com", "kitd.com", "peerset.com"] + } + }, + { + "Kokteyl": { + "http://www.kokteyl.com/": ["admost.com", "kokteyl.com"] + } + }, + { + "Komli": { + "http://www.komli.com/": ["komli.com"] + } + }, + { + "Kontera": { + "http://www.kontera.com/": ["kontera.com"] + } + }, + { + "Korrelate": { + "http://korrelate.com/": [ + "adsummos.com", + "adsummos.net", + "korrelate.com" + ] + } + }, + { + "Krux": { + "http://www.krux.com/": ["krux.com", "kruxdigital.com", "krxd.net"] + } + }, + { + "Lakana": { + "http://www.lakana.com/": ["ibsys.com", "lakana.com"] + } + }, + { + "Layer-Ad.org": { + "http://layer-ad.org/": ["layer-ad.org"] + } + }, + { + "Layer Ads": { + "http://layer-ads.net/": ["layer-ads.net"] + } + }, + { + "LeadBolt": { + "http://www.leadbolt.com/": ["leadbolt.com"] + } + }, + { + "LeadFormix": { + "http://www.leadformix.com/": ["leadforce1.com", "leadformix.com"] + } + }, + { + "LeanPlum": { + "https://www.leanplum.com/": ["leanplum.com"] + } + }, + { + "Legolas Media": { + "http://www.legolas-media.com/": ["legolas-media.com"] + } + }, + { + "Levexis": { + "http://www.levexis.com/": ["levexis.com"] + } + }, + { + "Lexos Media": { + "http://www.lexosmedia.com/": ["adbull.com", "lexosmedia.com"] + } + }, + { + "LifeStreet": { + "http://lifestreetmedia.com/": [ + "lfstmedia.com", + "lifestreetmedia.com" + ] + } + }, + { + "LinkConnector": { + "http://www.linkconnector.com/": ["linkconnector.com"] + } + }, + { + "LinkShare": { + "http://www.linkshare.com/": ["linkshare.com", "linksynergy.com"] + } + }, + { + "Linkz": { + "http://www.linkz.net/": ["linkz.net"] + } + }, + { + "Listrak": { + "http://www.listrak.com/": ["listrak.com", "listrakbi.com"] + } + }, + { + "LiveIntent": { + "http://www.liveintent.com/": ["liadm.com", "liveintent.com"] + } + }, + { + "LiveInternet": { + "http://www.liveinternet.ru": ["liveinternet.ru", "yadro.ru"] + } + }, + { + "LiveRamp": { + "https://liveramp.com/": ["liveramp.com", "tvpixel.com"] + } + }, + { + "LKQD": { + "http://lkqd.com": ["lkqd.com", "lkqd.net"] + } + }, + { + "Local Yokel Media": { + "http://www.localyokelmedia.com/": ["localyokelmedia.com"] + } + }, + { + "Localytics": { + "https://www.localytics.com/": ["localytics.com"] + } + }, + { + "LockerDome": { + "https://lockerdome.com/": ["lockerdome.com"] + } + }, + { + "Longboard Media": { + "http://longboardmedia.com/": ["longboardmedia.com"] + } + }, + { + "Loomia": { + "http://www.loomia.com/": ["loomia.com"] + } + }, + { + "LoopFuse": { + "https://www.loopfuse.net/": ["lfov.net", "loopfuse.net"] + } + }, + { + "LoopMe": { + "https://loopme.com/": ["loopme.com"] + } + }, + { + "LotLinx": { + "https://www.lotlinx.com": ["lotlinx.com"] + } + }, + { + "Lower My Bills": { + "http://lowermybills.com": ["lowermybills.com"] + } + }, + { + "lptracker": { + "https://lptracker.io/": ["lptracker.io"] + } + }, + { + "LucidMedia": { + "http://www.lucidmedia.com/": ["lucidmedia.com"] + } + }, + { + "m6d": { + "http://m6d.com/": ["m6d.com", "media6degrees.com"] + } + }, + { + "Madhouse": { + "http://www.madhouse.cn/": ["madhouse.cn"] + } + }, + { + "Madison Logic": { + "http://www.madisonlogic.com/": ["dinclinx.com", "madisonlogic.com"] + } + }, + { + "madvertise": { + "http://madvertise.com/": ["madvertise.com"] + } + }, + { + "Magnetic": { + "http://www.magnetic.com/": [ + "domdex.com", + "domdex.net", + "magnetic.com", + "qjex.net" + ] + } + }, + { + "Magnify360": { + "http://www.magnify360.com/": ["dialogmgr.com", "magnify360.com"] + } + }, + { + "MailChimp": { + "http://mailchimp.com/": [ + "campaign-archive1.com", + "list-manage.com", + "mailchimp.com" + ] + } + }, + { + "Manifest": { + "http://www.manifest.ru/": ["bannerbank.ru", "manifest.ru"] + } + }, + { + "Marchex": { + "http://www.marchex.com/": ["industrybrains.com", "marchex.com"] + } + }, + { + "Marimedia": { + "http://www.marimedia.net/": ["marimedia.net"] + } + }, + { + "MarketGid": { + "http://www.marketgid.com/": ["dt00.net", "dt07.net", "marketgid.com"] + } + }, + { + "Marketo": { + "http://www.marketo.com/": ["marketo.com", "marketo.net"] + } + }, + { + "Martini Media": { + "http://martinimedianetwork.com/": [ + "martiniadnetwork.com", + "martinimedianetwork.com" + ] + } + }, + { + "mashero": { + "http://www.mashero.com/": ["mashero.com"] + } + }, + { + "Match.com": { + "http://www.match.com/": [ + "chemistry.com", + "match.com", + "meetic-partners.com" + ] + } + }, + { + "Matomy": { + "http://www.matomy.com/": [ + "adnetinteractive.com", + "adsmarket.com", + "matomy.com", + "matomymarket.com", + "matomymedia.com", + "mediawhiz.com", + "optimatic.com", + "xtendmedia.com" + ] + } + }, + { + "MaxBounty": { + "http://www.maxbounty.com/": ["maxbounty.com", "mb01.com"] + } + }, + { + "MaxPoint": { + "http://maxpointinteractive.com/": [ + "maxpointinteractive.com", + "maxusglobal.com", + "mxptint.net" + ] + } + }, + { + "MdotM": { + "http://mdotm.com/": ["mdotm.com"] + } + }, + { + "MediaBrix": { + "http://www.mediabrix.com/": ["mediabrix.com"] + } + }, + { + "MediaCom": { + "http://www.mediacom.com/": ["mediacom.com"] + } + }, + { + "mediaFORGE": { + "http://www.mediaforge.com/": ["mediaforge.com"] + } + }, + { + "Medialets": { + "http://www.medialets.com/": ["medialets.com"] + } + }, + { + "MediaMath": { + "http://www.mediamath.com/": [ + "adroitinteractive.com", + "designbloxlive.com", + "mathtag.com", + "mediamath.com" + ] + } + }, + { + "media.net": { + "http://www.media.net/": ["media.net"] + } + }, + { + "Mediaocean": { + "http://www.mediaocean.com/": ["adbuyer.com", "mediaocean.com"] + } + }, + { + "MediaShakers": { + "http://www.mediashakers.com/": [ + "media-servers.net", + "mediashakers.com" + ] + } + }, + { + "MediaTrust": { + "http://www.mediatrust.com/": ["mediatrust.com"] + } + }, + { + "Medicx Media Solutions": { + "http://www.medicxmedia.com/": ["medicxmedia.com"] + } + }, + { + "MegaIndex": { + "http://www.megaindex.ru/": ["megaindex.ru"] + } + }, + { + "Mercent": { + "http://www.mercent.com/": ["mercent.com"] + } + }, + { + "MerchantAdvantage": { + "http://www.merchantadvantage.com/": ["merchantadvantage.com"] + } + }, + { + "Merchenta": { + "http://www.merchenta.com/": ["merchenta.com"] + } + }, + { + "Merkle": { + "https://www.merkleinc.com/": ["rimmkaufman.com", "rkdms.com"] + } + }, + { + "Meta Network": { + "http://www.metanetwork.com/": ["metanetwork.com"] + } + }, + { + "Meteor": { + "http://www.meteorsolutions.com/": ["meteorsolutions.com"] + } + }, + { + "MetrixLab": { + "https://www.metrixlab.com": [ + "adoftheyear.com", + "crm-metrix.com", + "customerconversio.com", + "metrixlab.com", + "opinionbar.com" + ] + } + }, + { + "MicroAd": { + "http://www.microad.jp/": ["microad.jp"] + } + }, + { + "Microsoft": { + "http://www.microsoft.com/": [ + "adbureau.net", + "adecn.com", + "aquantive.com", + "msads.net", + "netconversions.com", + "roiservice.com" + ] + } + }, + { + "Millennial Media": { + "http://www.millennialmedia.com/": [ + "decktrade.com", + "millennialmedia.com", + "mydas.mobi" + ] + } + }, + { + "Mindset Media": { + "http://www.mindset-media.com/": ["mindset-media.com", "mmismm.com"] + } + }, + { + "Mirando": { + "http://www.mirando.de/": ["mirando.de"] + } + }, + { + "Mixpo": { + "http://www.mixpo.com/": ["mixpo.com"] + } + }, + { + "Moat": { + "http://www.moat.com/": ["moat.com", "moatads.com"] + } + }, + { + "MobFox": { + "http://www.mobfox.com/": ["mobfox.com"] + } + }, + { + "Mobials": { + "http://mobials.com": ["mobials.com"] + } + }, + { + "MobileAdTrading": { + "https://mobileadtrading.com/": ["mobileadtrading.com"] + } + }, + { + "Mobile Meteor": { + "http://mobilemeteor.com/": ["mobilemeteor.com", "showmeinn.com"] + } + }, + { + "Mobile Storm": { + "http://mobilestorm.com/": ["mobilestorm.com"] + } + }, + { + "MobVision": { + "http://www.mobvision.com/": ["admoda.com", "mobvision.com"] + } + }, + { + "Mocean Mobile": { + "http://www.moceanmobile.com/": ["moceanmobile.com"] + } + }, + { + "Mochila": { + "http://www.mochila.com/": ["mochila.com"] + } + }, + { + "Mojiva": { + "http://www.mojiva.com/": ["mojiva.com"] + } + }, + { + "Monetate": { + "http://monetate.com/": ["monetate.com", "monetate.net"] + } + }, + { + "MONETIZEdigital": { + "https://www.cpalead.com/": ["cpalead.com"] + } + }, + { + "Monetize More": { + "http://monetizemore.com/": ["monetizemore.com"] + } + }, + { + "Monoloop": { + "http://www.monoloop.com/": ["monoloop.com"] + } + }, + { + "Monster": { + "http://www.monster.com/": ["monster.com"] + } + }, + { + "Moolah Media": { + "http://www.moolahmedia.com/": ["moolah-media.com", "moolahmedia.com"] + } + }, + { + "MoPub": { + "http://www.mopub.com/": ["mopub.com"] + } + }, + { + "MovieLush.com": { + "https://www.movielush.com/": ["affbuzzads.com", "movielush.com"] + } + }, + { + "Multiple Stream Media": { + "http://www.multiplestreammktg.com/": [ + "adclickmedia.com", + "multiplestreammktg.com" + ] + } + }, + { + "MUNDO Media": { + "http://www.mundomedia.com/": ["mundomedia.com", "silver-path.com"] + } + }, + { + "MyCounter": { + "http://mycounter.com.ua/": ["mycounter.com.ua"] + } + }, + { + "MyPressPlus": { + "http://www.mypressplus.com/": ["mypressplus.com", "ppjol.net"] + } + }, + { + "myThings": { + "http://www.mythings.com/": ["mythings.com", "mythingsmedia.com"] + } + }, + { + "MyWebGrocer": { + "http://www.mywebgrocer.com/": ["mywebgrocer.com"] + } + }, + { + "Nanigans": { + "http://www.nanigans.com/": ["nanigans.com"] + } + }, + { + "NativeAds": { + "https://nativeads.com/": ["nativeads.com"] + } + }, + { + "Nativo": { + "http://www.nativo.net/": ["postrelease.com"] + } + }, + { + "Navegg": { + "http://www.navegg.com/": ["navdmp.com", "navegg.com"] + } + }, + { + "NetAffiliation": { + "http://www.netaffiliation.com/": ["netaffiliation.com"] + } + }, + { + "NetBina": { + "http://www.netbina.com/": ["netbina.com"] + } + }, + { + "NetElixir": { + "http://www.netelixir.com/": ["adelixir.com", "netelixir.com"] + } + }, + { + "Netmining": { + "http://www.netmining.com/": ["netmining.com", "netmng.com"] + } + }, + { + "Net-Results": { + "http://www.net-results.com/": [ + "cdnma.com", + "net-results.com", + "nr7.us" + ] + } + }, + { + "NetSeer": { + "http://www.netseer.com/": ["netseer.com"] + } + }, + { + "NetShelter": { + "http://netshelter.com/": ["netshelter.com", "netshelter.net"] + } + }, + { + "Neustar": { + "http://www.neustar.biz/": ["adadvisor.net", "neustar.biz"] + } + }, + { + "newtention": { + "http://newtention.de/": [ + "newtention.de", + "newtention.net", + "newtentionassets.net" + ] + } + }, + { + "Nexage": { + "http://nexage.com/": ["nexage.com"] + } + }, + { + "Nextag": { + "http://www.nextag.com/": ["nextag.com"] + } + }, + { + "NextPerformance": { + "http://www.nextperformance.com/": [ + "nextperformance.com", + "nxtck.com" + ] + } + }, + { + "Nielsen": { + "http://www.nielsen.com/": ["imrworldwide.com", "imrworldwide.net"] + } + }, + { + "Ninua": { + "http://www.ninua.com/": ["networkedblogs.com", "ninua.com"] + } + }, + { + "Nokta": { + "http://www.noktamedya.com/": ["noktamedya.com", "virgul.com"] + } + }, + { + "NowSpots": { + "http://nowspots.com/": ["nowspots.com"] + } + }, + { + "nrelate": { + "http://nrelate.com/": ["nrelate.com"] + } + }, + { + "Nuffnang": { + "http://www.nuffnang.com.my/": ["nuffnang.com", "nuffnang.com.my"] + } + }, + { + "nugg.ad": { + "http://www.nugg.ad/": ["nugg.ad", "nuggad.net"] + } + }, + { + "Ohana Media": { + "http://www.ohana-media.com/": [ + "adohana.com", + "ohana-media.com", + "ohanaqb.com" + ] + } + }, + { + "Omnicom Group": { + "http://www.omnicomgroup.com/": [ + "accuenmedia.com", + "omnicomgroup.com", + "p-td.com" + ] + } + }, + { + "onAd": { + "http://www.onad.eu/": ["onad.eu"] + } + }, + { + "Onclusive": { + "https://onclusive.com/": ["airpr.com"] + } + }, + { + "OneAd": { + "https://www.onead.com.tw/": [ + "guoshipartners.com", + "onevision.com.tw" + ] + } + }, + { + "One iota": { + "http://www.itsoneiota.com/": ["itsoneiota.com", "oneiota.co.uk"] + } + }, + { + "Oneupweb": { + "http://www.oneupweb.com/": ["oneupweb.com", "sodoit.com"] + } + }, + { + "OnlineMetrix": { + "http://h.online-metrix.net": ["online-metrix.net"] + } + }, + { + "Open New Media": { + "http://www.onm.de/": ["onm.de"] + } + }, + { + "OpenX": { + "http://openx.com/": [ + "liftdna.com", + "openx.com", + "openx.net", + "openx.org", + "openxenterprise.com", + "servedbyopenx.com" + ] + } + }, + { + "Opera": { + "http://www.opera.com/": [ + "mobiletheory.com", + "opera.com", + "operamediaworks.com", + "operasoftware.com" + ] + } + }, + { + "OPT": { + "http://www.opt.ne.jp/": ["advg.jp", "opt.ne.jp", "p-advg.com"] + } + }, + { + "Optify": { + "http://www.optify.net/": ["optify.net"] + } + }, + { + "Optimal": { + "http://optim.al/": [ + "cpmadvisors.com", + "cpmatic.com", + "nprove.com", + "optim.al", + "orbengine.com", + "xa.net" + ] + } + }, + { + "OptimumResponse": { + "http://www.optimumresponse.com/": ["optimumresponse.com"] + } + }, + { + "OptinMonster": { + "https://optinmonster.com/": ["optinmonster.com", "optnmstr.com"] + } + }, + { + "OptMD": { + "http://optmd.com/": ["optmd.com"] + } + }, + { + "Oracle": { + "http://www.oracle.com/": ["estara.com"] + } + }, + { + "OrangeSoda": { + "http://www.orangesoda.com/": ["orangesoda.com", "otracking.com"] + } + }, + { + "Outbrain": { + "http://www.outbrain.com/": [ + "outbrain.com", + "sphere.com", + "visualrevenue.com" + ] + } + }, + { + "Out There Media": { + "http://www.out-there-media.com/": ["out-there-media.com"] + } + }, + { + "Oversee.net": { + "http://www.oversee.net/": ["dsnextgen.com", "oversee.net"] + } + }, + { + "OwnerIQ": { + "http://www.owneriq.com/": ["owneriq.com", "owneriq.net"] + } + }, + { + "OxaMedia": { + "http://www.oxamedia.com/": [ + "adconnexa.com", + "adsbwm.com", + "oxamedia.com" + ] + } + }, + { + "PageFair": { + "https://pagefair.com/": ["pagefair.com", "pagefair.net"] + } + }, + { + "Paid-To-Promote.net": { + "http://www.paid-to-promote.net/": ["paid-to-promote.net"] + } + }, + { + "Pardot": { + "http://www.pardot.com/": ["pardot.com"] + } + }, + { + "PayHit": { + "http://www.payhit.com/": ["payhit.com"] + } + }, + { + "Paypopup.com": { + "http://www.paypopup.com/": ["lzjl.com", "paypopup.com"] + } + }, + { + "PebblePost": { + "https://www.pebblepost.com/": ["pbbl.co"] + } + }, + { + "Peer39": { + "http://www.peer39.com/": ["peer39.com", "peer39.net"] + } + }, + { + "PeerFly": { + "http://peerfly.com/": ["peerfly.com"] + } + }, + { + "Performancing": { + "http://performancing.com/": ["performancing.com"] + } + }, + { + "PerimeterX": { + "https://www.perimeterx.com": ["perimeterx.net"] + } + }, + { + "Pheedo": { + "http://site.pheedo.com/": ["pheedo.com"] + } + }, + { + "Pictela": { + "http://www.pictela.com/": ["pictela.com", "pictela.net"] + } + }, + { + "PinPoll": { + "https://pinpoll.com/": ["pinpoll.com"] + } + }, + { + "Pixel.sg": { + "http://www.pixel.sg/": ["pixel.sg"] + } + }, + { + "Piximedia": { + "http://www.piximedia.com/": ["piximedia.com"] + } + }, + { + "Pixlee": { + "https://www.pixlee.com/": ["pixlee.com"] + } + }, + { + "PLATFORM ONE": { + "http://www.platform-one.co.jp/": ["platform-one.co.jp"] + } + }, + { + "plista": { + "http://www.plista.com/": ["plista.com"] + } + }, + { + "PocketCents": { + "http://pocketcents.com/": ["pocketcents.com"] + } + }, + { + "Polar Mobile": { + "http://polarmobile.com": ["mediavoice.com", "polarmobile.com"] + } + }, + { + "Politads": { + "http://politads.com/": ["politads.com"] + } + }, + { + "Polymorph": { + "http://getpolymorph.com/": ["adsnative.com", "getpolymorph.com"] + } + }, + { + "Pontiflex": { + "http://www.pontiflex.com/": ["pontiflex.com"] + } + }, + { + "PopAds": { + "https://www.popads.net/": ["popads.net", "popadscdn.net"] + } + }, + { + "PopRule": { + "http://poprule.com/": ["gocampaignlive.com", "poprule.com"] + } + }, + { + "Popunder.ru": { + "http://popunder.ru/": ["popunder.ru"] + } + }, + { + "Po.st": { + "http://www.po.st/": ["po.st"] + } + }, + { + "Powerlinks": { + "https://www.powerlinks.com/": ["powerlinks.com"] + } + }, + { + "PPCProtect": { + "https://ppcprotect.com": ["ppcprotect.com"] + } + }, + { + "PrecisionClick": { + "http://www.precisionclick.com/": ["precisionclick.com"] + } + }, + { + "PredictAd": { + "http://www.predictad.com/": ["predictad.com"] + } + }, + { + "Pressflex": { + "http://www.pressflex.com/": ["blogads.com", "pressflex.com"] + } + }, + { + "Prime Visibility": { + "http://www.primevisibility.com/": [ + "adcde.com", + "addlvr.com", + "adonnetwork.com", + "adonnetwork.net", + "adtrgt.com", + "bannertgt.com", + "cptgt.com", + "cpvfeed.com", + "cpvtgt.com", + "dashboardad.net", + "popcde.com", + "primevisibility.com", + "sdfje.com", + "urtbk.com" + ] + } + }, + { + "Primis": { + "https://www.primis.tech": ["sekindo.com"] + } + }, + { + "PrismApp": { + "https://www.prismapp.io/": ["prismapp.io"] + } + }, + { + "Proclivity": { + "http://www.proclivitymedia.com/": [ + "proclivitymedia.com", + "proclivitysystems.com", + "pswec.com" + ] + } + }, + { + "Project Wonderful": { + "http://www.projectwonderful.com/": ["projectwonderful.com"] + } + }, + { + "PrometheusIntelligenceTechnology": { + "https://prometheusintelligencetechnology.com/": [ + "prometheusintelligencetechnology.com" + ] + } + }, + { + "Propeller Ads": { + "http://propellerads.com/": ["propellerads.com"] + } + }, + { + "Prosperent": { + "http://prosperent.com/": ["prosperent.com"] + } + }, + { + "Protected Media": { + "http://www.protected.media/": ["ad-score.com", "protected.media"] + } + }, + { + "Provers": { + "http://provers.pro": ["provers.pro"] + } + }, + { + "Psonstrentie": { + "http://psonstrentie.info": ["psonstrentie.info"] + } + }, + { + "Public-Idées": { + "http://www.publicidees.com/": ["publicidees.com"] + } + }, + { + "Publishers Clearing House": { + "http://www.pch.com/": ["pch.com"] + } + }, + { + "PubMatic": { + "http://www.pubmatic.com/": ["pubmatic.com", "revinet.com"] + } + }, + { + "PulsePoint": { + "https://www.pulsepoint.com/": ["pulsepoint.com"] + } + }, + { + "quadrantOne": { + "http://www.quadrantone.com/": ["quadrantone.com"] + } + }, + { + "Quake Marketing": { + "http://quakemarketing.com/": ["quakemarketing.com"] + } + }, + { + "Quantcast": { + "http://www.quantcast.com/": [ + "quantcast.com", + "quantcount.com", + "quantserve.com" + ] + } + }, + { + "QuantumAdvertising": { + "http://quantum-advertising.com": ["quantum-advertising.com"] + } + }, + { + "QuinStreet": { + "http://quinstreet.com/": [ + "qnsr.com", + "qsstats.com", + "quinstreet.com" + ] + } + }, + { + "QUISMA": { + "https://quisma.com/": [ + "iaded.com", + "quisma.com", + "quismatch.com", + "xaded.com", + "xmladed.com" + ] + } + }, + { + "Radial": { + "https://www.radial.com": ["gsicommerce.com", "gsimedia.net"] + } + }, + { + "Radiate Media": { + "http://www.radiatemedia.com/": ["matchbin.com", "radiatemedia.com"] + } + }, + { + "RadiumOne": { + "http://www.radiumone.com/": ["gwallet.com", "radiumone.com"] + } + }, + { + "Radius Marketing": { + "http://www.radiusmarketing.com/": ["radiusmarketing.com"] + } + }, + { + "Rambler": { + "http://www.rambler.ru/": ["rambler.ru"] + } + }, + { + "Rapleaf": { + "http://www.rapleaf.com/": ["rapleaf.com", "rlcdn.com"] + } + }, + { + "ReachLocal": { + "http://www.reachlocal.com/": ["reachlocal.com", "rlcdn.net"] + } + }, + { + "React2Media": { + "http://www.react2media.com/": ["react2media.com"] + } + }, + { + "Redux Media": { + "http://reduxmedia.com/": ["reduxmedia.com"] + } + }, + { + "Rekko": { + "http://rekko.com/": ["convertglobal.com", "rekko.com"] + } + }, + { + "Reklamport": { + "http://www.reklamport.com/": ["reklamport.com"] + } + }, + { + "Reklam Store": { + "http://reklamstore.com/": ["reklamstore.com"] + } + }, + { + "Reklamz": { + "http://www.reklamz.com/": ["reklamz.com"] + } + }, + { + "Relevad": { + "http://www.relevad.com/": ["relestar.com", "relevad.com"] + } + }, + { + "Renegade Internet": { + "http://www.renegadeinternet.com/": [ + "advertserve.com", + "renegadeinternet.com" + ] + } + }, + { + "Reporo": { + "http://www.reporo.com/": ["buzzcity.com"] + } + }, + { + "ResolutionMedia": { + "https://nonstoppartner.net/": ["nonstoppartner.net"] + } + }, + { + "Resolution Media": { + "http://resolutionmedia.com/": ["resolutionmedia.com"] + } + }, + { + "Resonate": { + "http://www.resonateinsights.com/": [ + "reson8.com", + "resonateinsights.com", + "resonatenetworks.com" + ] + } + }, + { + "Responsys": { + "http://www.responsys.com/": ["responsys.com"] + } + }, + { + "ReTargeter": { + "http://www.retargeter.com/": ["retargeter.com"] + } + }, + { + "Retirement Living": { + "www.retirement-living.com/": [ + "blvdstatus.com", + "retirement-living.com" + ] + } + }, + { + "RevContent": { + "http://revcontent.com/": ["revcontent.com"] + } + }, + { + "RevenueMax": { + "http://revenuemax.de/": ["revenuemax.de"] + } + }, + { + "Rhythm": { + "http://rhythmnewmedia.com/": [ + "1rx.io", + "rhythmnewmedia.com", + "rhythmone.com", + "rhythmxchange.com", + "rnmd.net" + ] + } + }, + { + "RichAudience": { + "https://richaudience.com/": ["richaudience.com"] + } + }, + { + "RichRelevance": { + "http://www.richrelevance.com/": ["richrelevance.com"] + } + }, + { + "RightAction": { + "http://rightaction.com/": ["rightaction.com"] + } + }, + { + "RMBN": { + "http://rmbn.net/": ["rmbn.net", "rmbn.ru"] + } + }, + { + "RMM": { + "http://www.rmmonline.com/": ["rmmonline.com"] + } + }, + { + "Rocket Fuel": { + "http://rocketfuel.com/": [ + "rfihub.com", + "rfihub.net", + "rocketfuel.com", + "ru4.com", + "xplusone.com" + ] + } + }, + { + "Rovion": { + "http://www.rovion.com/": ["rovion.com"] + } + }, + { + "rtk": { + "http://rtk.io/": ["rtk.io"] + } + }, + { + "RubiconProject": { + "http://rubiconproject.com/": [ + "adsbyisocket.com", + "isocket.com", + "rubiconproject.com" + ] + } + }, + { + "RunAds": { + "http://www.runads.com/": ["runads.com", "rundsp.com"] + } + }, + { + "RuTarget": { + "http://www.rutarget.ru/": ["rutarget.ru"] + } + }, + { + "Sabavision": { + "http://www.sabavision.com": ["sabavision.com"] + } + }, + { + "Sabre": { + "http://www.sabre.com/": [ + "reztrack.com", + "sabre.com", + "sabrehospitality.com" + ] + } + }, + { + "Salesforce.com": { + "http://www.salesforce.com/": ["salesforce.com"] + } + }, + { + "Samurai Factory": { + "http://www.samurai-factory.jp/": ["samurai-factory.jp", "shinobi.jp"] + } + }, + { + "SAP": { + "https://www.sap.com": ["seewhy.com"] + } + }, + { + "Sapient": { + "http://www.sapient.com/": ["bridgetrack.com", "sapient.com"] + } + }, + { + "SAS": { + "http://www.sas.com/": ["aimatch.com", "sas.com"] + } + }, + { + "Scandinavian AdNetworks": { + "http://www.scandinavianadnetworks.com/": [ + "scandinavianadnetworks.com" + ] + } + }, + { + "Scribol": { + "http://scribol.com/": ["scribol.com"] + } + }, + { + "SearchForce": { + "http://www.searchforce.com/": ["searchforce.com", "searchforce.net"] + } + }, + { + "Seevast": { + "http://www.seevast.com/": [ + "kanoodle.com", + "pulse360.com", + "seevast.com", + "syndigonetworks.com" + ] + } + }, + { + "Selectable Media": { + "http://selectablemedia.com/": ["nabbr.com", "selectablemedia.com"] + } + }, + { + "Semantiqo": { + "http://semantiqo.com/": ["semantiqo.com"] + } + }, + { + "Semasio": { + "http://www.semasio.com/": ["semasio.com", "semasio.net"] + } + }, + { + "SevenAds": { + "http://www.sevenads.net/": ["sevenads.net"] + } + }, + { + "SexInYourCity": { + "http://www.sexinyourcity.com/": ["sexinyourcity.com"] + } + }, + { + "ShaftTraffic": { + "https://shafttraffic.com": ["libertystmedia.com"] + } + }, + { + "ShareASale": { + "http://www.shareasale.com/": ["shareasale.com"] + } + }, + { + "Sharethrough": { + "http://sharethrough.com/": ["sharethrough.com"] + } + }, + { + "Shopzilla": { + "http://www.shopzilla.com/": ["shopzilla.com"] + } + }, + { + "Shortest": { + "http://shorte.st/": ["shorte.st"] + } + }, + { + "Silverpop": { + "http://www.silverpop.com/": [ + "mkt51.net", + "pages05.net", + "silverpop.com", + "vtrenz.net" + ] + } + }, + { + "Simpli.fi": { + "http://www.simpli.fi/": ["simpli.fi"] + } + }, + { + "SiteScout": { + "http://www.sitescout.com/": ["sitescout.com"] + } + }, + { + "Skimlinks": { + "http://skimlinks.com/": ["skimlinks.com", "skimresources.com"] + } + }, + { + "Skupe Net": { + "http://www.skupenet.com/": ["adcentriconline.com", "skupenet.com"] + } + }, + { + "Smaato": { + "http://www.smaato.com/": ["smaato.com"] + } + }, + { + "SmartAdServer": { + "http://smartadserver.com/": ["smartadserver.com"] + } + }, + { + "SmartyAds": { + "https://smartyads.com/": ["smartyads.com"] + } + }, + { + "Smiley Media": { + "http://www.smileymedia.com/": ["smileymedia.com"] + } + }, + { + "Smowtion": { + "http://smowtion.com/": ["smowtion.com"] + } + }, + { + "Snap": { + "http://www.snap.com/": ["snap.com"] + } + }, + { + "SocialChorus": { + "http://www.socialchorus.com/": [ + "halogenmediagroup.com", + "halogennetwork.com", + "socialchorus.com" + ] + } + }, + { + "SocialInterface": { + "http://socialinterface.com/": [ + "ratevoice.com", + "socialinterface.com" + ] + } + }, + { + "SocialTwist": { + "http://tellafriend.socialtwist.com/": ["socialtwist.com"] + } + }, + { + "sociomantic labs": { + "http://www.sociomantic.com/": ["sociomantic.com"] + } + }, + { + "Socital": { + "https://www.socital.com": ["socital.com"] + } + }, + { + "Sojern": { + "https://www.sojern.com": ["sojern.com"] + } + }, + { + "SomoAudience": { + "https://somoaudience.com/": ["somoaudience.com"] + } + }, + { + "Sonobi": { + "http://sonobi.com/": ["sonobi.com"] + } + }, + { + "sophus3": { + "http://www.sophus3.com/": ["sophus3.co.uk", "sophus3.com"] + } + }, + { + "Sortable": { + "https://www.sortable.com/": ["deployads.com"] + } + }, + { + "Sovrn": { + "https://www.sovrn.com/": ["sovrn.com"] + } + }, + { + "Space Chimp Media": { + "http://spacechimpmedia.com/": ["spacechimpmedia.com"] + } + }, + { + "Sparklit": { + "http://www.sparklit.com/": ["adbutler.com", "sparklit.com"] + } + }, + { + "Spark Studios": { + "http://www.sparkstudios.com/": ["sparkstudios.com"] + } + }, + { + "Specific Media": { + "http://www.specificmedia.com/": [ + "adviva.co.uk", + "adviva.net", + "sitemeter.com", + "specificclick.net", + "specificmedia.co.uk", + "specificmedia.com" + ] + } + }, + { + "Spectate": { + "http://spectate.com/": ["spectate.com"] + } + }, + { + "Sponge": { + "http://spongegroup.com/": ["spongegroup.com"] + } + }, + { + "Spongecell": { + "http://www.spongecell.com/": ["spongecell.com"] + } + }, + { + "SponsorAds": { + "http://www.sponsorads.de/": ["sponsorads.de"] + } + }, + { + "Spot200": { + "http://spot200.com/": ["spot200.com"] + } + }, + { + "SpotX": { + "https://www.spotx.tv": ["spotx.tv"] + } + }, + { + "SpotXchange": { + "http://www.spotxchange.com/": ["spotxchange.com"] + } + }, + { + "SpringServe": { + "https://springserve.com/": ["springserve.com"] + } + }, + { + "StackAdapt": { + "https://www.stackadapt.com/": ["stackadapt.com"] + } + }, + { + "StarGames": { + "https://www.stargames.net/": ["stargamesaffiliate.com"] + } + }, + { + "SteelHouse": { + "http://www.steelhouse.com/": [ + "steelhouse.com", + "steelhousemedia.com" + ] + } + }, + { + "Storygize": { + "http://www.storygize.com/": ["storygize.com", "storygize.net"] + } + }, + { + "Streamray": { + "http://streamray.com/": ["cams.com", "streamray.com"] + } + }, + { + "StrikeAd": { + "http://www.strikead.com/": ["strikead.com"] + } + }, + { + "StrongMail": { + "http://www.strongmail.com/": ["popularmedia.com"] + } + }, + { + "Struq": { + "http://struq.com/": ["struq.com"] + } + }, + { + "Sublime Skinz": { + "http://sublime.xyz/": ["ayads.co", "sublime.xyz"] + } + }, + { + "Suite 66": { + "http://www.suite66.com/": ["suite66.com"] + } + }, + { + "Summit": { + "http://www.summit.co.uk/": ["summitmedia.co.uk"] + } + }, + { + "Superfish": { + "http://www.superfish.com/": ["superfish.com"] + } + }, + { + "SupersonicAds": { + "http://www.supersonicads.com/": ["supersonicads.com"] + } + }, + { + "Survata": { + "https://www.survata.com/": ["survata.com"] + } + }, + { + "Switch": { + "http://www.switchconcepts.com/": [ + "ethicalads.net", + "switchadhub.com", + "switchconcepts.co.uk", + "switchconcepts.com" + ] + } + }, + { + "Swoop": { + "http://swoop.com/": ["swoop.com"] + } + }, + { + "SymphonyAM": { + "http://www.factortg.com/": ["factortg.com"] + } + }, + { + "Syncapse": { + "http://www.syncapse.com/": ["clickable.net", "syncapse.com"] + } + }, + { + "Syrup Ad": { + "http://adotsolution.com/": ["adotsolution.com"] + } + }, + { + "Taboola": { + "https://www.taboola.com/": ["perfectmarket.com", "taboola.com"] + } + }, + { + "Tailsweep": { + "http://www.tailsweep.com/": ["tailsweep.com"] + } + }, + { + "Taleria": { + "https://outstream.telaria.com/": ["freeskreen.com"] + } + }, + { + "Tapad": { + "http://www.tapad.com/": ["tapad.com"] + } + }, + { + "Tapgage": { + "http://www.tapgage.com/": ["bizmey.com", "tapgage.com"] + } + }, + { + "TapIt!": { + "http://tapit.com/": ["tapit.com"] + } + }, + { + "Tap.me": { + "http://tap.me/": ["tap.me"] + } + }, + { + "Targetix": { + "http://targetix.net/": ["targetix.net"] + } + }, + { + "Tatto Media": { + "http://tattomedia.com/": ["quicknoodles.com", "tattomedia.com"] + } + }, + { + "Teadma": { + "http://www.teadma.com/": ["teadma.com"] + } + }, + { + "Teads.tv": { + "http://teads.tv/": ["ebuzzing.com", "teads.tv"] + } + }, + { + "Technorati": { + "http://technorati.com/": ["technorati.com", "technoratimedia.com"] + } + }, + { + "TellApart": { + "http://tellapart.com/": ["tellapart.com", "tellapt.com"] + } + }, + { + "Telstra": { + "http://www.telstra.com.au/": [ + "sensis.com.au", + "sensisdata.com.au", + "sensisdigitalmedia.com.au", + "telstra.com.au" + ] + } + }, + { + "Terra": { + "http://www.terra.com.br/": ["eztargetmedia.com", "terra.com.br"] + } + }, + { + "The Numa Group": { + "http://www.thenumagroup.com/": ["hittail.com", "thenumagroup.com"] + } + }, + { + "The Search Agency": { + "http://www.thesearchagency.com/": [ + "thesearchagency.com", + "thesearchagency.net" + ] + } + }, + { + "The Trade Desk": { + "http://thetradedesk.com/": ["adsrvr.org", "thetradedesk.com"] + } + }, + { + "Think Realtime": { + "http://www.thinkrealtime.com/": [ + "echosearch.com", + "esm1.net", + "thinkrealtime.com" + ] + } + }, + { + "Tinder": { + "http://tinder.com/": ["carbonads.com", "tinder.com"] + } + }, + { + "TiqIQ": { + "http://www.tiqiq.com/": ["tiqiq.com"] + } + }, + { + "Tisoomi": { + "http://www.tisoomi.com/": ["adternal.com", "tisoomi.com"] + } + }, + { + "TLVMedia": { + "http://tlvmedia.com/": ["tlvmedia.com"] + } + }, + { + "Todacell": { + "http://www.todacell.com/": ["todacell.com"] + } + }, + { + "ToneFuse": { + "http://tonefuse.com/": ["tonefuse.com"] + } + }, + { + "ToneMedia": { + "http://tonemedia.com/": ["clickfuse.com", "tonemedia.com"] + } + }, + { + "TouchCommerce": { + "http://www.touchcommerce.com/": ["inq.com", "touchcommerce.com"] + } + }, + { + "TrackingSoft": { + "http://trackingsoft.com/": ["trackingsoft.com"] + } + }, + { + "Tradedoubler": { + "http://www.tradedoubler.com/": ["tradedoubler.com"] + } + }, + { + "TradeTracker": { + "http://www.tradetracker.com/": [ + "tradetracker.com", + "tradetracker.net" + ] + } + }, + { + "TrafficHaus": { + "http://www.traffichaus.com/": ["traffichaus.com", "traffichouse.com"] + } + }, + { + "TrafficRevenue": { + "http://www.trafficrevenue.net/": ["trafficrevenue.net"] + } + }, + { + "Traffiq": { + "http://www.traffiq.com/": ["traffiq.com"] + } + }, + { + "Trafmag": { + "http://trafmag.com/": ["trafmag.com"] + } + }, + { + "Traverse": { + "http://www.traversedata.com/": ["traversedlp.com"] + } + }, + { + "Travora Media": { + "http://www.travoramedia.com/": [ + "traveladnetwork.com", + "traveladvertising.com", + "travoramedia.com" + ] + } + }, + { + "Tremor Video": { + "http://www.tremorvideo.com/": [ + "scanscout.com", + "tmnetads.com", + "tremorhub.com", + "tremormedia.com", + "tremorvideo.com" + ] + } + }, + { + "Triggit": { + "http://triggit.com/": ["triggit.com"] + } + }, + { + "TripleLift": { + "http://triplelift.com/": ["3lift.com", "triplelift.com"] + } + }, + { + "TruEffect": { + "http://www.trueffect.com/": ["adlegend.com", "trueffect.com"] + } + }, + { + "TrustX": { + "https://trustx.org/": ["trustx.org"] + } + }, + { + "TubeMogul": { + "http://www.tubemogul.com/": ["tmogul.com", "tubemogul.com"] + } + }, + { + "Twelvefold": { + "http://www.twelvefold.com/": ["buzzlogic.com", "twelvefold.com"] + } + }, + { + "Twitter": { + "https://twitter.com/": ["ads-twitter.com"] + } + }, + { + "Twyn Group": { + "http://www.twyn.com/": ["twyn-group.com", "twyn.com"] + } + }, + { + "Tyroo": { + "http://www.tyroo.com/": ["tyroo.com"] + } + }, + { + "ucfunnel": { + "https://www.ucfunnel.com/": ["aralego.com", "ucfunnel.com"] + } + }, + { + "uCoz": { + "http://www.ucoz.com/": [ + "ucoz.ae", + "ucoz.br", + "ucoz.com", + "ucoz.du", + "ucoz.fr", + "ucoz.net", + "ucoz.ru" + ] + } + }, + { + "Unanimis": { + "http://www.unanimis.co.uk/": ["unanimis.co.uk"] + } + }, + { + "Underdog Media": { + "http://www.underdogmedia.com/": ["udmserve.net", "underdogmedia.com"] + } + }, + { + "Undertone": { + "http://www.undertone.com/": [ + "undertone.com", + "undertonenetworks.com", + "undertonevideo.com" + ] + } + }, + { + "UniQlick": { + "http://www.uniqlick.com/": [ + "51network.com", + "uniqlick.com", + "wanmo.com" + ] + } + }, + { + "Unruly": { + "https://unruly.co/": ["unrulymedia.com"] + } + }, + { + "Upland": { + "https://uplandsoftware.com/": ["leadlander.com", "trackalyzer.com"] + } + }, + { + "up-value": { + "http://www.up-value.de/": ["up-value.de"] + } + }, + { + "Value Ad": { + "http://valuead.com/": ["valuead.com"] + } + }, + { + "Various": { + "http://www.various.com/": [ + "amigos.com", + "getiton.com", + "medley.com", + "nostringsattached.com", + "various.com" + ] + } + }, + { + "Vdopia": { + "http://www.vdopia.com/": ["ivdopia.com", "vdopia.com"] + } + }, + { + "Veeseo": { + "http://veeseo.com": ["veeseo.com"] + } + }, + { + "Velocity Media": { + "http://adsvelocity.com/": ["adsvelocity.com"] + } + }, + { + "Velti": { + "http://www.velti.com/": ["mobclix.com", "velti.com"] + } + }, + { + "Vemba": { + "https://www.vemba.com/": ["vemba.com"] + } + }, + { + "Venatus Media": { + "http://venatusmedia.com": ["venatusmedia.com"] + } + }, + { + "Vendemore": { + "https://vendemore.com/": ["vendemore.com"] + } + }, + { + "Vendio": { + "http://www.vendio.com/": ["singlefeed.com", "vendio.com"] + } + }, + { + "Veoxa": { + "http://www.veoxa.com/": ["veoxa.com"] + } + }, + { + "Veremedia": { + "http://www.veremedia.com/": ["veremedia.com"] + } + }, + { + "VerticalHealth": { + "https://www.verticalhealth.com/": ["verticalhealth.net"] + } + }, + { + "VerticalResponse": { + "http://www.verticalresponse.com/": [ + "verticalresponse.com", + "vresp.com" + ] + } + }, + { + "Vibrant Media": { + "http://www.vibrantmedia.com/": [ + "intellitxt.com", + "picadmedia.com", + "vibrantmedia.com" + ] + } + }, + { + "VideoIntelligence": { + "https://www.vi.ai/": ["vi.ai"] + } + }, + { + "VigLink": { + "http://www.viglink.com/": ["viglink.com"] + } + }, + { + "VisibleBrands": { + "http://www.visbrands.com/": ["visbrands.com"] + } + }, + { + "Visible Measures": { + "http://www.visiblemeasures.com/": [ + "viewablemedia.net", + "visiblemeasures.com" + ] + } + }, + { + "VisualDNA": { + "http://www.visualdna.com/": [ + "vdna-assets.com", + "visualdna-stats.com", + "visualdna.com" + ] + } + }, + { + "Vizu": { + "http://www.vizu.com/": ["vizu.com"] + } + }, + { + "Vizury": { + "http://www.vizury.com/": ["vizury.com"] + } + }, + { + "Vserv": { + "http://www.vserv.com/": ["vserv.com", "vserv.mobi"] + } + }, + { + "Vuble": { + "https://vuble.tv/us/": ["mediabong.com"] + } + }, + { + "Wahoha": { + "http://wahoha.com/": ["contentwidgets.net", "wahoha.com"] + } + }, + { + "Wayfair": { + "https://www.wayfair.com/": ["wayfair.com"] + } + }, + { + "WebAds": { + "http://www.webads.co.uk/": ["webads.co.uk"] + } + }, + { + "Web.com": { + "http://www.web.com/": ["feedperfect.com", "web.com"] + } + }, + { + "WebGozar.com": { + "http://www.webgozar.com/": ["webgozar.com", "webgozar.ir"] + } + }, + { + "Webmecanik": { + "https://www.webmecanik.com/": ["webmecanik.com"] + } + }, + { + "WebMetro": { + "http://www.webmetro.com/": ["dsmmadvantage.com", "webmetro.com"] + } + }, + { + "Weborama": { + "http://weborama.com/": ["weborama.com", "weborama.fr"] + } + }, + { + "Webtraffic": { + "http://www.webtraffic.se/": ["webtraffic.no", "webtraffic.se"] + } + }, + { + "WideOrbit": { + "https://www.wideorbit.com/": ["dep-x.com"] + } + }, + { + "WiredMinds": { + "http://www.wiredminds.com/": ["wiredminds.com", "wiredminds.de"] + } + }, + { + "Wishabi": { + "http://wishabi.com": ["wishabi.com", "wishabi.net"] + } + }, + { + "WordStream": { + "http://www.wordstream.com/": ["wordstream.com"] + } + }, + { + "WPP": { + "http://www.wpp.com/": [ + "247realmedia.com", + "accelerator-media.com", + "acceleratorusa.com", + "decdna.net", + "decideinteractive.com", + "gmads.net", + "groupm.com", + "kantarmedia.com", + "mecglobal.com", + "mindshare.nl", + "mookie1.com", + "pm14.com", + "realmedia.com", + "targ.ad", + "themig.com", + "wpp.com", + "xaxis.com" + ] + } + }, + { + "xAd": { + "http://www.xad.com/": ["xad.com"] + } + }, + { + "Xertive Media": { + "http://www.xertivemedia.com/": [ + "admanager-xertive.com", + "xertivemedia.com" + ] + } + }, + { + "xplosion interactive": { + "http://www.xplosion.de/": ["xplosion.de"] + } + }, + { + "Xrost DS": { + "http://www.adplan-ds.com/": ["adplan-ds.com"] + } + }, + { + "Yabuka": { + "http://www.yabuka.com/": ["yabuka.com"] + } + }, + { + "Yahoo!": { + "http://www.yahoo.com/": [ + "adinterax.com", + "adrevolver.com", + "ads.yahoo.com", + "adserver.yahoo.com", + "advertising.yahoo.com", + "bluelithium.com", + "dapper.net", + "flurry.com", + "interclick.com", + "marketingsolutions.yahoo.com", + "overture.com", + "rightmedia.com", + "rmxads.com", + "secure-adserver.com", + "thewheelof.com", + "yieldmanager.com", + "yieldmanager.net", + "yldmgrimg.net" + ] + } + }, + { + "Yandex": { + "http://www.yandex.com/": [ + "adfox.yandex.ru", + "an.yandex.ru", + "awaps.yandex.ru", + "mc.yandex.ru", + "moikrug.ru", + "web-visor.com", + "yandex.ru/clck/click", + "yandex.ru/clck/counter", + "yandex.ru/cycounter", + "yandex.ru/portal/set/any", + "yandex.ru/set/s/rsya-tag-users/data" + ] + } + }, + { + "Ybrant Digital": { + "http://www.ybrantdigital.com/": [ + "addynamix.com", + "adserverplus.com", + "oridian.com", + "ybrantdigital.com" + ] + } + }, + { + "YD": { + "http://www.ydworld.com/": ["ydworld.com", "yieldivision.com"] + } + }, + { + "YellowHammer": { + "http://www.yhmg.com/": [ + "attracto.com", + "clickhype.com", + "yellowhammermg.com", + "yhmg.com" + ] + } + }, + { + "Yes Ads": { + "http://yesads.com/": ["yesads.com"] + } + }, + { + "YieldAds": { + "http://yieldads.com/": ["yieldads.com"] + } + }, + { + "YieldBids": { + "http://ybx.io/": ["ybx.io"] + } + }, + { + "YieldBot": { + "http://yieldbot.com/": ["yldbt.com"] + } + }, + { + "YieldBuild": { + "http://yieldbuild.com/": ["yieldbuild.com"] + } + }, + { + "Yieldify": { + "https://www.yieldify.com/": ["yieldify.com"] + } + }, + { + "Yieldlab": { + "http://www.yieldlab.de/": ["yieldlab.de", "yieldlab.net"] + } + }, + { + "Yieldmo": { + "https://yieldmo.com": ["yieldmo.com"] + } + }, + { + "YieldNexus": { + "https://www.yieldnexus.com/": ["ynxs.io"] + } + }, + { + "YOC": { + "http://group.yoc.com/": ["yoc-performance.com", "yoc.com"] + } + }, + { + "Yoggrt": { + "http://www.yoggrt.com/": ["yoggrt.com"] + } + }, + { + "youknowbest": { + "http://www.youknowbest.com/": ["youknowbest.com"] + } + }, + { + "YuMe": { + "http://www.yume.com/": ["yume.com", "yumenetworks.com"] + } + }, + { + "ZafulAffiliate": { + "https://affiliate.zaful.com/": [ + "affasi.com", + "gw-ec.com", + "zaful.com" + ] + } + }, + { + "Zango": { + "http://www.zango.com/": ["metricsdirect.com", "zango.com"] + } + }, + { + "zanox": { + "http://www.zanox.com/": ["buy.at", "zanox-affiliate.de", "zanox.com"] + } + }, + { + "zapunited": { + "http://www.zapunited.com/": ["zaparena.com", "zapunited.com"] + } + }, + { + "ZEDO": { + "http://www.zedo.com/": ["zedo.com", "zincx.com"] + } + }, + { + "Zefir": { + "https://ze-fir.com/": ["ze-fir.com"] + } + }, + { + "Zemanta": { + "http://www.zemanta.com/": ["zemanta.com"] + } + }, + { + "ZestAd": { + "http://www.zestad.com/": ["zestad.com"] + } + }, + { + "Zeta Email Solutions": { + "http://www.zetaemailsolutions.com/": [ + "insightgrit.com", + "zetaemailsolutions.com" + ] + } + }, + { + "Zumobi": { + "http://www.zumobi.com/": ["zumobi.com"] + } + }, + { + "ZypMedia": { + "http://www.zypmedia.com/": ["extend.tv", "zypmedia.com"] + } + } + ], + "Content": [ + { + "33Across": { + "http://33across.com/": ["tynt.com"] + } + }, + { + "ActivEngage": { + "http://www.activengage.com/": ["activengage.com"] + } + }, + { + "Adap.tv": { + "http://adap.tv/": ["adap.tv"] + } + }, + { + "Adobe": { + "http://www.adobe.com/": [ + "adobe.com", + "fyre.co", + "livefyre.com", + "typekit.com" + ] + } + }, + { + "Akamai": { + "http://www.akamai.com/": ["abmr.net", "akamai.com", "edgesuite.net"] + } + }, + { + "AKQA": { + "http://www.akqa.com/": ["akqa.com", "srtk.net"] + } + }, + { + "Amazon.com": { + "http://www.amazon.com/": [ + "alexa.com", + "amazon.com", + "cloudfront.net" + ] + } + }, + { + "AOL": { + "http://www.aol.com/": [ + "5min.com", + "aim.com", + "aol.com", + "aolanswers.com", + "aolcdn.com", + "aoltechguru.com", + "autoblog.com", + "cambio.com", + "dailyfinance.com", + "editions.com", + "engadget.com", + "games.com", + "homesessive.com", + "huffingtonpost.com", + "joystiq.com", + "kitchendaily.com", + "makers.com", + "mandatory.com", + "mapquest.com", + "moviefone.com", + "noisecreep.com", + "patch.com", + "pawnation.com", + "shortcuts.com", + "shoutcast.com", + "spinner.com", + "stylelist.com", + "stylemepretty.com", + "surphace.com", + "techcrunch.com", + "theboombox.com", + "theboot.com", + "tuaw.com", + "userplane.com", + "winamp.com" + ] + } + }, + { + "Automattic": { + "http://automattic.com/": [ + "automattic.com", + "gravatar.com", + "intensedebate.com" + ] + } + }, + { + "Baynote": { + "http://www.baynote.com/": ["baynote.com", "baynote.net"] + } + }, + { + "Bazaarvoice": { + "http://www.bazaarvoice.com/": ["bazaarvoice.com"] + } + }, + { + "BigDoor": { + "http://www.bigdoor.com/": ["bigdoor.com", "onetruefan.com"] + } + }, + { + "Brightcove": { + "http://www.brightcove.com/": ["brightcove.com"] + } + }, + { + "Browser-Update.org": { + "www.browser-update.org/": ["browser-update.org"] + } + }, + { + "BTBuckets": { + "http://btbuckets.com/": ["btbuckets.com"] + } + }, + { + "Buffer": { + "http://bufferapp.com/": ["bufferapp.com"] + } + }, + { + "Bunchball": { + "http://www.bunchball.com/": ["bunchball.com"] + } + }, + { + "buySAFE": { + "http://www.buysafe.com/": ["buysafe.com"] + } + }, + { + "BuzzFeed": { + "http://www.buzzfeed.com/": ["buzzfed.com", "buzzfeed.com"] + } + }, + { + "Cbox": { + "http://www.cbox.ws/": ["cbox.ws"] + } + }, + { + "CBS Interactive": { + "http://www.cbsinteractive.com/": ["cbsinteractive.com", "com.com"] + } + }, + { + "Cedexis": { + "http://www.cedexis.com/": ["cedexis.com", "cedexis.net"] + } + }, + { + "Certona": { + "http://www.certona.com/": ["certona.com", "res-x.com"] + } + }, + { + "ClipSyndicate": { + "http://www.clipsyndicate.com/": ["clipsyndicate.com"] + } + }, + { + "Collarity": { + "http://www.collarity.com/": ["collarity.com"] + } + }, + { + "Conduit": { + "http://www.conduit.com/": [ + "conduit-banners.com", + "conduit-services.com", + "conduit.com", + "wibiya.com" + ] + } + }, + { + "Congoo": { + "http://www.congoo.com/": ["congoo.com"] + } + }, + { + "Contact At Once!": { + "http://www.contactatonce.com/": ["contactatonce.com"] + } + }, + { + "Conviva": { + "http://www.conviva.com/": ["conviva.com"] + } + }, + { + "DailyMe": { + "http://dailyme.com/": ["dailyme.com", "newstogram.com"] + } + }, + { + "DataSift": { + "http://datasift.com/": ["datasift.com", "tweetmeme.com"] + } + }, + { + "Disqus": { + "http://disqus.com/": ["disqus.com"] + } + }, + { + "Echo": { + "http://aboutecho.com/": [ + "aboutecho.com", + "haloscan.com", + "js-kit.com" + ] + } + }, + { + "Facebook": { + "http://www.facebook.com/": [ + "fbcdn.net", + "instagram.com", + "messenger.com" + ] + } + }, + { + "Flattr": { + "http://flattr.com/": ["flattr.com"] + } + }, + { + "FreeWheel": { + "http://www.freewheel.tv/": ["freewheel.tv", "fwmrm.net"] + } + }, + { + "Genius.com": { + "http://www.genius.com/": ["genius.com"] + } + }, + { + "Get Satisfaction": { + "https://getsatisfaction.com/": ["getsatisfaction.com"] + } + }, + { + "Gigya": { + "http://www.gigya.com/": ["gigcount.com", "gigya.com"] + } + }, + { + "Global Takeoff": { + "http://www.globaltakeoff.com/": [ + "globaltakeoff.com", + "globaltakeoff.net" + ] + } + }, + { + "GoGrid": { + "http://www.gogrid.com/": [ + "formalyzer.com", + "gogrid.com", + "komli.net" + ] + } + }, + { + "Google": { + "http://www.google.com/": [ + "accounts.google.com", + "apis.google.com", + "appengine.google.com", + "apture.com", + "blogger.com", + "books.google.com", + "checkout.google.com", + "chrome.google.com", + "code.google.com", + "codesearch.google.com", + "docs.google.com", + "drive.google.com", + "earth.google.com", + "encrypted.google.com", + "feedburner.com", + "feedburner.google.com", + "feedproxy.google.com", + "finance.google.com", + "ggpht.com", + "gmodules.com", + "google-melange.com", + "google.ad", + "google.ae", + "google.al", + "google.am", + "google.as", + "google.at", + "google.az", + "google.ba", + "google.be", + "google.bf", + "google.bg", + "google.bi", + "google.bj", + "google.bs", + "google.bt", + "google.by", + "google.ca", + "google.cat", + "google.cd", + "google.cf", + "google.cg", + "google.ch", + "google.ci", + "google.cl", + "google.cm", + "google.cn", + "google.co.ao", + "google.co.bw", + "google.co.ck", + "google.co.cr", + "google.co.id", + "google.co.il", + "google.co.in", + "google.co.jp", + "google.co.ke", + "google.co.kr", + "google.co.ls", + "google.co.ma", + "google.co.mz", + "google.co.nz", + "google.co.th", + "google.co.tz", + "google.co.ug", + "google.co.uk", + "google.co.uz", + "google.co.ve", + "google.co.vi", + "google.co.za", + "google.co.zm", + "google.co.zw", + "google.com", + "google.com.af", + "google.com.ag", + "google.com.ai", + "google.com.ar", + "google.com.au", + "google.com.bd", + "google.com.bh", + "google.com.bn", + "google.com.bo", + "google.com.br", + "google.com.bz", + "google.com.co", + "google.com.cu", + "google.com.cy", + "google.com.do", + "google.com.ec", + "google.com.eg", + "google.com.et", + "google.com.fj", + "google.com.gh", + "google.com.gi", + "google.com.gt", + "google.com.hk", + "google.com.jm", + "google.com.kh", + "google.com.kw", + "google.com.lb", + "google.com.ly", + "google.com.mm", + "google.com.mt", + "google.com.mx", + "google.com.my", + "google.com.na", + "google.com.nf", + "google.com.ng", + "google.com.ni", + "google.com.np", + "google.com.om", + "google.com.pa", + "google.com.pe", + "google.com.pg", + "google.com.ph", + "google.com.pk", + "google.com.pr", + "google.com.py", + "google.com.qa", + "google.com.sa", + "google.com.sb", + "google.com.sg", + "google.com.sl", + "google.com.sv", + "google.com.tj", + "google.com.tr", + "google.com.tw", + "google.com.ua", + "google.com.uy", + "google.com.vc", + "google.com.vn", + "google.cv", + "google.cz", + "google.de", + "google.dj", + "google.dk", + "google.dm", + "google.dz", + "google.ee", + "google.es", + "google.fi", + "google.fm", + "google.fr", + "google.ga", + "google.ge", + "google.gg", + "google.gl", + "google.gm", + "google.gp", + "google.gr", + "google.gy", + "google.hn", + "google.hr", + "google.ht", + "google.hu", + "google.ie", + "google.im", + "google.iq", + "google.is", + "google.it", + "google.je", + "google.jo", + "google.kg", + "google.ki", + "google.kz", + "google.la", + "google.li", + "google.lk", + "google.lt", + "google.lu", + "google.lv", + "google.md", + "google.me", + "google.mg", + "google.mk", + "google.ml", + "google.mn", + "google.ms", + "google.mu", + "google.mv", + "google.mw", + "google.ne", + "google.nl", + "google.no", + "google.nr", + "google.nu", + "google.pl", + "google.pn", + "google.ps", + "google.pt", + "google.ro", + "google.rs", + "google.ru", + "google.rw", + "google.sc", + "google.se", + "google.sh", + "google.si", + "google.sk", + "google.sm", + "google.sn", + "google.so", + "google.st", + "google.td", + "google.tg", + "google.tk", + "google.tl", + "google.tm", + "google.tn", + "google.to", + "google.tt", + "google.vg", + "google.vu", + "google.ws", + "googleapis.com", + "googleartproject.com", + "googleusercontent.com", + "groups.google.com", + "gstatic.com", + "health.google.com", + "images.google.com", + "investor.google.com", + "knol.google.com", + "maps.google.com", + "music.google.com", + "news.google.com", + "panoramio.com", + "picasa.google.com", + "picasaweb.google.com", + "play.google.com", + "postini.com", + "recaptcha.net", + "script.google.com", + "shopping.google.com", + "sites.google.com", + "sketchup.google.com", + "support.google.com", + "talk.google.com", + "talkgadget.google.com", + "toolbar.google.com", + "translate.google.com", + "trends.google.com", + "video.google.com", + "videos.google.com", + "wallet.google.com", + "youtube.com" + ] + } + }, + { + "Gravity": { + "http://www.gravity.com/": ["gravity.com", "grvcdn.com"] + } + }, + { + "Heyzap": { + "http://www.heyzap.com/": ["heyzap.com"] + } + }, + { + "HubSpot": { + "http://www.hubspot.com/": ["hubspot.com"] + } + }, + { + "IBM": { + "http://www.ibm.com/": ["xtify.com"] + } + }, + { + "iovation": { + "http://www.iovation.com/": ["iesnare.com", "iovation.com"] + } + }, + { + "Kaltura": { + "http://corp.kaltura.com/": ["kaltura.com"] + } + }, + { + "kikin": { + "http://www.kikin.com/": ["kikin.com"] + } + }, + { + "Limelight Networks": { + "http://www.limelight.com/": [ + "clickability.com", + "limelight.com", + "llnwd.net" + ] + } + }, + { + "LivePerson": { + "http://www.liveperson.net/": ["liveperson.net"] + } + }, + { + "LiveRail": { + "http://liverail.com/": ["liverail.com"] + } + }, + { + "LongTail Video": { + "http://www.longtailvideo.com/": ["longtailvideo.com", "ltassrv.com"] + } + }, + { + "Markit": { + "http://www.markit.com/": ["markit.com", "wsod.com"] + } + }, + { + "MashLogic": { + "http://www.mashlogic.com/": ["mashlogic.com"] + } + }, + { + "McAfee": { + "http://www.mcafee.com/": ["mcafee.com", "scanalert.com"] + } + }, + { + "Microsoft": { + "http://www.microsoft.com/": [ + "bing.com", + "gamesforwindows.com", + "getgamesmart.com", + "healthvault.com", + "ieaddons.com", + "iegallery.com", + "live.com", + "microsoft.com", + "microsoftalumni.com", + "microsoftalumni.org", + "microsoftstore.com", + "msn.com", + "msndirect.com", + "office.com", + "officelive.com", + "outlook.com", + "s-msn.com", + "skype.com", + "windowsphone.com", + "worldwidetelescope.org", + "xbox.com", + "zune.com", + "zune.net" + ] + } + }, + { + "NDN": { + "http://www.newsinc.com/": ["newsinc.com"] + } + }, + { + "Oberon Media": { + "http://www.oberon-media.com/": ["blaze.com", "oberon-media.com"] + } + }, + { + "Ooyala": { + "http://www.ooyala.com/": ["oo4.com", "ooyala.com"] + } + }, + { + "Oracle": { + "http://www.oracle.com/": [ + "atgsvcs.com", + "instantservice.com", + "istrack.com", + "oracle.com" + ] + } + }, + { + "Peerius": { + "http://www.peerius.com/": ["peerius.com"] + } + }, + { + "Pinterest": { + "http://pinterest.com/": ["pinimg.com", "pinterest.com"] + } + }, + { + "PunchTab": { + "http://www.punchtab.com/": ["punchtab.com"] + } + }, + { + "RIM": { + "http://www.rim.com/": ["rim.com", "scoreloop.com"] + } + }, + { + "Salesforce.com": { + "http://www.salesforce.com/": ["salesforceliveagent.com"] + } + }, + { + "SAY": { + "http://saymedia.com/": [ + "saymedia.com", + "typepad.com", + "videoegg.com" + ] + } + }, + { + "ScribeFire": { + "http://www.scribefire.com/": ["scribefire.com"] + } + }, + { + "Six Apart": { + "http://www.sixapart.com/": ["sixapart.com"] + } + }, + { + "Skribit": { + "http://skribit.com/": ["skribit.com"] + } + }, + { + "SnapEngage": { + "http://www.snapengage.com/": ["snapengage.com"] + } + }, + { + "Spring Metrics": { + "http://www.springmetrics.com/": ["springmetrics.com"] + } + }, + { + "Synacor": { + "http://www.synacor.com/": ["synacor.com"] + } + }, + { + "ThingLink": { + "http://www.thinglink.com/": ["thinglink.com"] + } + }, + { + "Thismoment": { + "http://www.thismoment.com/": ["thismoment.com"] + } + }, + { + "Thummit": { + "http://www.thummit.com/": ["thummit.com"] + } + }, + { + "Topsy": { + "http://topsy.com/": ["topsy.com"] + } + }, + { + "TraceMyIP.org": { + "http://www.tracemyip.org/": ["tracemyip.org"] + } + }, + { + "Trackset": { + "http://www.trackset.com/": ["trackset.com"] + } + }, + { + "Trovus": { + "http://www.trovus.co.uk/": ["trovus.co.uk"] + } + }, + { + "Trumba": { + "http://www.trumba.com/": ["trumba.com"] + } + }, + { + "TRUSTe": { + "http://www.truste.com/": ["truste.com"] + } + }, + { + "TurnTo": { + "http://www.turntonetworks.com/": ["turnto.com", "turntonetworks.com"] + } + }, + { + "Tweetboard": { + "http://tweetboard.com/": ["tweetboard.com"] + } + }, + { + "Twitter Counter": { + "http://twittercounter.com/": ["twittercounter.com"] + } + }, + { + "UberMedia": { + "http://ubermedia.com/": ["tweetup.com", "ubermedia.com"] + } + }, + { + "UberTags": { + "http://ubertags.com/": ["ubertags.com"] + } + }, + { + "Unbounce": { + "http://unbounce.com/": ["unbounce.com"] + } + }, + { + "Uptrends": { + "http://www.uptrends.com/": ["uptrends.com"] + } + }, + { + "Usability Sciences": { + "http://www.usabilitysciences.com/": [ + "usabilitysciences.com", + "webiqonline.com" + ] + } + }, + { + "UserVoice": { + "http://www.uservoice.com/": ["uservoice.com"] + } + }, + { + "Vertical Acuity": { + "http://www.verticalacuity.com/": ["verticalacuity.com"] + } + }, + { + "VG WORT": { + "http://www.vgwort.de/": ["vgwort.de"] + } + }, + { + "Videology": { + "http://www.videologygroup.com/": [ + "tidaltv.com", + "videologygroup.com" + ] + } + }, + { + "Viewbix": { + "http://www.viewbix.com/": ["qoof.com", "viewbix.com"] + } + }, + { + "Vimeo": { + "http://vimeo.com/": ["vimeo.com", "vimeocdn.com"] + } + }, + { + "VINDICO": { + "http://vindicogroup.com/": ["vindicogroup.com", "vindicosuite.com"] + } + }, + { + "Voice2Page": { + "http://www.voice2page.com/": ["voice2page.com"] + } + }, + { + "WebsiteAlive": { + "http://www.websitealive.com/": [ + "websitealive.com", + "websitealive0.com", + "websitealive1.com", + "websitealive2.com", + "websitealive3.com", + "websitealive4.com", + "websitealive5.com", + "websitealive6.com", + "websitealive7.com", + "websitealive8.com", + "websitealive9.com" + ] + } + }, + { + "Yahoo!": { + "http://www.yahoo.com/": [ + "answers.yahoo.com", + "apps.yahoo.com", + "autos.yahoo.com", + "biz.yahoo.com", + "developer.yahoo.com", + "everything.yahoo.com", + "finance.yahoo.com", + "flickr.com", + "games.yahoo.com", + "groups.yahoo.com", + "help.yahoo.com", + "hotjobs.yahoo.com", + "info.yahoo.com", + "local.yahoo.com", + "luminate.com", + "messages.yahoo.com", + "movies.yahoo.com", + "msg.yahoo.com", + "news.yahoo.com", + "omg.yahoo.com", + "pipes.yahoo.com", + "pixazza.com", + "realestate.yahoo.com", + "search.yahoo.com", + "shine.yahoo.com", + "smallbusiness.yahoo.com", + "sports.yahoo.com", + "staticflickr.com", + "suggestions.yahoo.com", + "travel.yahoo.com", + "tumblr.com", + "upcoming.yahoo.com", + "webhosting.yahoo.com", + "widgets.yahoo.com", + "www.yahoo.com", + "yahooapis.com", + "yahoofs.com", + "yimg.com", + "ypolicyblog.com", + "yuilibrary.com", + "zenfs.com" + ] + } + }, + { + "Yandex": { + "http://www.yandex.com/": [ + "kinopoisk.ru", + "yandex.by", + "yandex.com", + "yandex.com.tr", + "yandex.ru", + "yandex.st", + "yandex.ua" + ] + } + }, + { + "Zendesk": { + "http://www.zendesk.com/": ["zendesk.com"] + } + }, + { + "Zopim": { + "https://www.zopim.com/": ["zopim.com"] + } + } + ], + "Analytics": [ + { + "63 Squares": { + "http://63squares.com/": ["63squares.com", "i-stats.com"] + } + }, + { + "Acxiom": { + "http://www.acxiom.com/": [ + "acxiom.com", + "acxiomapac.com", + "mm7.net", + "pippio.com" + ] + } + }, + { + "AddFreeStats": { + "http://www.addfreestats.com/": ["3dstats.com", "addfreestats.com"] + } + }, + { + "Adloox": { + "http://www.adloox.com/": ["adloox.com", "adlooxtracking.com"] + } + }, + { + "Adventori": { + "https://adventori.com": ["adventori.com"] + } + }, + { + "AIData": { + "http://www.aidata.me/": ["advombat.ru", "aidata.me"] + } + }, + { + "AivaLabs": { + "https://aivalabs.com": ["aivalabs.com"] + } + }, + { + "Akamai": { + "http://www.akamai.com/": ["go-mpulse.net"] + } + }, + { + "Amadesa": { + "http://www.amadesa.com/": ["amadesa.com"] + } + }, + { + "Amazing Counters": { + "http://amazingcounters.com/": ["amazingcounters.com"] + } + }, + { + "Amazon.com": { + "http://www.amazon.com/": ["alexametrics.com"] + } + }, + { + "Amplitude": { + "https://amplitude.com/": ["amplitude.com"] + } + }, + { + "anormal-media.de": { + "http://anormal-media.de/": ["anormal-media.de", "anormal-tracker.de"] + } + }, + { + "AT Internet": { + "http://www.atinternet.com/": [ + "at-o.net", + "atinternet.com", + "xiti.com" + ] + } + }, + { + "Attracta": { + "https://www.attracta.com/": ["attracta.com"] + } + }, + { + "Automattic": { + "http://automattic.com/": ["polldaddy.com"] + } + }, + { + "AvantLink": { + "http://www.avantlink.com/": ["avmws.com"] + } + }, + { + "Awio": { + "http://www.awio.com/": ["awio.com", "w3counter.com", "w3roi.com"] + } + }, + { + "Belstat": { + "http://www.belstat.com/": [ + "belstat.be", + "belstat.com", + "belstat.de", + "belstat.fr", + "belstat.nl" + ] + } + }, + { + "BetssonPalantir": { + "https://betssonpalantir.com/": ["betssonpalantir.com"] + } + }, + { + "BlogCounter.com": { + "http://www.blogcounter.de/": ["blogcounter.de"] + } + }, + { + "BloomReach": { + "http://www.bloomreach.com/": ["p.brsrvr.com"] + } + }, + { + "BlueCava": { + "http://www.bluecava.com/": ["bluecava.com"] + } + }, + { + "Bluemetrix": { + "http://www.bluemetrix.com/": ["bluemetrix.com", "bmmetrix.com"] + } + }, + { + "Bombora": { + "https://bombora.com/": ["ml314.com"] + } + }, + { + "Branch": { + "https://branch.io/": ["branch.io"] + } + }, + { + "Branica": { + "http://www.branica.com/": ["branica.com"] + } + }, + { + "BrightEdge": { + "http://www.brightedge.com/": ["b0e8.com", "brightedge.com"] + } + }, + { + "Bubblestat": { + "http://www.bubblestat.com/": ["bubblestat.com"] + } + }, + { + "Cardlytics": { + "http://www.cardlytics.com/": ["cardlytics.com"] + } + }, + { + "Chartbeat": { + "http://chartbeat.com/": ["chartbeat.com", "chartbeat.net"] + } + }, + { + "Clickdensity": { + "http://www.clickdensity.com/": ["clickdensity.com"] + } + }, + { + "ClickGuard": { + "https://www.clickguard.com/": ["clickguard.com"] + } + }, + { + "ClickTale": { + "http://www.clicktale.com/": [ + "clicktale.com", + "clicktale.net", + "pantherssl.com" + ], + "session-replay": "true" + } + }, + { + "ClixMetrix": { + "http://www.clixmetrix.com/": ["clixmetrix.com"] + } + }, + { + "Clixpy": { + "http://clixpy.com/": ["clixpy.com"] + } + }, + { + "ClustrMaps": { + "http://www.clustrmaps.com/": ["clustrmaps.com"] + } + }, + { + "CNZZ": { + "http://www.cnzz.com/": ["cnzz.com"] + } + }, + { + "Compuware": { + "http://www.compuware.com/": [ + "axf8.net", + "compuware.com", + "gomez.com" + ] + } + }, + { + "comScore": { + "http://www.comscore.com/": [ + "certifica.com", + "comscore.com", + "mdotlabs.com", + "scorecardresearch.com", + "sitestat.com", + "voicefive.com" + ] + } + }, + { + "Connexity": { + "http://www.connexity.com/": ["connexity.com", "connexity.net"] + } + }, + { + "Convert Insights": { + "http://www.convert.com/": ["convert.com", "reedge.com"] + } + }, + { + "Convertro": { + "http://www.convertro.com/": ["convertro.com"] + } + }, + { + "Crazy Egg": { + "http://www.crazyegg.com/": ["cetrk.com", "crazyegg.com"] + } + }, + { + "Crowd Science": { + "http://crowdscience.com/": ["crowdscience.com"] + } + }, + { + "Cya2": { + "http://cya2.net/": ["cya2.net"] + } + }, + { + "Dataium": { + "http://www.dataium.com/": ["collserve.com", "dataium.com"] + } + }, + { + "Deep Intent": { + "https://www.deepintent.com/": ["deepintent.com"] + } + }, + { + "Demandbase": { + "http://www.demandbase.com/": ["company-target.com", "demandbase.com"] + } + }, + { + "DirectCORP": { + "http://www.directcorp.de/": ["ipcounter.de"] + } + }, + { + "DistilNetworks": { + "https://www.distilnetworks.com/": ["distiltag.com"] + } + }, + { + "DoubleVerify": { + "http://www.doubleverify.com/": ["doubleverify.com"] + } + }, + { + "dwstat.com": { + "http://www.dwstat.cn/": ["dwstat.cn"] + } + }, + { + "ECSAnalytics": { + "https://www.theecsinc.com/": ["ecsanalytics.com"] + } + }, + { + "EFF": { + "https://www.eff.org/": [ + "do-not-tracker.org", + "eviltracker.net", + "trackersimulator.org" + ] + } + }, + { + "eProof.com": { + "http://www.eproof.com/": ["eproof.com"] + } + }, + { + "etracker": { + "http://www.etracker.com/": [ + "etracker.com", + "etracker.de", + "sedotracker.com", + "sedotracker.de" + ] + } + }, + { + "Eulerian Technologies": { + "http://www.eulerian.com/": ["eulerian.com", "eulerian.net"] + } + }, + { + "eXTReMe digital": { + "http://extremetracking.com/": [ + "extreme-dm.com", + "extremetracking.com" + ] + } + }, + { + "Eyeota": { + "http://eyeota.net/": ["eyeota.net"] + } + }, + { + "Feedjit": { + "http://feedjit.com/": ["feedjit.com"] + } + }, + { + "Flashtalking": { + "http://www.flashtalking.com/": [ + "encoremetrics.com", + "sitecompass.com" + ] + } + }, + { + "Footprint": { + "http://www.footprintlive.com/": ["footprintlive.com"] + } + }, + { + "Free Online Users": { + "http://www.freeonlineusers.com/": ["freeonlineusers.com"] + } + }, + { + "Free-PageRank.com": { + "http://www.free-pagerank.com/": ["free-pagerank.com"] + } + }, + { + "Friends2Follow": { + "https://friends2follow.com/": ["antifraudjs.friends2follow.com"] + } + }, + { + "Fullstory": { + "https://www.fullstory.com/": ["fullstory.com"], + "session-replay": "true" + } + }, + { + "GetSiteControl": { + "https://getsitecontrol.com/": ["getsitecontrol.com"] + } + }, + { + "GfK Group": { + "http://www.gfk.com/": ["daphnecm.com", "gfk.com", "gfkdaphne.com"] + } + }, + { + "GitHub": { + "https://github.com/": ["gaug.es"] + } + }, + { + "Go Daddy": { + "http://www.godaddy.com/": ["godaddy.com", "trafficfacts.com"] + } + }, + { + "Google": { + "http://www.google.com/": ["google-analytics.com", "postrank.com"] + } + }, + { + "GoSquared": { + "https://www.gosquared.com/": ["gosquared.com"] + } + }, + { + "GoStats": { + "http://gostats.com/": ["gostats.com"] + } + }, + { + "GrapheneMedia": { + "http://graphenemedia.in/": ["graphenedigitalanalytics.in"] + } + }, + { + "GTop": { + "http://www.gtop.ro/": ["gtop.ro", "gtopstats.com"] + } + }, + { + "Hearst": { + "http://www.hearst.com/": ["raasnet.com", "redaril.com"] + } + }, + { + "Histats": { + "http://www.histats.com/": ["histats.com"] + } + }, + { + "HitsLink": { + "http://www.hitslink.com/": ["hitslink.com"] + } + }, + { + "Hit Sniffer": { + "http://www.hitsniffer.com/": ["hitsniffer.com"] + } + }, + { + "Hotjar": { + "https://www.hotjar.com": ["hotjar.com"] + } + }, + { + "HubSpot": { + "http://www.hubspot.com/": ["hs-analytics.net"] + } + }, + { + "IBM": { + "http://www.ibm.com/": ["cmcore.com", "coremetrics.com", "ibm.com"] + } + }, + { + "InboundWriter": { + "http://www.inboundwriter.com/": [ + "enquisite.com", + "inboundwriter.com" + ] + } + }, + { + "Infernotions": { + "https://infernotions.com/": ["infernotions.com"] + } + }, + { + "INFOnline": { + "https://www.infonline.de/": ["infonline.de", "ioam.de", "ivwbox.de"] + } + }, + { + "InfoStars": { + "http://infostars.ru/": ["hotlog.ru", "infostars.ru"] + } + }, + { + "Inspectlet": { + "http://www.inspectlet.com/": ["inspectlet.com"] + } + }, + { + "IntelligenceFocus": { + "http://www.intelligencefocus.com/": [ + "domodomain.com", + "intelligencefocus.com" + ] + } + }, + { + "iPerceptions": { + "http://www.iperceptions.com/": ["iperceptions.com"] + } + }, + { + "IslayTech": { + "http://islay.tech": ["islay.tech"] + } + }, + { + "ItIsATracker": { + "https://itisatracker.com/": ["itisatracker.com"], + "dnt": "eff" + } + }, + { + "KeyMetric": { + "http://www.keymetric.net/": ["keymetric.net"] + } + }, + { + "KISSmetrics": { + "http://kissmetrics.com/": ["kissmetrics.com"] + } + }, + { + "Kitcode": { + "http://src.kitcode.net/": ["src.kitcode.net"] + } + }, + { + "LeadForensics": { + "https://www.leadforensics.com": ["leadforensics.com"] + } + }, + { + "LineZing": { + "http://www.linezing.com/": ["linezing.com"] + } + }, + { + "LivePerson": { + "http://www.liveperson.net/": ["liveperson.com", "nuconomy.com"] + } + }, + { + "Logdy": { + "http://logdy.com/": ["logdy.com"] + } + }, + { + "Lotame": { + "http://www.lotame.com/": ["crwdcntrl.net", "lotame.com"] + } + }, + { + "LuckyOrange": { + "https://www.luckyorange.com": ["luckyorange.com", "luckyorange.net"], + "session-replay": "true" + } + }, + { + "Lynchpin": { + "http://www.lynchpin.com/": ["lynchpin.com", "lypn.com"] + } + }, + { + "Lyris": { + "http://www.lyris.com/": ["clicktracks.com", "lyris.com"] + } + }, + { + "Lytiks": { + "http://www.lytiks.com/": ["lytiks.com"] + } + }, + { + "MarkMonitor": { + "https://www.markmonitor.com": ["9c9media.ca", "markmonitor.com"] + } + }, + { + "Marktest": { + "http://www.marktest.com/": ["marktest.com", "marktest.pt"] + } + }, + { + "MaxMind": { + "https://www.maxmind.com/en/home": ["maxmind.com", "mmapiws.com"] + } + }, + { + "Médiamétrie-eStat": { + "http://www.mediametrie-estat.com/": [ + "estat.com", + "mediametrie-estat.com" + ] + } + }, + { + "Merkle": { + "https://www.merkleinc.com/": ["merkleinc.com", "rkdms.com"] + } + }, + { + "Mixpanel": { + "https://mixpanel.com/": ["mixpanel.com", "mxpnl.com"] + } + }, + { + "Mongoose Metrics": { + "http://www.mongoosemetrics.com/": ["mongoosemetrics.com"] + } + }, + { + "Monitus": { + "http://www.monitus.net/": ["monitus.net"] + } + }, + { + "motigo": { + "http://motigo.com/": ["motigo.com", "nedstatbasic.net"] + } + }, + { + "Mouseflow": { + "http://mouseflow.com/": ["mouseflow.com"] + } + }, + { + "MyPagerank.Net": { + "http://www.mypagerank.net/": ["mypagerank.net"] + } + }, + { + "Mystighty": { + "http://mystighty.info/": ["mystighty.info", "sweeterge.info"] + } + }, + { + "Narrative": { + "http://narrative.io/2/": ["narrative.io"] + } + }, + { + "Net Applications": { + "http://www.netapplications.com/": [ + "hitsprocessor.com", + "netapplications.com" + ] + } + }, + { + "New Relic": { + "http://newrelic.com/": ["newrelic.com", "nr-data.net"] + } + }, + { + "NewsRight": { + "http://www.newsright.com/": ["apnewsregistry.com"] + } + }, + { + "NextSTAT": { + "http://www.nextstat.com/": ["nextstat.com"] + } + }, + { + "Nielsen": { + "http://www.nielsen.com/": ["glanceguide.com", "nielsen.com"] + } + }, + { + "NuDataSecurity": { + "https://nudatasecurity.com/": ["nudatasecurity.com"] + } + }, + { + "nurago": { + "http://www.nurago.com/": ["nurago.com", "nurago.de", "sensic.net"] + } + }, + { + "Observer": { + "http://observerapp.com/": ["observerapp.com"] + } + }, + { + "OnAudience": { + "http://www.onaudience.com/": [ + "behavioralengine.com", + "onaudience.com" + ] + } + }, + { + "OneStat": { + "http://www.onestat.com/": ["onestat.com"] + } + }, + { + "Openstat": { + "https://www.openstat.ru/": ["openstat.ru", "spylog.com"] + } + }, + { + "Opentracker": { + "http://www.opentracker.net/": ["opentracker.net"] + } + }, + { + "Opolen": { + "https://opolen.com.br": ["opolen.com.br"] + } + }, + { + "Optimizely": { + "https://www.optimizely.com/": ["optimizely.com"] + } + }, + { + "Oracle": { + "http://www.oracle.com/": ["eloqua.com", "maxymiser.com"] + } + }, + { + "ÖWA": { + "http://www.oewa.at/": ["oewa.at", "oewabox.at"] + } + }, + { + "Parse.ly": { + "http://parsely.com/": ["parsely.com"] + } + }, + { + "PersianStat.com": { + "http://www.persianstat.com/": ["persianstat.com"] + } + }, + { + "Phonalytics": { + "http://www.phonalytics.com/": ["phonalytics.com"] + } + }, + { + "phpMyVisites": { + "http://www.phpmyvisites.us/": ["phpmyvisites.us"] + } + }, + { + "Piwik": { + "http://piwik.org/": ["piwik.org"] + } + }, + { + "PixAnalytics": { + "https://pixanalytics.com/": ["pixanalytics.com"] + } + }, + { + "Poool": { + "http://poool.fr/": ["poool.fr"] + } + }, + { + "Pronunciator": { + "http://www.pronunciator.com/": [ + "pronunciator.com", + "visitorville.com" + ] + } + }, + { + "Qualaroo": { + "http://qualaroo.com/": ["kissinsights.com", "qualaroo.com"] + } + }, + { + "QuinStreet": { + "http://quinstreet.com/": ["thecounter.com"] + } + }, + { + "Quintelligence": { + "http://www.quintelligence.com/": ["quintelligence.com"] + } + }, + { + "RadarURL": { + "http://radarurl.com/": ["radarurl.com"] + } + }, + { + "Research Now": { + "http://www.researchnow.com/": [ + "researchnow.com", + "valuedopinions.co.uk" + ] + } + }, + { + "Retail Automata": { + "https://retailautomata.com": ["retailautomata.com"] + } + }, + { + "Revtracks": { + "http://revtrax.com/": ["revtrax.com"] + } + }, + { + "Ringier": { + "http://ringier.cz/": ["ringier.cz"] + } + }, + { + "Rollick": { + "https://gorollick.com": ["rollick.io"] + } + }, + { + "Roxr": { + "http://roxr.net/": ["getclicky.com", "roxr.net", "staticstuff.net"] + } + }, + { + "Safecount": { + "http://www.safecount.net/": [ + "dl-rms.com", + "dlqm.net", + "questionmarket.com", + "safecount.net" + ] + } + }, + { + "SageMetrics": { + "http://www.sagemetrics.com/": ["sageanalyst.net", "sagemetrics.com"] + } + }, + { + "Salesintelligence": { + "https://salesintelligence.pl/": ["plugin.management"] + } + }, + { + "SeeVolution": { + "https://www.seevolution.com/": ["seevolution.com", "svlu.net"] + } + }, + { + "Segment.io": { + "https://segment.io/": ["segment.io"] + } + }, + { + "SendPulse": { + "https://sendpulse.com/": ["sendpulse.com"] + } + }, + { + "SessionCam": { + "https://sessioncam.com/": ["sessioncam.com"], + "session-replay": "true" + } + }, + { + "ShinyStat": { + "http://www.shinystat.com/": ["shinystat.com"] + } + }, + { + "Smartlook": { + "https://www.smartlook.com/": ["smartlook.com"], + "session-replay": "true" + } + }, + { + "Snoobi": { + "http://www.snoobi.com/": ["snoobi.com"] + } + }, + { + "Sourcepoint": { + "https://www.sourcepoint.com/": ["summerhamster.com"] + } + }, + { + "Sputnik.ru": { + "http://sputnik.ru": ["sputnik.ru"] + } + }, + { + "StackTrack": { + "http://stat-track.com": ["stat-track.com"] + } + }, + { + "stat4u": { + "http://stat.4u.pl/": ["4u.pl"] + } + }, + { + "StatCounter": { + "http://statcounter.com/": ["statcounter.com"] + } + }, + { + "Statisfy": { + "http://statisfy.net": ["statisfy.net"] + } + }, + { + "STATSIT": { + "http://www.statsit.com/": ["statsit.com"] + } + }, + { + "Storeland": { + "https://storeland.ru/": ["storeland.ru"] + } + }, + { + "Stratigent": { + "http://www.stratigent.com/": ["stratigent.com"] + } + }, + { + "Tealium": { + "https://tealium.com": ["tealiumiq.com"] + } + }, + { + "TechSolutions": { + "https://www.techsolutions.com.tw/": ["techsolutions.com.tw"] + } + }, + { + "TENSQUARE": { + "http://www.tensquare.com/": ["tensquare.com"] + } + }, + { + "The Heron Partnership": { + "http://www.heronpartners.com.au/": [ + "heronpartners.com.au", + "marinsm.com" + ] + } + }, + { + "TNS": { + "http://www.tnsglobal.com/": [ + "sesamestats.com", + "statistik-gallup.net", + "tns-counter.ru", + "tns-cs.net", + "tnsglobal.com" + ] + } + }, + { + "TrackingSoft": { + "http://trackingsoft.com/": ["roia.biz", "trackingsoft.com"] + } + }, + { + "TrafficScore": { + "https://trafficscore.com/": ["trafficscore.com"] + } + }, + { + "Twitter": { + "https://twitter.com/": ["crashlytics.com", "tweetdeck.com"] + } + }, + { + "Umbel": { + "https://www.umbel.com/": ["umbel.com"] + } + }, + { + "User Local": { + "http://nakanohito.jp/": ["nakanohito.jp"] + } + }, + { + "V12 Data": { + "https://www.v12data.com/": ["v12data.com", "v12group.com"] + } + }, + { + "Vertster": { + "http://www.vertster.com/": ["vertster.com"] + } + }, + { + "VisiStat": { + "http://www.visistat.com/": ["sa-as.com", "visistat.com"] + } + }, + { + "Visit Streamer": { + "http://www.visitstreamer.com/": ["visitstreamer.com"] + } + }, + { + "vistrac": { + "http://vistrac.com/": ["vistrac.com"] + } + }, + { + "ViziSense": { + "http://www.vizisense.com/": ["vizisense.com", "vizisense.net"] + } + }, + { + "Webclicktracker": { + "http://www.webclicktracker.com/": ["webclicktracker.com"] + } + }, + { + "Web Stats": { + "http://www.onlinewebstats.com/": ["onlinewebstats.com"] + } + }, + { + "Web Tracking Services": { + "http://www.webtrackingservices.com/": [ + "web-stat.com", + "webtrackingservices.com" + ] + } + }, + { + "Web Traxs": { + "http://www.webtraxs.com/": ["webtraxs.com"] + } + }, + { + "Webtrekk": { + "http://www.webtrekk.com/": ["webtrekk.com", "webtrekk.net"] + } + }, + { + "Webtrends": { + "http://webtrends.com/": [ + "reinvigorate.net", + "webtrends.com", + "webtrendslive.com" + ] + } + }, + { + "White Ops": { + "https://www.whiteops.com/": ["adzmath.com", "whiteops.com"] + } + }, + { + "whos.amung.us": { + "http://whos.amung.us/": ["amung.us"] + } + }, + { + "Wingify": { + "http://wingify.com/": ["visualwebsiteoptimizer.com", "wingify.com"] + } + }, + { + "Woopra": { + "http://www.woopra.com/": ["woopra-ns.com", "woopra.com"] + } + }, + { + "WOW Analytics": { + "http://www.wowanalytics.co.uk/": ["wowanalytics.co.uk"] + } + }, + { + "WPP": { + "http://www.wpp.com/": ["compete.com"] + } + }, + { + "Wysistat": { + "http://www.wysistat.com/": ["wysistat.com"] + } + }, + { + "Yahoo!": { + "http://www.yahoo.com/": ["analytics.yahoo.com"] + } + }, + { + "YellowTracker": { + "http://www.yellowtracker.com/": ["yellowtracker.com"] + } + }, + { + "YSance": { + "https://www.ysance.com/data-services/fr/home/": ["y-track.com"] + } + } + ], + "Fingerprinting": [ + { + "Adabra": { + "https://www.adabra.com/": ["adabra.com"] + } + }, + { + "Adbot": { + "https://adbot.tw/": ["adbot.tw"] + } + }, + { + "AdGainerSolutions": { + "http://adgainersolutions.com/adgainer/": ["adgainersolutions.com"] + } + }, + { + "AdMaven": { + "https://ad-maven.com/": [ + "ad-maven.com", + "agreensdistra.info", + "boudja.com", + "rensovetors.info", + "wrethicap.info" + ] + } + }, + { + "Admicro": { + "http://www.admicro.vn/": ["admicro.vn", "vcmedia.vn"] + } + }, + { + "Adnium": { + "https://adnium.com": ["adnium.com", "montwam.top"] + } + }, + { + "AdScore": { + "http://www.adscoremarketing.com/": ["adsco.re"] + } + }, + { + "AdYouLike": { + "https://www.adyoulike.com/": ["pulpix.com"] + } + }, + { + "AivaLabs": { + "https://aivalabs.com": ["aivalabs.com"] + } + }, + { + "Albacross": { + "https://albacross.com": ["albacross.com"] + } + }, + { + "AppCast": { + "https://appcast.io/": ["appcast.io"] + } + }, + { + "AuditedMedia": { + "https://auditedmedia.com/": [ + "aamapi.com", + "aamsitecertifier.com", + "auditedmedia.com" + ] + } + }, + { + "Augur": { + "http://www.augur.io/": ["augur.io"] + } + }, + { + "Azet": { + "http://mediaimpact.sk/": ["azetklik.sk", "rsz.sk"] + } + }, + { + "BetssonPalantir": { + "https://betssonpalantir.com/": ["betssonpalantir.com"] + } + }, + { + "BigClick": { + "http://bigclick.me/": ["bgclck.me", "xcvgdf.party"] + } + }, + { + "BitMedia": { + "https://bitmedia.io/": ["bitmedia.io"] + } + }, + { + "BlueCava": { + "http://www.bluecava.com/": ["bluecava.com"] + } + }, + { + "BoostBox": { + "https://www.boostbox.com.br/": ["boostbox.com.br"] + } + }, + { + "Brandcrumb": { + "http://www.brandcrumb.com": ["brandcrumb.com"] + } + }, + { + "BreakTime": { + "https://www.breaktime.com.tw/": ["breaktime.com.tw"] + } + }, + { + "BrightEdge": { + "http://www.brightedge.com/": ["b0e8.com"] + } + }, + { + "C3 Metrics": { + "http://c3metrics.com/": [ + "attributionmodel.com", + "c3metrics.com", + "c3tag.com" + ] + } + }, + { + "CallSource": { + "https://www.callsource.com/": ["leadtrackingdata.com"] + } + }, + { + "CartsGuru": { + "https://carts.guru/": ["carts.guru"] + } + }, + { + "ClearLink": { + "https://www.clearlink.com/": ["clearlink.com"] + } + }, + { + "Clickayab": { + "http://www.clickyab.com": ["clickyab.com"] + } + }, + { + "ClickFrog": { + "https://clickfrog.ru/": [ + "bashirian.biz", + "buckridge.link", + "franecki.net", + "quitzon.net", + "reichelcormier.bid", + "wisokykulas.bid" + ] + } + }, + { + "ClickGuard": { + "https://www.clickguard.com/": ["clickguard.com"] + } + }, + { + "Clixtell": { + "https://www.clixtell.com/": ["clixtell.com"] + } + }, + { + "Consumable": { + "http://consumable.com/": ["consumable.com"] + } + }, + { + "dmpxs": { + "http://bob.dmpxs.com": ["dmpxs.com"] + } + }, + { + "ECSAnalytics": { + "https://www.theecsinc.com/": ["ecsanalytics.com"] + } + }, + { + "EroAdvertising": { + "http://www.ero-advertising.com/": ["ero-advertising.com"] + } + }, + { + "eyeReturn Marketing": { + "http://www.eyereturnmarketing.com/": [ + "eyereturn.com", + "eyereturnmarketing.com" + ] + } + }, + { + "Fanplayr": { + "https://fanplayr.com/": ["fanplayr.com"] + } + }, + { + "Foresee": { + "https://www.foresee.com": ["answerscloud.com", "foresee.com"] + } + }, + { + "Friends2Follow": { + "https://friends2follow.com/": ["antifraudjs.friends2follow.com"] + } + }, + { + "FuelX": { + "https://fuelx.com/": ["fuel451.com", "fuelx.com"] + } + }, + { + "Gleam": { + "https://gleam.io/": ["fraudjs.io"] + } + }, + { + "GrapheneMedia": { + "http://graphenemedia.in/": ["graphenedigitalanalytics.in"] + } + }, + { + "Gruner + Jahr": { + "http://www.guj.de/": ["ligatus.com"] + } + }, + { + "HilltopAds": { + "https://hilltopads.com/": ["hilltopads.net", "shoporielder.pro"] + } + }, + { + "HotelChamp": { + "https://www.hotelchamp.com": ["hotelchamp.com"] + } + }, + { + "iMedia": { + "http://www.imedia.cz": ["imedia.cz"] + } + }, + { + "IslayTech": { + "http://islay.tech": ["islay.tech"] + } + }, + { + "ismatlab.com": { + "http://ismatlab.com": ["ismatlab.com"] + } + }, + { + "Itch": { + "https://itch.io/": ["itch.io"] + } + }, + { + "justuno": { + "https://www.justuno.com/": ["justuno.com"] + } + }, + { + "Konduto": { + "http://konduto.com": ["k-analytix.com", "konduto.com"] + } + }, + { + "LeadsHub": { + "https://ztsrv.com/": ["ztsrv.com"] + } + }, + { + "lptracker": { + "https://lptracker.io/": ["lptracker.io"] + } + }, + { + "MaxMind": { + "https://www.maxmind.com/en/home": ["maxmind.com", "mmapiws.com"] + } + }, + { + "Mercadopago": { + "https://www.mercadopago.com/": ["mercadopago.com"] + } + }, + { + "Mobials": { + "http://mobials.com": ["mobials.com"] + } + }, + { + "Mystighty": { + "http://mystighty.info/": ["mystighty.info", "sweeterge.info"] + } + }, + { + "Negishim": { + "http://www.negishim.org": ["negishim.org"] + } + }, + { + "NuDataSecurity": { + "https://nudatasecurity.com/": ["nudatasecurity.com"] + } + }, + { + "OneAd": { + "https://www.onead.com.tw/": [ + "guoshipartners.com", + "onevision.com.tw" + ] + } + }, + { + "OnlineMetrix": { + "http://h.online-metrix.net": ["online-metrix.net"] + } + }, + { + "Opolen": { + "https://opolen.com.br": ["opolen.com.br"] + } + }, + { + "PaymentsMB": { + "https://paymentsmb.com": ["paymentsmb.com"] + } + }, + { + "Paypal": { + "https://www.paypal.com": ["simility.com"] + } + }, + { + "PerimeterX": { + "https://www.perimeterx.com": ["perimeterx.net"] + } + }, + { + "PixAnalytics": { + "https://pixanalytics.com/": ["pixanalytics.com"] + } + }, + { + "Pixlee": { + "https://www.pixlee.com/": ["pixlee.com"] + } + }, + { + "Poool": { + "http://poool.fr/": ["poool.fr"] + } + }, + { + "PPCProtect": { + "https://ppcprotect.com": ["ppcprotect.com"] + } + }, + { + "PrismApp": { + "https://www.prismapp.io/": ["prismapp.io"] + } + }, + { + "PrometheusIntelligenceTechnology": { + "https://prometheusintelligencetechnology.com/": [ + "prometheusintelligencetechnology.com" + ] + } + }, + { + "Provers": { + "http://provers.pro": ["provers.pro"] + } + }, + { + "Psonstrentie": { + "http://psonstrentie.info": ["psonstrentie.info"] + } + }, + { + "Rollick": { + "https://gorollick.com": ["rollick.io"] + } + }, + { + "SAP": { + "https://www.sap.com": ["seewhy.com"] + } + }, + { + "Selectable Media": { + "http://selectablemedia.com/": ["nabbr.com", "selectablemedia.com"] + } + }, + { + "Semantiqo": { + "http://semantiqo.com/": ["semantiqo.com"] + } + }, + { + "SendPulse": { + "https://sendpulse.com/": ["sendpulse.com"] + } + }, + { + "ShaftTraffic": { + "https://shafttraffic.com": ["libertystmedia.com"] + } + }, + { + "Shortest": { + "http://shorte.st/": ["shorte.st"] + } + }, + { + "SiftScience": { + "https://sift.com/": ["siftscience.com"] + } + }, + { + "Signifyd": { + "https://www.signifyd.com/": ["signifyd.com"] + } + }, + { + "Smi": { + "http://24smi.net": ["24smi.net"] + } + }, + { + "Socital": { + "https://www.socital.com": ["socital.com"] + } + }, + { + "Storeland": { + "https://storeland.ru/": ["storeland.ru"] + } + }, + { + "Stripe": { + "https://stripe.com": ["stripe.network"] + } + }, + { + "TechSolutions": { + "https://www.techsolutions.com.tw/": ["techsolutions.com.tw"] + } + }, + { + "tongdun.cn": { + "https://www.tongdun.cn/?lan=EN": ["fraudmetrix.cn", "tongdun.net"] + } + }, + { + "Upland": { + "https://uplandsoftware.com/": ["leadlander.com", "sf14g.com"] + } + }, + { + "Vendemore": { + "https://vendemore.com/": ["vendemore.com"] + } + }, + { + "VerticalHealth": { + "https://www.verticalhealth.com/": ["verticalhealth.net"] + } + }, + { + "Webmecanik": { + "https://www.webmecanik.com/": ["webmecanik.com"] + } + }, + { + "WideOrbit": { + "https://www.wideorbit.com/": ["dep-x.com"] + } + }, + { + "YSance": { + "https://www.ysance.com/data-services/fr/home/": ["y-track.com"] + } + }, + { + "ZafulAffiliate": { + "https://affiliate.zaful.com/": [ + "affasi.com", + "gw-ec.com", + "zaful.com" + ] + } + }, + { + "Zefir": { + "https://ze-fir.com/": ["ze-fir.com"] + } + } + ], + "Social": [ + { + "AddThis": { + "http://www.addthis.com/": [ + "addthis.com", + "addthiscdn.com", + "addthisedge.com", + "clearspring.com", + "connectedads.net", + "xgraph.com", + "xgraph.net" + ] + } + }, + { + "Causes": { + "http://www.causes.com/": ["causes.com"] + } + }, + { + "Digg": { + "http://digg.com/": ["digg.com"] + } + }, + { + "Facebook": { + "http://www.facebook.com/": [ + "apps.fbsbx.com", + "atdmt.com", + "facebook.com", + "facebook.de", + "facebook.fr", + "facebook.net", + "fb.com", + "fbsbx.com", + "friendfeed.com" + ] + } + }, + { + "Google": { + "http://www.google.com/": [ + "developers.google.com", + "gmail.com", + "googlemail.com", + "inbox.google.com", + "mail.google.com", + "orkut.com", + "plus.google.com", + "plusone.google.com", + "smartlock.google.com", + "voice.google.com", + "wave.google.com" + ] + } + }, + { + "LinkedIn": { + "http://www.linkedin.com/": ["licdn.com", "linkedin.com"] + } + }, + { + "Lockerz": { + "http://lockerz.com/": ["lockerz.com"] + } + }, + { + "Mail.Ru": { + "http://mail.ru/": ["list.ru", "mail.ru"] + } + }, + { + "Meebo": { + "https://www.meebo.com/": ["meebo.com", "meebocdn.net"] + } + }, + { + "Papaya": { + "http://papayamobile.com/": ["papayamobile.com"] + } + }, + { + "reddit": { + "http://www.reddit.com/": ["reddit.com"] + } + }, + { + "Shareaholic": { + "http://www.shareaholic.com/": ["shareaholic.com"] + } + }, + { + "ShareThis": { + "http://sharethis.com/": ["sharethis.com"] + } + }, + { + "StumbleUpon": { + "http://www.stumbleupon.com/": ["stumble-upon.com", "stumbleupon.com"] + } + }, + { + "Twitter": { + "https://twitter.com/": ["twimg.com", "twitter.com", "twitter.jp"] + } + }, + { + "VKontakte": { + "http://vk.com/": ["userapi.com", "vk.com", "vkontakte.ru"] + } + }, + { + "Yahoo!": { + "http://www.yahoo.com/": [ + "address.yahoo.com", + "alerts.yahoo.com", + "avatars.yahoo.com", + "buzz.yahoo.com", + "calendar.yahoo.com", + "edit.yahoo.com", + "legalredirect.yahoo.com", + "login.yahoo.com", + "mail.yahoo.com", + "my.yahoo.com", + "mybloglog.com", + "notepad.yahoo.com", + "pulse.yahoo.com", + "rocketmail.com", + "webmessenger.yahoo.com", + "ymail.com" + ] + } + } + ], + "Cryptomining": [ + { + "a.js": { + "http://zymerget.bid": [ + "alflying.date", + "alflying.win", + "anybest.site", + "flightsy.bid", + "flightsy.win", + "flightzy.bid", + "flightzy.date", + "flightzy.win", + "zymerget.bid", + "zymerget.faith" + ], + "performance": "true" + } + }, + { + "CashBeet": { + "http://cashbeet.com": ["cashbeet.com", "serv1swork.com"] + } + }, + { + "CoinHive": { + "https://coinhive.com": [ + "ad-miner.com", + "authedmine.com", + "bmst.pw", + "cnhv.co", + "coin-hive.com", + "coinhive.com", + "wsservices.org" + ], + "performance": "true" + } + }, + { + "CoinPot": { + "http://coinpot.co": ["coinpot.co"], + "performance": "true" + } + }, + { + "CryptoLoot": { + "https://crypto-loot.com": [ + "cryptaloot.pro", + "crypto-loot.com", + "cryptolootminer.com", + "flashx.pw", + "gitgrub.pro", + "reauthenticator.com", + "statdynamic.com", + "webmine.pro" + ], + "performance": "true" + } + }, + { + "CryptoWebMiner": { + "https://www.crypto-webminer.com": [ + "bitcoin-pay.eu", + "crypto-webminer.com", + "ethpocket.de", + "ethtrader.de" + ] + } + }, + { + "Gridcash": { + "https://www.gridcash.net/": ["adless.io", "gridcash.net"], + "performance": "true" + } + }, + { + "JSE": { + "http://jsecoin.com": [ + "freecontent.bid", + "freecontent.date", + "freecontent.stream", + "hashing.win", + "hostingcloud.racing", + "hostingcloud.science", + "jsecoin.com" + ], + "performance": "true" + } + }, + { + "MinerAlt": { + "http://mineralt.io": [ + "1q2w3.website", + "analytics.blue", + "aster18cdn.nl", + "belicimo.pw", + "besstahete.info", + "dinorslick.icu", + "feesocrald.com", + "gramombird.com", + "istlandoll.com", + "mepirtedic.com", + "mineralt.io", + "pampopholf.com", + "tercabilis.info", + "tulip18.com", + "vidzi.tv", + "yololike.space" + ], + "performance": "true" + } + }, + { + "Minescripts": { + "http://minescripts.info": ["minescripts.info", "sslverify.info"], + "performance": "true" + } + }, + { + "MineXMR": { + "http://minexmr.stream": ["minexmr.stream"], + "performance": "true" + } + }, + { + "NeroHut": { + "https://nerohut.com": ["nerohut.com", "nhsrv.cf"], + "performance": "true" + } + }, + { + "Service4refresh": { + "https://service4refresh.info": ["service4refresh.info"] + } + }, + { + "SpareChange": { + "http://sparechange.io": ["sparechange.io"], + "performance": "true" + } + }, + { + "SwiftMining": { + "https://swiftmining.win/": ["swiftmining.win"] + } + }, + { + "Webmine": { + "https://webmine.cz/": ["authedwebmine.cz", "webmine.cz"] + } + }, + { + "WebminePool": { + "http://webminepool.com": ["webminepool.com"], + "performance": "true" + } + }, + { + "Webmining": { + "https://webmining.co/": ["webmining.co"] + } + } + ] + } } diff --git a/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_safelist.json b/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_safelist.json index a2c80176b6..862e7db0de 100644 --- a/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_safelist.json +++ b/mobile/android/android-components/components/browser/engine-system/src/main/res/raw/domain_safelist.json @@ -1,12347 +1,6558 @@ { - "2leep.com": { - "properties": [ - "2leep.com" - ], - "resources": [ - "2leep.com" - ] - }, - "33Across": { - "properties": [ - "33across.com", - "tynt.com" - ], - "resources": [ - "33across.com", - "tynt.com" - ] - }, - "365Media": { - "properties": [ - "aggregateintelligence.com" - ], - "resources": [ - "365media.com", - "aggregateintelligence.com" - ] - }, - "4INFO": { - "properties": [ - "4info.com", - "adhaven.com" - ], - "resources": [ - "4info.com", - "adhaven.com" - ] - }, - "4mads": { - "properties": [ - "4mads.com" - ], - "resources": [ - "4mads.com" - ] - }, - "63 Squares": { - "properties": [ - "63labs.com" - ], - "resources": [ - "63labs.com", - "63squares.com", - "i-stats.com" - ] - }, - "Abax Interactive": { - "properties": [ - "abaxinteractive.com" - ], - "resources": [ - "abaxinteractive.com" - ] - }, - "Accelia": { - "properties": [ - "accelia.net", - "durasite.net" - ], - "resources": [ - "accelia.net", - "durasite.net" - ] - }, - "Accordant Media": { - "properties": [ - "accordantmedia.com" - ], - "resources": [ - "accordantmedia.com" - ] - }, - "Acquisio": { - "properties": [ - "acquisio.com", - "clickequations.net" - ], - "resources": [ - "acquisio.com", - "clickequations.net" - ] - }, - "Actisens": { - "properties": [ - "actisens.com", - "gestionpub.com" - ], - "resources": [ - "actisens.com", - "gestionpub.com" - ] - }, - "ActiveConversion": { - "properties": [ - "activeconversion.com", - "activemeter.com" - ], - "resources": [ - "activeconversion.com", - "activemeter.com" - ] - }, - "ActivEngage": { - "properties": [ - "activengage.com" - ], - "resources": [ - "activengage.com" - ] - }, - "Act-On": { - "properties": [ - "act-on.com", - "actonsoftware.com" - ], - "resources": [ - "act-on.com", - "actonsoftware.com" - ] - }, - "Acuity": { - "properties": [ - "acuity.com", - "acuityads.com", - "acuityplatform.com" - ], - "resources": [ - "acuity.com", - "acuityads.com", - "acuityplatform.com" - ] - }, - "Acxiom": { - "properties": [ - "acxiom.com", - "mm7.net" - ], - "resources": [ - "acxiom.com", - "acxiomapac.com", - "mm7.net", - "pippio.com" - ] - }, - "AD2ONE": { - "properties": [ - "ad2onegroup.com" - ], - "resources": [ - "ad2onegroup.com" - ] - }, - "Ad4Game": { - "properties": [ - "ad4game.com" - ], - "resources": [ - "ad4game.com" - ] - }, - "ad6media": { - "properties": [ - "ad6media.fr" - ], - "resources": [ - "ad6media.fr" - ] - }, - "Adabra": { - "properties": [ - "adabra.com" - ], - "resources": [ - "adabra.com" - ] - }, - "Adality": { - "properties": [ - "adality.de" - ], - "resources": [ - "adality.de", - "adrtx.net" - ] - }, - "AdaptiveAds": { - "properties": [ - "adaptiveads.com" - ], - "resources": [ - "adaptiveads.com" - ] - }, - "Adaptly": { - "properties": [ - "adaptly.com" - ], - "resources": [ - "adaptly.com" - ] - }, - "Adap.tv": { - "properties": [ - "adap.tv" - ], - "resources": [ - "adap.tv" - ] - }, - "Adara Media": { - "properties": [ - "adaramedia.com", - "opinmind.com", - "yieldoptimizer.com" - ], - "resources": [ - "adaramedia.com", - "opinmind.com", - "yieldoptimizer.com" - ] - }, - "Adatus": { - "properties": [ - "adatus.com" - ], - "resources": [ - "adatus.com" - ] - }, - "Adbot": { - "properties": [ - "adbot.tw" - ], - "resources": [ - "adbot.tw" - ] - }, - "Adbrain": { - "properties": [ - "adbrain.com" - ], - "resources": [ - "adbrain.com", - "adbrn.com" - ] - }, - "adBrite": { - "properties": [ - "adbrite.com" - ], - "resources": [ - "adbrite.com" - ] - }, - "Adbroker.de": { - "properties": [ - "adbroker.de" - ], - "resources": [ - "adbroker.de" - ] - }, - "Adchemy": { - "properties": [ - "adchemy.com" - ], - "resources": [ - "adchemy.com" - ] - }, - "AdCirrus": { - "properties": [ - "adcirrus.com" - ], - "resources": [ - "adcirrus.com" - ] - }, - "Ad Decisive": { - "properties": [ - "a2dfp.net", - "addecisive.com" - ], - "resources": [ - "a2dfp.net", - "addecisive.com" - ] - }, - "AddFreeStats": { - "properties": [ - "3dstats.com", - "addfreestats.com" - ], - "resources": [ - "3dstats.com", - "addfreestats.com" - ] - }, - "addGloo": { - "properties": [ - "addgloo.com" - ], - "resources": [ - "addgloo.com" - ] - }, - "AddThis": { - "properties": [ - "addthis.com" - ], - "resources": [ - "addthis.com", - "addthiscdn.com", - "addthisedge.com", - "clearspring.com", - "connectedads.net", - "xgraph.com", - "xgraph.net" - ] - }, - "Addvantage Media": { - "properties": [ - "addvantagemedia.com" - ], - "resources": [ - "addvantagemedia.com" - ] - }, - "Ad Dynamo": { - "properties": [ - "addynamo.com" - ], - "resources": [ - "addynamo.com", - "addynamo.net" - ] - }, - "Adelphic": { - "properties": [ - "adelphic.com" - ], - "resources": [ - "adelphic.com", - "ipredictive.com" - ] - }, - "AdEngage": { - "properties": [ - "adengage.com" - ], - "resources": [ - "adengage.com" - ] - }, - "AD Europe": { - "properties": [ - "adeurope.com" - ], - "resources": [ - "adeurope.com" - ] - }, - "AdExtent": { - "properties": [ - "adextent.com" - ], - "resources": [ - "adextent.com" - ] - }, - "AdF.ly": { - "properties": [ - "adf.ly" - ], - "resources": [ - "adf.ly" - ] - }, - "Adfonic": { - "properties": [ - "adfonic.com" - ], - "resources": [ - "adfonic.com" - ] - }, - "Adforge": { - "properties": [ - "adforgeinc.com" - ], - "resources": [ - "adforgeinc.com" - ] - }, - "Adform": { - "properties": [ - "adform.com" - ], - "resources": [ - "adform.com", - "adform.net", - "adformdsp.net" - ] - }, - "AdFox": { - "properties": [ - "adfox.ru" - ], - "resources": [ - "adfox.ru" - ] - }, - "AdFrontiers": { - "properties": [ - "adfrontiers.com" - ], - "resources": [ - "adfrontiers.com" - ] - }, - "Adfunky": { - "properties": [ - "adfunky.com", - "adfunkyserver.com" - ], - "resources": [ - "adfunky.com", - "adfunkyserver.com" - ] - }, - "Adfusion": { - "properties": [ - "adfusion.com" - ], - "resources": [ - "adfusion.com" - ] - }, - "AdGainerSolutions": { - "properties": [ - "adgainersolutions.com" - ], - "resources": [ - "adgainersolutions.com" - ] - }, - "AdGent Digital": { - "properties": [ - "adgentdigital.com" - ], - "resources": [ - "adgentdigital.com", - "shorttailmedia.com" - ] - }, - "AdGibbon": { - "properties": [ - "adgibbon.com" - ], - "resources": [ - "adgibbon.com" - ] - }, - "Adglare": { - "properties": [ - "adglare.com" - ], - "resources": [ - "adglare.com", - "adglare.net" - ] - }, - "adhood": { - "properties": [ - "adhood.com" - ], - "resources": [ - "adhood.com" - ] - }, - "Adiant": { - "properties": [ - "adblade.com", - "adiant.com" - ], - "resources": [ - "adblade.com", - "adiant.com" - ] - }, - "AdInsight": { - "properties": [ - "responsetap.com" - ], - "resources": [ - "adinsight.com", - "adinsight.eu", - "responsetap.com" - ] - }, - "AdIQuity": { - "properties": [ - "adiquity.com" - ], - "resources": [ - "adiquity.com" - ] - }, - "ADITION": { - "properties": [ - "adition.com" - ], - "resources": [ - "adition.com" - ] - }, - "AdJug": { - "properties": [ - "adjug.com" - ], - "resources": [ - "adjug.com" - ] - }, - "AdJuggler": { - "properties": [ - "adjuggler.com", - "adjuggler.net" - ], - "resources": [ - "adjuggler.com", - "adjuggler.net" - ] - }, - "Adjust": { - "properties": [ - "adjust.com" - ], - "resources": [ - "adjust.com" - ] - }, - "AdKeeper": { - "properties": [ - "keep.com" - ], - "resources": [ - "adkeeper.com", - "akncdn.com", - "keep.com" - ] - }, - "AdKernel": { - "properties": [ - "adkernel.com" - ], - "resources": [ - "adkernel.com" - ] - }, - "Ad Knife": { - "properties": [ - "adknife.com" - ], - "resources": [ - "adknife.com" - ] - }, - "Adknowledge": { - "properties": [ - "adknowledge.com", - "adparlor.com", - "bidsystem.com", - "cubics.com", - "lookery.com" - ], - "resources": [ - "adknowledge.com", - "adparlor.com", - "bidsystem.com", - "cubics.com", - "lookery.com" - ] - }, - "AdLantis": { - "properties": [ - "adimg.net", - "adlantis.jp", - "www.adlantis.jp" - ], - "resources": [ - "adimg.net", - "adlantis.jp", - "www.adlantis.jp" - ] - }, - "AdLeave": { - "properties": [ - "adleave.com" - ], - "resources": [ - "adleave.com" - ] - }, - "Adlibrium": { - "properties": [ - "adlibrium.com" - ], - "resources": [ - "adlibrium.com" - ] - }, - "Adloox": { - "properties": [ - "adloox.com" - ], - "resources": [ - "adloox.com", - "adlooxtracking.com" - ] - }, - "Adlucent": { - "properties": [ - "adlucent.com" - ], - "resources": [ - "adlucent.com" - ] - }, - "Ad Magnet": { - "properties": [ - "admagnet.com", - "admagnet.net" - ], - "resources": [ - "admagnet.com", - "admagnet.net" - ] - }, - "Admarketplace": { - "properties": [ - "admarketplace.com" - ], - "resources": [ - "admarketplace.com", - "admarketplace.net", - "ampxchange.com" - ] - }, - "AdMarvel": { - "properties": [ - "admarvel.com" - ], - "resources": [ - "admarvel.com" - ] - }, - "AdMatrix": { - "properties": [ - "admatrix.jp" - ], - "resources": [ - "admatrix.jp" - ] - }, - "AdMaven": { - "properties": [ - "ad-maven.com" - ], - "resources": [ - "ad-maven.com", - "agreensdistra.info", - "boudja.com", - "rensovetors.info", - "wrethicap.info" - ] - }, - "AdMaximizer Network": { - "properties": [ - "admaximizer.com" - ], - "resources": [ - "admaximizer.com" - ] - }, - "AdMedia": { - "properties": [ - "admedia.com" - ], - "resources": [ - "admedia.com" - ] - }, - "Admeta": { - "properties": [ - "admeta.com", - "atemda.com" - ], - "resources": [ - "admeta.com", - "atemda.com" - ] - }, - "Admicro": { - "properties": [ - "admicro.vn" - ], - "resources": [ - "admicro.vn", - "vcmedia.vn" - ] - }, - "Admixer": { - "properties": [ - "admixer.co.kr" - ], - "resources": [ - "admixer.co.kr" - ] - }, - "Admized": { - "properties": [ - "admized.com" - ], - "resources": [ - "admized.com" - ] - }, - "Admobile": { - "properties": [ - "admobile.com" - ], - "resources": [ - "admobile.com" - ] - }, - "Admotion": { - "properties": [ - "admotion.com" - ], - "resources": [ - "admotion.com", - "nspmotion.com" - ] - }, - "Adnetik": { - "properties": [ - "wtp101.com" - ], - "resources": [ - "adnetik.com", - "wtp101.com" - ] - }, - "AdNetwork.net": { - "properties": [ - "adnetwork.net" - ], - "resources": [ - "adnetwork.net" - ] - }, - "Adnium": { - "properties": [ - "adnium.com" - ], - "resources": [ - "adnium.com", - "montwam.top" - ] - }, - "adnologies": { - "properties": [ - "adnologies.com", - "heias.com" - ], - "resources": [ - "adnologies.com", - "heias.com" - ] - }, - "Adobe": { - "properties": [ - "adobe.com", - "livefyre.com", - "typekit.com" - ], - "resources": [ - "2o7.net", - "adobe.com", - "auditude.com", - "demdex.com", - "demdex.net", - "dmtracker.com", - "efrontier.com", - "everestads.net", - "everestjs.net", - "everesttech.net", - "fyre.co", - "hitbox.com", - "livefyre.com", - "omniture.com", - "omtrdc.net", - "touchclarity.com", - "typekit.com" - ] - }, - "AdOcean": { - "properties": [ - "adocean-global.com", - "adocean.pl" - ], - "resources": [ - "adocean-global.com", - "adocean.pl" - ] - }, - "Adometry": { - "properties": [ - "adometry.com" - ], - "resources": [ - "adometry.com", - "dmtry.com" - ] - }, - "Adomik": { - "properties": [ - "adomik.com" - ], - "resources": [ - "adomik.com" - ] - }, - "AdOnion": { - "properties": [ - "adonion.com" - ], - "resources": [ - "adonion.com" - ] - }, - "Adorika": { - "properties": [ - "clickotmedia.com" - ], - "resources": [ - "clickotmedia.com" - ] - }, - "Adotmob": { - "properties": [ - "adotmob.com" - ], - "resources": [ - "adotmob.com" - ] - }, - "ADP Dealer Services": { - "properties": [ - "cdkglobal.com" - ], - "resources": [ - "admission.net", - "adpdealerservices.com", - "cdkglobal.com", - "cobalt.com" - ] - }, - "ad pepper media": { - "properties": [ - "adpepper.com", - "adpepper.us" - ], - "resources": [ - "adpepper.com", - "adpepper.us" - ] - }, - "AdPerfect": { - "properties": [ - "adperfect.com" - ], - "resources": [ - "adperfect.com" - ] - }, - "Adperium": { - "properties": [ - "adperium.com" - ], - "resources": [ - "adperium.com" - ] - }, - "Adpersia": { - "properties": [ - "adpersia.com" - ], - "resources": [ - "adpersia.com" - ] - }, - "adPrecision": { - "properties": [ - "adprecision.net", - "adprs.net" - ], - "resources": [ - "adprecision.net", - "adprs.net", - "aprecision.net" - ] - }, - "AdPredictive": { - "properties": [ - "adpredictive.com" - ], - "resources": [ - "adpredictive.com" - ] - }, - "AdReactor": { - "properties": [ - "adreactor.com" - ], - "resources": [ - "adreactor.com" - ] - }, - "AdReady": { - "properties": [ - "digitalremedy.com" - ], - "resources": [ - "adready.com", - "adreadytractions.com", - "digitalremedy" - ] - }, - "AdRevolution": { - "properties": [ - "adrevolution.com" - ], - "resources": [ - "adrevolution.com" - ] - }, - "AdRiver": { - "properties": [ - "adriver.ru" - ], - "resources": [ - "adriver.ru" - ] - }, - "adrolays": { - "properties": [ - "contactimpact.de" - ], - "resources": [ - "adrolays.com", - "adrolays.de", - "contactimpact.de" - ] - }, - "AdRoll": { - "properties": [ - "adroll.com" - ], - "resources": [ - "adroll.com" - ] - }, - "adscale": { - "properties": [ - "stroeer.de" - ], - "resources": [ - "adscale.de", - "stroeer.de" - ] - }, - "Adscience": { - "properties": [ - "adscience.nl" - ], - "resources": [ - "adscience.nl" - ] - }, - "AdScore": { - "properties": [ - "adscoremarketing.com" - ], - "resources": [ - "adsco.re" - ] - }, - "AdServerPub": { - "properties": [ - "adserverpub.com" - ], - "resources": [ - "adserverpub.com" - ] - }, - "AdShuffle": { - "properties": [ - "adshuffle.com" - ], - "resources": [ - "adshuffle.com" - ] - }, - "AdSide": { - "properties": [ - "adside.com", - "doclix.com" - ], - "resources": [ - "adside.com", - "doclix.com" - ] - }, - "AdSpeed": { - "properties": [ - "adspeed.com", - "adspeed.net" - ], - "resources": [ - "adspeed.com", - "adspeed.net" - ] - }, - "Adsperity": { - "properties": [ - "adsperity.com" - ], - "resources": [ - "adsperity.com" - ] - }, - "AdSpirit": { - "properties": [ - "adspirit.com", - "adspirit.de", - "adspirit.net" - ], - "resources": [ - "adspirit.com", - "adspirit.de", - "adspirit.net" - ] - }, - "Adsrevenue.net": { - "properties": [ - "adsrevenue.net" - ], - "resources": [ - "adsrevenue.net" - ] - }, - "AdStir": { - "properties": [ - "ad-stir.com" - ], - "resources": [ - "ad-stir.com" - ] - }, - "AdsTours": { - "properties": [ - "adstours.com", - "clickintext.net" - ], - "resources": [ - "adstours.com", - "clickintext.net" - ] - }, - "Adsty": { - "properties": [ - "adsty.com", - "adx1.com" - ], - "resources": [ - "adsty.com", - "adx1.com" - ] - }, - "Adsupply": { - "properties": [ - "4dsply.com", - "adsupply.com" - ], - "resources": [ - "4dsply.com", - "adsupply.com" - ] - }, - "Adswizz": { - "properties": [ - "adswizz.com" - ], - "resources": [ - "adswizz.com" - ] - }, - "ADTECH": { - "properties": [ - "adtech.com", - "adtech.de", - "adtechus.com" - ], - "resources": [ - "adtech.com", - "adtech.de", - "adtechus.com" - ] - }, - "Adtegrity.com": { - "properties": [ - "adtegrity.com", - "adtegrity.net" - ], - "resources": [ - "adtegrity.com", - "adtegrity.net" - ] - }, - "ADTELLIGENCE": { - "properties": [ - "adtelligence.de" - ], - "resources": [ - "adtelligence.de" - ] - }, - "Adthink": { - "properties": [ - "adthink.com" - ], - "resources": [ - "adthink.com", - "audienceinsights.net" - ] - }, - "AdTiger": { - "properties": [ - "adtiger.de" - ], - "resources": [ - "adtiger.de" - ] - }, - "AdTruth": { - "properties": [ - "adtruth.com" - ], - "resources": [ - "adtruth.com" - ] - }, - "Adult AdWorld": { - "properties": [ - "adultadworld.com" - ], - "resources": [ - "adultadworld.com" - ] - }, - "Adultmoda": { - "properties": [ - "adultmoda.com" - ], - "resources": [ - "adultmoda.com" - ] - }, - "Adventive": { - "properties": [ - "adventive.com" - ], - "resources": [ - "adventive.com" - ] - }, - "Adventori": { - "properties": [ - "adventori.com" - ], - "resources": [ - "adventori.com" - ] - }, - "Adverline": { - "properties": [ - "adnext.fr", - "adverline.com" - ], - "resources": [ - "adnext.fr", - "adverline.com" - ] - }, - "Adversal.com": { - "properties": [ - "adv-adserver.com", - "adversal.com" - ], - "resources": [ - "adv-adserver.com", - "adversal.com" - ] - }, - "Adverticum": { - "properties": [ - "adsmart.com", - "adverticum.com", - "adverticum.net" - ], - "resources": [ - "adsmart.com", - "adverticum.com", - "adverticum.net" - ] - }, - "Advertise.com": { - "properties": [ - "advertise.com" - ], - "resources": [ - "advertise.com" - ] - }, - "AdvertiseSpace": { - "properties": [ - "advertisespace.com" - ], - "resources": [ - "advertisespace.com" - ] - }, - "Advert Stream": { - "properties": [ - "advertstream.com" - ], - "resources": [ - "advertstream.com" - ] - }, - "Advisor Media": { - "properties": [ - "advisormedia.cz" - ], - "resources": [ - "advisormedia.cz" - ] - }, - "Adworx": { - "properties": [ - "adworx.at", - "adworx.be", - "adworx.nl" - ], - "resources": [ - "adworx.at", - "adworx.be", - "adworx.nl" - ] - }, - "AdXpansion": { - "properties": [ - "adxpansion.com" - ], - "resources": [ - "adxpansion.com" - ] - }, - "Adxvalue": { - "properties": [ - "adxvalue.com", - "adxvalue.de" - ], - "resources": [ - "adxvalue.com", - "adxvalue.de" - ] - }, - "adyard": { - "properties": [ - "adyard.de" - ], - "resources": [ - "adyard.de" - ] - }, - "AdYield": { - "properties": [ - "adyield.com" - ], - "resources": [ - "adxyield.com", - "adyield.com" - ] - }, - "AdYouLike": { - "properties": [ - "adyoulike.com" - ], - "resources": [ - "adyoulike.com", - "omnitagjs.com", - "pulpix.com" - ] - }, - "ADZ": { - "properties": [ - "adzcentral.com" - ], - "resources": [ - "adzcentral.com" - ] - }, - "Adzerk": { - "properties": [ - "adzerk.com" - ], - "resources": [ - "adzerk.com", - "adzerk.net" - ] - }, - "adzly": { - "properties": [ - "adzly.com" - ], - "resources": [ - "adzly.com" - ] - }, - "Aegis Group": { - "properties": [ - "aemedia.com", - "bluestreak.com", - "dentsuaegisnetwork.com" - ], - "resources": [ - "aemedia.com", - "bluestreak.com", - "dentsuaegisnetwork.com" - ] - }, - "AERIFY MEDIA": { - "properties": [ - "aerifymedia.com", - "anonymous-media.com" - ], - "resources": [ - "aerifymedia.com", - "anonymous-media.com" - ] - }, - "Affectv": { - "properties": [ - "affectv.co.uk" - ], - "resources": [ - "affectv.co.uk" - ] - }, - "affilinet": { - "properties": [ - "affili.net", - "affilinet-inside.de" - ], - "resources": [ - "affili.net", - "affilinet-inside.de", - "banner-rotation.com", - "successfultogether.co.uk" - ] - }, - "Affine": { - "properties": [ - "affine.tv", - "affinesystems.com" - ], - "resources": [ - "affine.tv", - "affinesystems.com" - ] - }, - "Affinity": { - "properties": [ - "affinity.com" - ], - "resources": [ - "affinity.com" - ] - }, - "AfterDownload": { - "properties": [ - "afdads.com", - "afterdownload.com" - ], - "resources": [ - "afdads.com", - "afterdownload.com" - ] - }, - "AIData": { - "properties": [ - "advombat.ru", - "aidata.me" - ], - "resources": [ - "advombat.ru", - "aidata.me" - ] - }, - "Aim4Media": { - "properties": [ - "aim4media.com" - ], - "resources": [ - "aim4media.com" - ] - }, - "Airpush": { - "properties": [ - "airpush.com" - ], - "resources": [ - "airpush.com" - ] - }, - "AivaLabs": { - "properties": [ - "aivalabs.com" - ], - "resources": [ - "aivalabs.com" - ] - }, - "a.js": { - "properties": [ - "alflying.date", - "alflying.win", - "anybest.site", - "flightsy.bid", - "flightsy.win", - "flightzy.bid", - "flightzy.date", - "flightzy.win", - "zymerget.bid", - "zymerget.faith" - ], - "resources": [ - "alflying.date", - "alflying.win", - "anybest.site", - "flightsy.bid", - "flightsy.win", - "flightzy.bid", - "flightzy.date", - "flightzy.win", - "zymerget.bid", - "zymerget.faith" - ] - }, - "AK": { - "properties": [ - "aggregateknowledge.com", - "agkn.com" - ], - "resources": [ - "aggregateknowledge.com", - "agkn.com" - ] - }, - "Akamai": { - "properties": [ - "akamai.com" - ], - "resources": [ - "abmr.net", - "akamai.com", - "edgesuite.net", - "go-mpulse.net", - "imiclk.com" - ] - }, - "AKQA": { - "properties": [ - "akqa.com" - ], - "resources": [ - "akqa.com", - "srtk.net" - ] - }, - "Albacross": { - "properties": [ - "albacross.com" - ], - "resources": [ - "albacross.com" - ] - }, - "AllStarMediaGroup": { - "properties": [ - "allstarmediagroup.com" - ], - "resources": [ - "allstarmediagroup.com" - ] - }, - "Aloodo": { - "properties": [ - "aloodo.com" - ], - "resources": [ - "aloodo.com" - ] - }, - "AlterGeo": { - "properties": [ - "altergeo.ru" - ], - "resources": [ - "altergeo.ru" - ] - }, - "Amadesa": { - "properties": [ - "amadesa.com" - ], - "resources": [ - "amadesa.com" - ] - }, - "Amazing Counters": { - "properties": [ - "amazingcounters.com" - ], - "resources": [ - "amazingcounters.com" - ] - }, - "Amazon.com": { - "properties": [ - "6pm.com", - "abebooks.co.uk", - "abebooks.com", - "abebooks.de", - "abebooks.fr", - "abebooks.it", - "acx.com", - "alexa.com", - "amazon.ae", - "amazon.ca", - "amazon.cn", - "amazon.co.jp", - "amazon.co.uk", - "amazon.com", - "amazon.com.au", - "amazon.com.br", - "amazon.com.mx", - "amazon.com.sg", - "amazon.com.tr", - "amazon.de", - "amazon.es", - "amazon.fr", - "amazon.in", - "amazon.it", - "amazon.nl", - "amazon.sa", - "amazonaws.com", - "amazoninspire.com", - "assoc-amazon.com", - "audible.co.jp", - "audible.co.uk", - "audible.com", - "audible.de", - "audible.fr", - "audible.in", - "audible.it", - "bookdepository.com", - "boxofficemojo.com", - "brilliancepublishing.com", - "comixology.com", - "createspace.com", - "dpreview.com", - "dpreview.in", - "eastdane.com", - "fabric.com", - "goodreads.com", - "iberlibro.com", - "imdb.com", - "imdb.de", - "junglee.com", - "look.com", - "pillpack.com", - "shopbop.com", - "souq.com", - "twitch.com", - "twitch.tv", - "wholefoodsmarket.com", - "withoutabox.com", - "woot.com", - "yoyo.com", - "zappos.com", - "zvab.com" - ], - "resources": [ - "alexa.com", - "alexametrics.com", - "amazon-adsystem.com", - "amazon.ca", - "amazon.co.jp", - "amazon.co.uk", - "amazon.com", - "amazon.de", - "amazon.es", - "amazon.fr", - "amazon.it", - "amazonaws.com", - "assoc-amazon.com", - "cloudfront.net", - "ssl-images-amazon.com" - ] - }, - "Ambient Digital": { - "properties": [ - "adnetwork.vn", - "ambientdigital.com.vn" - ], - "resources": [ - "adnetwork.vn", - "ambientdigital.com.vn" - ] - }, - "Amobee": { - "properties": [ - "amobee.com", - "smartclip.com" - ], - "resources": [ - "adconion.com", - "amgdgt.com", - "amobee.com", - "euroclick.com", - "smartclip.com", - "turn.com" - ] - }, - "Amplitude": { - "properties": [ - "amplitude.com" - ], - "resources": [ - "amplitude.com" - ] - }, - "AndBeyond": { - "properties": [ - "andbeyond.media" - ], - "resources": [ - "andbeyond.media" - ] - }, - "anormal-media.de": { - "properties": [ - "anormal-media.de", - "primawebtools.de" - ], - "resources": [ - "anormal-media.de", - "anormal-tracker.de", - "primawebtools.de" - ] - }, - "Answers.com": { - "properties": [ - "answers.com", - "dsply.com" - ], - "resources": [ - "dsply.com" - ] - }, - "AOL": { - "properties": [ - "5min.com", - "adsonar.com", - "advertising.com", - "aim.com", - "aol.com", - "aolcdn.com", - "aoltechguru.com", - "atwola.com", - "autoblog.com", - "cambio.com", - "dailyfinance.com", - "editions.com", - "engadget.com", - "games.com", - "homesessive.com", - "huffingtonpost.com", - "leadback.com", - "makers.com", - "mandatory.com", - "mapquest.com", - "moviefone.com", - "noisecreep.com", - "patch.com", - "pawnation.com", - "shortcuts.com", - "shoutcast.com", - "spinner.com", - "stylelist.com", - "stylemepretty.com", - "surphace.com", - "tacoda.net", - "techcrunch.com", - "theboombox.com", - "theboot.com", - "userplane.com", - "winamp.com" - ], - "resources": [ - "5min.com", - "adsonar.com", - "adtechjp.com", - "advertising.com", - "aim.com", - "aol.com", - "aolcdn.com", - "aolcloud.net", - "atwola.com", - "editions.com", - "leadback.com", - "mapquest.com", - "patch.com", - "shortcuts.com", - "shoutcast.com", - "spinner.com", - "surphace.com", - "tacoda.net", - "userplane.com", - "vidible.tv", - "winamp.com" - ] - }, - "AppCast": { - "properties": [ - "appcast.io" - ], - "resources": [ - "appcast.io" - ] - }, - "Appenda": { - "properties": [ - "appenda.com" - ], - "resources": [ - "appenda.com" - ] - }, - "AppFlood": { - "properties": [ - "appflood.com" - ], - "resources": [ - "appflood.com" - ] - }, - "Appier": { - "properties": [ - "appier.com" - ], - "resources": [ - "appier.com" - ] - }, - "Applifier": { - "properties": [ - "applifier.com" - ], - "resources": [ - "applifier.com" - ] - }, - "Applovin": { - "properties": [ - "applovin.com" - ], - "resources": [ - "applovin.com" - ] - }, - "AppNexus": { - "properties": [ - "adlantic.nl", - "adnxs.com", - "adrdgt.com", - "appnexus.com" - ], - "resources": [ - "adlantic.nl", - "adnxs.com", - "adrdgt.com", - "appnexus.com" - ] - }, - "AppsFlyer": { - "properties": [ - "appsflyer.com" - ], - "resources": [ - "appsflyer.com" - ] - }, - "appssavvy": { - "properties": [ - "appssavvy.com" - ], - "resources": [ - "appssavvy.com" - ] - }, - "Arkwrights Homebrew": { - "properties": [ - "whiskyandwines.com" - ], - "resources": [ - "arkwrightshomebrew.com", - "ctasnet.com", - "whiskyandwines.com" - ] - }, - "AT Internet": { - "properties": [ - "atinternet.com", - "xiti.com" - ], - "resources": [ - "at-o.net", - "atinternet.com", - "hit-parade.com", - "xiti.com" - ] - }, - "ATN": { - "properties": [ - "affiliatetracking.com" - ], - "resources": [ - "affiliatetracking.com" - ] - }, - "Atoomic.com": { - "properties": [ - "atoomic.com" - ], - "resources": [ - "atoomic.com" - ] - }, - "Atrinsic": { - "properties": [ - "atrinsic.com" - ], - "resources": [ - "atrinsic.com" - ] - }, - "AT&T": { - "properties": [ - "att.com", - "yp.com" - ], - "resources": [ - "att.com", - "yp.com" - ] - }, - "Attracta": { - "properties": [ - "attracta.com" - ], - "resources": [ - "attracta.com" - ] - }, - "Audience2Media": { - "properties": [ - "audience2media.com" - ], - "resources": [ - "audience2media.com" - ] - }, - "Audience Ad Network": { - "properties": [ - "audienceadnetwork.com" - ], - "resources": [ - "audienceadnetwork.com" - ] - }, - "AudienceScience": { - "properties": [ - "audiencescience.com" - ], - "resources": [ - "audiencescience.com", - "revsci.net", - "targetingmarketplace.com", - "wunderloop.net" - ] - }, - "AuditedMedia": { - "properties": [ - "auditedmedia.com" - ], - "resources": [ - "aamapi.com", - "aamsitecertifier.com", - "auditedmedia.com" - ] - }, - "Augme": { - "properties": [ - "hipcricket.com" - ], - "resources": [ - "augme.com", - "hipcricket.com" - ] - }, - "Augur": { - "properties": [ - "augur.io" - ], - "resources": [ - "augur.io" - ] - }, - "AUTOCENTRE.UA": { - "properties": [ - "am.ua", - "autocentre.ua" - ], - "resources": [ - "am.ua", - "autocentre.ua" - ] - }, - "Automattic": { - "properties": [ - "automattic.com", - "gravatar.com", - "intensedebate.com", - "polldaddy.com" - ], - "resources": [ - "automattic.com", - "gravatar.com", - "intensedebate.com", - "polldaddy.com", - "pubmine.com" - ] - }, - "Avalanchers": { - "properties": [ - "avalanchers.com" - ], - "resources": [ - "avalanchers.com" - ] - }, - "AvantLink": { - "properties": [ - "avantlink.com", - "avantmetrics.com" - ], - "resources": [ - "avantlink.com", - "avmws.com" - ] - }, - "Avocet": { - "properties": [ - "avocet.io" - ], - "resources": [ - "avocet.io" - ] - }, - "Avsads": { - "properties": [ - "avsads.com" - ], - "resources": [ - "avsads.com" - ] - }, - "AWeber": { - "properties": [ - "aweber.com" - ], - "resources": [ - "aweber.com" - ] - }, - "Awin": { - "properties": [ - "awin.com" - ], - "resources": [ - "awin.com", - "digitalwindow.com", - "dwin1.com", - "perfiliate.com" - ] - }, - "Awio": { - "properties": [ - "awio.com", - "w3counter.com" - ], - "resources": [ - "awio.com", - "w3counter.com", - "w3roi.com" - ] - }, - "Azet": { - "properties": [ - "azet.sk", - "mediaimpact.sk" - ], - "resources": [ - "azet.sk", - "azetklik.sk", - "mediaimpact.sk", - "rsz.sk" - ] - }, - "BackBeat Media": { - "properties": [ - "backbeatmedia.com" - ], - "resources": [ - "backbeatmedia.com" - ] - }, - "Bannerconnect": { - "properties": [ - "bannerconnect.net" - ], - "resources": [ - "bannerconnect.net" - ] - }, - "Barilliance": { - "properties": [ - "barilliance.com" - ], - "resources": [ - "barilliance.com" - ] - }, - "BaronsNetworks": { - "properties": [ - "baronsoffers.com" - ], - "resources": [ - "baronsoffers.com" - ] - }, - "Batanga Network": { - "properties": [ - "batanga.com", - "corp.vix.com", - "vix.com" - ], - "resources": [ - "batanga.com", - "batanganetwork.com", - "vix.com" - ] - }, - "Baynote": { - "properties": [ - "baynote.com" - ], - "resources": [ - "baynote.com", - "baynote.net" - ] - }, - "Bazaarvoice": { - "properties": [ - "bazaarvoice.com" - ], - "resources": [ - "bazaarvoice.com" - ] - }, - "BeachFront": { - "properties": [ - "beachfront.com" - ], - "resources": [ - "beachfront.com" - ] - }, - "Beanstock Media": { - "properties": [ - "beanstockmedia.com" - ], - "resources": [ - "beanstockmedia.com" - ] - }, - "beencounter": { - "properties": [ - "beencounter.com" - ], - "resources": [ - "beencounter.com" - ] - }, - "Begun": { - "properties": [ - "begun.ru" - ], - "resources": [ - "begun.ru" - ] - }, - "belboon": { - "properties": [ - "belboon.com" - ], - "resources": [ - "adbutler.de", - "belboon.com" - ] - }, - "Belstat": { - "properties": [ - "belstat.be", - "belstat.com", - "belstat.de", - "belstat.fr", - "belstat.nl" - ], - "resources": [ - "belstat.be", - "belstat.com", - "belstat.de", - "belstat.fr", - "belstat.nl" - ] - }, - "Betgenius": { - "properties": [ - "betgenius.com", - "connextra.com" - ], - "resources": [ - "betgenius.com", - "connextra.com" - ] - }, - "BetssonPalantir": { - "properties": [ - "betssonpalantir.com" - ], - "resources": [ - "betssonpalantir.com" - ] - }, - "BetweenDigital": { - "properties": [ - "betweendigital.com" - ], - "resources": [ - "betweendigital.com" - ] - }, - "Bidfluence": { - "properties": [ - "bidfluence.com" - ], - "resources": [ - "bidfluence.com" - ] - }, - "Bidr": { - "properties": [ - "bidr.io" - ], - "resources": [ - "bidr.io" - ] - }, - "BidSwitch": { - "properties": [ - "bidswitch.com" - ], - "resources": [ - "bidswitch.net", - "mfadsrvr.com" - ] - }, - "Bidtellect": { - "properties": [ - "bidtellect.com", - "bttrack.com" - ], - "resources": [ - "bidtellect.com", - "bttrack.com" - ] - }, - "BidVertiser": { - "properties": [ - "bidvertiser.com" - ], - "resources": [ - "bidvertiser.com" - ] - }, - "BigClick": { - "properties": [ - "bigclick.me" - ], - "resources": [ - "bgclck.me", - "xcvgdf.party" - ] - }, - "BigDoor": { - "properties": [ - "bigdoor.com" - ], - "resources": [ - "bigdoor.com", - "onetruefan.com" - ] - }, - "bigmirnet": { - "properties": [ - "bigmir.net" - ], - "resources": [ - "bigmir.net" - ] - }, - "BinLayer": { - "properties": [ - "binlayer.com" - ], - "resources": [ - "binlayer.com" - ] - }, - "Bitcoin Plus": { - "properties": [ - "bitcoinplus.com" - ], - "resources": [ - "bitcoinplus.com" - ] - }, - "BitMedia": { - "properties": [ - "bitmedia.io" - ], - "resources": [ - "bitmedia.io" - ] - }, - "BittAds": { - "properties": [ - "bittads.com" - ], - "resources": [ - "bittads.com" - ] - }, - "Bizo": { - "properties": [ - "bizo.com", - "bizographics.com" - ], - "resources": [ - "bizo.com", - "bizographics.com" - ] - }, - "Black Label Ads": { - "properties": [ - "blacklabelads.com" - ], - "resources": [ - "blacklabelads.com" - ] - }, - "BlogCatalog": { - "properties": [ - "blogcatalog.com" - ], - "resources": [ - "blogcatalog.com" - ] - }, - "BlogCounter.com": { - "properties": [ - "blogcounter.de" - ], - "resources": [ - "blogcounter.de" - ] - }, - "BlogFrog": { - "properties": [ - "theblogfrog.com" - ], - "resources": [ - "theblogfrog.com" - ] - }, - "BlogHer": { - "properties": [ - "blogher.com", - "blogherads.com" - ], - "resources": [ - "blogher.com", - "blogherads.com" - ] - }, - "BlogRollr": { - "properties": [ - "blogrollr.com" - ], - "resources": [ - "blogrollr.com" - ] - }, - "BLOOM Digital Platforms": { - "properties": [ - "adgear.com", - "bloom-hq.com" - ], - "resources": [ - "adgear.com", - "adgrx.com", - "bloom-hq.com" - ] - }, - "BloomReach": { - "properties": [ - "bloomreach.com", - "brcdn.com" - ], - "resources": [ - "bloomreach.com", - "brcdn.com", - "brsrvr.com" - ] - }, - "BlueCava": { - "properties": [ - "bluecava.com" - ], - "resources": [ - "bluecava.com" - ] - }, - "BlueKai": { - "properties": [ - "bluekai.com", - "tracksimple.com" - ], - "resources": [ - "bkrtx.com", - "bluekai.com", - "tracksimple.com" - ] - }, - "Bluemetrix": { - "properties": [ - "bluemetrix.com", - "bmmetrix.com" - ], - "resources": [ - "bluemetrix.com", - "bmmetrix.com" - ] - }, - "Blu Trumpet": { - "properties": [ - "blutrumpet.com" - ], - "resources": [ - "blutrumpet.com" - ] - }, - "Bombora": { - "properties": [ - "bombora.com" - ], - "resources": [ - "ml314.com" - ] - }, - "Boo-Box": { - "properties": [ - "boo-box.com" - ], - "resources": [ - "boo-box.com" - ] - }, - "BoostBox": { - "properties": [ - "boostbox.com.br" - ], - "resources": [ - "boostbox.com.br" - ] - }, - "Bouncex": { - "properties": [ - "bouncex.com" - ], - "resources": [ - "bounceexchange.com", - "bouncex.com", - "bouncex.net" - ] - }, - "Brainient": { - "properties": [ - "brainient.com" - ], - "resources": [ - "brainient.com" - ] - }, - "Branch": { - "properties": [ - "branch.io" - ], - "resources": [ - "branch.io" - ] - }, - "Brand Affinity Technologies": { - "properties": [ - "brandaffinity.net" - ], - "resources": [ - "brandaffinity.net" - ] - }, - "Brandcrumb": { - "properties": [ - "brandcrumb.com" - ], - "resources": [ - "brandcrumb.com" - ] - }, - "Brand.net": { - "properties": [ - "brand.net" - ], - "resources": [ - "brand.net" - ] - }, - "Brandscreen": { - "properties": [ - "brandscreen.com", - "rtbidder.net" - ], - "resources": [ - "brandscreen.com", - "rtbidder.net" - ] - }, - "Branica": { - "properties": [ - "branica.com" - ], - "resources": [ - "branica.com" - ] - }, - "BreakTime": { - "properties": [ - "breaktime.com.tw" - ], - "resources": [ - "breaktime.com.tw" - ] - }, - "Brightcove": { - "properties": [ - "brightcove.com" - ], - "resources": [ - "brightcove.com" - ] - }, - "BrightEdge": { - "properties": [ - "brightedge.com" - ], - "resources": [ - "b0e8.com", - "brightedge.com" - ] - }, - "BrightRoll": { - "properties": [ - "brightroll.com" - ], - "resources": [ - "brightroll.com", - "btrll.com" - ] - }, - "BrightTag": { - "properties": [ - "brighttag.com", - "btstatic.com", - "thebrighttag.com" - ], - "resources": [ - "brighttag.com", - "btstatic.com", - "thebrighttag.com" - ] - }, - "Brilig": { - "properties": [ - "brilig.com" - ], - "resources": [ - "brilig.com" - ] - }, - "Browser-Update.org": { - "properties": [ - "browser-update.org" - ], - "resources": [ - "browser-update.org" - ] - }, - "BTBuckets": { - "properties": [ - "btbuckets.com" - ], - "resources": [ - "btbuckets.com" - ] - }, - "Bubblestat": { - "properties": [ - "bubblestat.com" - ], - "resources": [ - "bubblestat.com" - ] - }, - "BuckSense": { - "properties": [ - "bucksense.com" - ], - "resources": [ - "bucksense.com" - ] - }, - "Buffer": { - "properties": [ - "bufferapp.com" - ], - "resources": [ - "bufferapp.com" - ] - }, - "Bunchball": { - "properties": [ - "bunchball.com" - ], - "resources": [ - "bunchball.com" - ] - }, - "Burstly": { - "properties": [ - "burstly.com" - ], - "resources": [ - "burstly.com" - ] - }, - "Burst Media": { - "properties": [ - "burstbeacon.com", - "burstdirectads.com", - "burstmedia.com", - "burstnet.com", - "giantrealm.com" - ], - "resources": [ - "burstbeacon.com", - "burstdirectads.com", - "burstmedia.com", - "burstnet.com", - "giantrealm.com" - ] - }, - "BusinessOnline": { - "properties": [ - "businessol.com" - ], - "resources": [ - "businessol.com" - ] - }, - "Button": { - "properties": [ - "usebutton.com" - ], - "resources": [ - "usebutton.com" - ] - }, - "buySAFE": { - "properties": [ - "buysafe.com" - ], - "resources": [ - "buysafe.com" - ] - }, - "BuySellAds": { - "properties": [ - "beaconads.com", - "buysellads.com" - ], - "resources": [ - "beaconads.com", - "buysellads.com" - ] - }, - "Buysight": { - "properties": [ - "buysight.com", - "permuto.com", - "pulsemgr.com" - ], - "resources": [ - "buysight.com", - "permuto.com", - "pulsemgr.com" - ] - }, - "BuzzFeed": { - "properties": [ - "buzzfeed.com" - ], - "resources": [ - "buzzfed.com", - "buzzfeed.com" - ] - }, - "BuzzParadise": { - "properties": [ - "buzzparadise.com" - ], - "resources": [ - "buzzparadise.com" - ] - }, - "BV! MEDIA": { - "properties": [ - "branchez-vous.com", - "bvmedia.ca" - ], - "resources": [ - "branchez-vous.com", - "bvmedia.ca", - "networldmedia.com", - "networldmedia.net" - ] - }, - "c1exchange": { - "properties": [ - "c1exchange.com" - ], - "resources": [ - "c1exchange.com" - ] - }, - "C3 Metrics": { - "properties": [ - "attributionmodel.com", - "c3metrics.com", - "c3tag.com" - ], - "resources": [ - "attributionmodel.com", - "c3metrics.com", - "c3tag.com" - ] - }, - "Cadreon": { - "properties": [ - "cadreon.com" - ], - "resources": [ - "cadreon.com" - ] - }, - "CallSource": { - "properties": [ - "callsource.com" - ], - "resources": [ - "leadtrackingdata.com" - ] - }, - "CampaignGrid": { - "properties": [ - "campaigngrid.com" - ], - "resources": [ - "campaigngrid.com" - ] - }, - "CAPITALDATA": { - "properties": [ - "capitaldata.fr" - ], - "resources": [ - "capitaldata.fr" - ] - }, - "Carambola": { - "properties": [ - "carambola.com" - ], - "resources": [ - "carambo.la" - ] - }, - "Caraytech": { - "properties": [ - "caraytech.com.ar", - "e-planning.net", - "www.caraytech.com.ar" - ], - "resources": [ - "caraytech.com.ar", - "e-planning.net", - "www.caraytech.com.ar" - ] - }, - "Cardlytics": { - "properties": [ - "cardlytics.com" - ], - "resources": [ - "cardlytics.com" - ] - }, - "Cart.ro": { - "properties": [ - "cart.ro" - ], - "resources": [ - "cart.ro", - "statistics.ro" - ] - }, - "CartsGuru": { - "properties": [ - "carts.guru" - ], - "resources": [ - "carts.guru" - ] - }, - "Casale Media": { - "properties": [ - "casalemedia.com", - "medianet.com" - ], - "resources": [ - "casalemedia.com", - "medianet.com" - ] - }, - "CashBeet": { - "properties": [ - "cashbeet.com" - ], - "resources": [ - "cashbeet.com", - "serv1swork.com" - ] - }, - "Causes": { - "properties": [ - "causes.com" - ], - "resources": [ - "causes.com" - ] - }, - "Cbox": { - "properties": [ - "cbox.ws" - ], - "resources": [ - "cbox.ws" - ] - }, - "CBproADS": { - "properties": [ - "cbproads.com" - ], - "resources": [ - "cbproads.com" - ] - }, - "CBS Interactive": { - "properties": [ - "cbsinteractive.com", - "com.com" - ], - "resources": [ - "cbsinteractive.com", - "com.com" - ] - }, - "Cedato": { - "properties": [ - "cedato.com" - ], - "resources": [ - "cedato.com" - ] - }, - "Cedexis": { - "properties": [ - "cedexis.com" - ], - "resources": [ - "cedexis.com", - "cedexis.net" - ] - }, - "Certona": { - "properties": [ - "certona.com", - "res-x.com" - ], - "resources": [ - "certona.com", - "res-x.com" - ] - }, - "Chango": { - "properties": [ - "chango.ca", - "chango.com" - ], - "resources": [ - "chango.ca", - "chango.com" - ] - }, - "ChannelAdvisor": { - "properties": [ - "channeladvisor.com", - "searchmarketing.com" - ], - "resources": [ - "channeladvisor.com", - "searchmarketing.com" - ] - }, - "Channel Intelligence": { - "properties": [ - "channelintelligence.com" - ], - "resources": [ - "channelintelligence.com" - ] - }, - "Chartbeat": { - "properties": [ - "chartbeat.com", - "chartbeat.net" - ], - "resources": [ - "chartbeat.com", - "chartbeat.net" - ] - }, - "Chartboost": { - "properties": [ - "chartboost.com" - ], - "resources": [ - "chartboost.com" - ] - }, - "CheckM8": { - "properties": [ - "checkm8.com" - ], - "resources": [ - "checkm8.com" - ] - }, - "Chitika": { - "properties": [ - "chitika.com" - ], - "resources": [ - "chitika.com", - "chitika.net" - ] - }, - "ChoiceStream": { - "properties": [ - "choicestream.com" - ], - "resources": [ - "choicestream.com" - ] - }, - "ClearLink": { - "properties": [ - "clearlink.com" - ], - "resources": [ - "clearlink.com" - ] - }, - "ClearSaleing": { - "properties": [ - "clearsaleing.com" - ], - "resources": [ - "clearsaleing.com", - "csdata1.com", - "csdata2.com", - "csdata3.com" - ] - }, - "Clearsearch Media": { - "properties": [ - "pathinteractive.com" - ], - "resources": [ - "clearsearchmedia.com", - "csm-secure.com", - "pathinteractive.com" - ] - }, - "ClearSight Interactive": { - "properties": [ - "clearsightinteractive.com", - "csi-tracking.com" - ], - "resources": [ - "clearsightinteractive.com", - "csi-tracking.com" - ] - }, - "ClickAider": { - "properties": [ - "clickaider.com" - ], - "resources": [ - "clickaider.com" - ] - }, - "Clickayab": { - "properties": [ - "clickyab.com" - ], - "resources": [ - "clickyab.com" - ] - }, - "Clickbooth": { - "properties": [ - "clickbooth.com" - ], - "resources": [ - "adtoll.com", - "clickbooth.com" - ] - }, - "Clickdensity": { - "properties": [ - "clickdensity.com" - ], - "resources": [ - "clickdensity.com" - ] - }, - "ClickDimensions": { - "properties": [ - "clickdimensions.com" - ], - "resources": [ - "clickdimensions.com" - ] - }, - "ClickDistrict": { - "properties": [ - "clickdistrict.com", - "creative-serving.com" - ], - "resources": [ - "clickdistrict.com", - "creative-serving.com" - ] - }, - "ClickFrog": { - "properties": [ - "clickfrog.ru" - ], - "resources": [ - "bashirian.biz", - "buckridge.link", - "clickfrog.ru", - "franecki.net", - "quitzon.net", - "reichelcormier.bid", - "wisokykulas.bid" - ] - }, - "ClickFuel": { - "properties": [ - "clickfuel.com", - "myconversionlab.com" - ], - "resources": [ - "clickfuel.com", - "conversiondashboard.com", - "myconversionlab.com" - ] - }, - "ClickGuard": { - "properties": [ - "clickguard.com" - ], - "resources": [ - "clickguard.com" - ] - }, - "ClickInc": { - "properties": [ - "clickinc.com" - ], - "resources": [ - "clickinc.com" - ] - }, - "Clicksor": { - "properties": [ - "clicksor.com", - "clicksor.net" - ], - "resources": [ - "clicksor.com", - "clicksor.net" - ] - }, - "ClickTale": { - "properties": [ - "clicktale.com" - ], - "resources": [ - "clicktale.com", - "clicktale.net", - "pantherssl.com" - ] - }, - "Clickwinks": { - "properties": [ - "clickwinks.com" - ], - "resources": [ - "clickwinks.com" - ] - }, - "ClicManager": { - "properties": [ - "clicmanager.fr" - ], - "resources": [ - "clicmanager.fr" - ] - }, - "ClipSyndicate": { - "properties": [ - "clipsyndicate.com" - ], - "resources": [ - "clipsyndicate.com" - ] - }, - "ClixMetrix": { - "properties": [ - "clixmetrix.com" - ], - "resources": [ - "clixmetrix.com" - ] - }, - "Clixpy": { - "properties": [ - "clixpy.com" - ], - "resources": [ - "clixpy.com" - ] - }, - "Clixtell": { - "properties": [ - "clixtell.com" - ], - "resources": [ - "clixtell.com" - ] - }, - "Clove Network": { - "properties": [ - "clovenetwork.com" - ], - "resources": [ - "clovenetwork.com" - ] - }, - "ClustrMaps": { - "properties": [ - "clustrmaps.com" - ], - "resources": [ - "clustrmaps.com" - ] - }, - "CNZZ": { - "properties": [ - "cnzz.com" - ], - "resources": [ - "cnzz.com" - ] - }, - "Cognitive Match": { - "properties": [ - "cmads.com.tw", - "cmadsasia.com", - "cmadseu.com", - "cmmeglobal.com", - "cognitivematch.com" - ], - "resources": [ - "cmads.com.tw", - "cmadsasia.com", - "cmadseu.com", - "cmmeglobal.com", - "cognitivematch.com" - ] - }, - "CoinHive": { - "properties": [ - "authedmine.com", - "coinhive.com" - ], - "resources": [ - "ad-miner.com", - "authedmine.com", - "bmst.pw", - "cnhv.co", - "coin-hive.com", - "coinhive.com", - "wsservices.org" - ] - }, - "CoinPot": { - "properties": [ - "coinpot.co" - ], - "resources": [ - "coinpot.co" - ] - }, - "Collarity": { - "properties": [ - "collarity.com" - ], - "resources": [ - "collarity.com" - ] - }, - "Collective": { - "properties": [ - "collective.com" - ], - "resources": [ - "collective-media.net", - "collective.com", - "oggifinogi.com", - "tumri.com", - "tumri.net", - "yt1187.net" - ] - }, - "Commission Junction": { - "properties": [ - "cj.com" - ], - "resources": [ - "apmebf.com", - "awltovhc.com", - "cj.com", - "ftjcfx.com", - "kcdwa.com", - "qksz.com", - "qksz.net", - "tqlkg.com", - "yceml.net" - ] - }, - "Communicator Corp": { - "properties": [ - "communicatorcorp.com" - ], - "resources": [ - "communicatorcorp.com" - ] - }, - "Compass Labs": { - "properties": [ - "compasslabs.com" - ], - "resources": [ - "compasslabs.com" - ] - }, - "Complex Media": { - "properties": [ - "collider.com", - "complex.com", - "complexmedianetwork.com", - "firstwefeast.com", - "pigeonsandplanes.com", - "solecollector.com", - "theridechannel.com" - ], - "resources": [ - "complex.com", - "complexmedianetwork.com" - ] - }, - "Compuware": { - "properties": [ - "axf8.net", - "compuware.com", - "dynatrace.com" - ], - "resources": [ - "axf8.net", - "compuware.com", - "dynatrace.com", - "gomez.com" - ] - }, - "comScore": { - "properties": [ - "adxpose.com", - "comscore.com", - "scorecardresearch.com", - "sitestat.com", - "voicefive.com" - ], - "resources": [ - "adxpose.com", - "certifica.com", - "comscore.com", - "mdotlabs.com", - "proxilinks.com", - "proximic.com", - "proximic.net", - "scorecardresearch.com", - "sitestat.com", - "voicefive.com" - ] - }, - "Conduit": { - "properties": [ - "conduit-banners.com", - "conduit.com" - ], - "resources": [ - "conduit-banners.com", - "conduit-services.com", - "conduit.com", - "wibiya.com" - ] - }, - "Congoo": { - "properties": [ - "congoo.com" - ], - "resources": [ - "congoo.com" - ] - }, - "Connatix.com": { - "properties": [ - "connatix.com" - ], - "resources": [ - "connatix.com" - ] - }, - "Connexity": { - "properties": [ - "connexity.com", - "pricegrabber.com" - ], - "resources": [ - "connexity.com", - "connexity.net", - "pricegrabber.com" - ] - }, - "Consilium Media": { - "properties": [ - "consiliummedia.com" - ], - "resources": [ - "consiliummedia.com" - ] - }, - "Consumable": { - "properties": [ - "consumable.com" - ], - "resources": [ - "consumable.com" - ] - }, - "Contact At Once!": { - "properties": [ - "contactatonce.com" - ], - "resources": [ - "contactatonce.com" - ] - }, - "CONTAXE": { - "properties": [ - "contaxe.com" - ], - "resources": [ - "contaxe.com" - ] - }, - "ContentABC": { - "properties": [ - "contentabc.com" - ], - "resources": [ - "contentabc.com" - ] - }, - "CONTEXTin": { - "properties": [ - "admailtiser.com", - "contextin.com" - ], - "resources": [ - "admailtiser.com", - "contextin.com" - ] - }, - "ContextuAds": { - "properties": [ - "agencytradingdesk.net", - "contextuads.com" - ], - "resources": [ - "agencytradingdesk.net", - "contextuads.com" - ] - }, - "CONTEXTWEB": { - "properties": [ - "contextweb.com" - ], - "resources": [ - "contextweb.com" - ] - }, - "ConvergeDirect": { - "properties": [ - "convergedirect.com", - "convergetrack.com" - ], - "resources": [ - "convergedirect.com", - "convergetrack.com" - ] - }, - "ConversantMedia": { - "properties": [ - "conversantmedia.com" - ], - "resources": [ - "adserver.com", - "conversantmedia.com", - "dotomi.com", - "dtmpub.com", - "emjcd.com", - "fastclick.com", - "fastclick.net", - "greystripe.com", - "lduhtrp.net", - "mediaplex.com", - "valueclick.com", - "valueclick.net", - "valueclickmedia.com" - ] - }, - "ConversionRuler": { - "properties": [ - "conversionruler.com" - ], - "resources": [ - "conversionruler.com" - ] - }, - "Conversive": { - "properties": [ - "conversive.nl" - ], - "resources": [ - "conversive.nl" - ] - }, - "Convert Insights": { - "properties": [ - "convert.com", - "reedge.com" - ], - "resources": [ - "convert.com", - "reedge.com" - ] - }, - "Convertro": { - "properties": [ - "convertro.com" - ], - "resources": [ - "convertro.com" - ] - }, - "Conviva": { - "properties": [ - "conviva.com" - ], - "resources": [ - "conviva.com" - ] - }, - "CoreMotives": { - "properties": [ - "coremotives.com" - ], - "resources": [ - "coremotives.com" - ] - }, - "Cox Digital Solutions": { - "properties": [ - "adify.com", - "coxdigitalsolutions.com", - "novomotus.com" - ], - "resources": [ - "adify.com", - "afy11.net", - "coxdigitalsolutions.com", - "novomotus.com" - ] - }, - "CPMStar": { - "properties": [ - "cpmstar.com" - ], - "resources": [ - "cpmstar.com" - ] - }, - "CPX Interactive": { - "properties": [ - "cpxadroit.com" - ], - "resources": [ - "adreadypixels.com", - "cpxadroit.com", - "cpxinteractive.com" - ] - }, - "Crazy Egg": { - "properties": [ - "cetrk.com", - "crazyegg.com" - ], - "resources": [ - "cetrk.com", - "crazyegg.com" - ] - }, - "Creafi": { - "properties": [ - "creafi.com" - ], - "resources": [ - "creafi.com" - ] - }, - "Crimtan": { - "properties": [ - "crimtan.com" - ], - "resources": [ - "crimtan.com" - ] - }, - "Crisp Media": { - "properties": [ - "crispmedia.com" - ], - "resources": [ - "crispmedia.com" - ] - }, - "Criteo": { - "properties": [ - "criteo.com", - "criteo.net" - ], - "resources": [ - "criteo.com", - "criteo.net", - "hlserve.com", - "hooklogic.com", - "storetail.io" - ] - }, - "Cross Pixel": { - "properties": [ - "crosspixel.net" - ], - "resources": [ - "crosspixel.net", - "crosspixelmedia.com", - "crsspxl.com" - ] - }, - "Crowd Science": { - "properties": [ - "crowdscience.com" - ], - "resources": [ - "crowdscience.com" - ] - }, - "CryptoLoot": { - "properties": [ - "crypto-loot.com" - ], - "resources": [ - "cryptaloot.pro", - "crypto-loot.com", - "cryptolootminer.com", - "flashx.pw", - "gitgrub.pro", - "reauthenticator.com", - "statdynamic.com", - "webmine.pro" - ] - }, - "CryptoWebMiner": { - "properties": [ - "crypto-webminer.com" - ], - "resources": [ - "bitcoin-pay.eu", - "crypto-webminer.com", - "ethpocket.de", - "ethtrader.de" - ] - }, - "cXense": { - "properties": [ - "cxense.com" - ], - "resources": [ - "cxense.com", - "emediate.biz", - "emediate.com", - "emediate.dk", - "emediate.eu" - ] - }, - "Cya2": { - "properties": [ - "cya2.net" - ], - "resources": [ - "cya2.net" - ] - }, - "Cyberplex": { - "properties": [ - "cyberplex.com" - ], - "resources": [ - "cyberplex.com" - ] - }, - "Dada": { - "properties": [ - "dada.eu", - "dada.pro", - "simply.com" - ], - "resources": [ - "dada.eu", - "dada.pro", - "simply.com" - ] - }, - "DailyMe": { - "properties": [ - "dailyme.com", - "newstogram.com" - ], - "resources": [ - "dailyme.com", - "newstogram.com" - ] - }, - "Dataium": { - "properties": [ - "collserve.com", - "ihs.com" - ], - "resources": [ - "collserve.com", - "dataium.com", - "ihs.com" - ] - }, - "Datalogix": { - "properties": [ - "datalogix.com", - "nexac.com" - ], - "resources": [ - "datalogix.com", - "nexac.com", - "nextaction.net" - ] - }, - "DataSift": { - "properties": [ - "datasift.com", - "tweetmeme.com" - ], - "resources": [ - "datasift.com", - "tweetmeme.com" - ] - }, - "DataXu": { - "properties": [ - "dataxu.com", - "mexad.com", - "w55c.net" - ], - "resources": [ - "dataxu.com", - "dataxu.net", - "mexad.com", - "w55c.net" - ] - }, - "Datonics": { - "properties": [ - "datonics.com" - ], - "resources": [ - "datonics.com", - "pro-market.net" - ] - }, - "Datran Media": { - "properties": [ - "datranmedia.com", - "displaymarketplace.com" - ], - "resources": [ - "datranmedia.com", - "displaymarketplace.com" - ] - }, - "Datvantage": { - "properties": [ - "datvantage.com" - ], - "resources": [ - "datvantage.com" - ] - }, - "DC Storm": { - "properties": [ - "dc-storm.com", - "stormiq.com" - ], - "resources": [ - "dc-storm.com", - "stormiq.com" - ] - }, - "Dedicated Media": { - "properties": [ - "dedicatedmedia.com", - "dedicatednetworks.com" - ], - "resources": [ - "dedicatedmedia.com", - "dedicatednetworks.com" - ] - }, - "Deep Intent": { - "properties": [ - "deepintent.com" - ], - "resources": [ - "deepintent.com" - ] - }, - "Delivr": { - "properties": [ - "delivr.com" - ], - "resources": [ - "delivr.com", - "percentmobile.com" - ] - }, - "Delta Projects": { - "properties": [ - "deltaprojects.com" - ], - "resources": [ - "adaction.se", - "de17a.com", - "deltaprojects.com", - "deltaprojects.se" - ] - }, - "Demandbase": { - "properties": [ - "demandbase.com" - ], - "resources": [ - "company-target.com", - "demandbase.com" - ] - }, - "Demand Media": { - "properties": [ - "leafgroup.com" - ], - "resources": [ - "demandmedia.com", - "indieclick.com" - ] - }, - "Deutsche Post DHL": { - "properties": [ - "dpdhl.com" - ], - "resources": [ - "adcloud.com", - "adcloud.net", - "dp-dhl.com", - "dpdhl.com" - ] - }, - "Developer Media": { - "properties": [ - "developermedia.com" - ], - "resources": [ - "developermedia.com", - "lqcdn.com" - ] - }, - "DG": { - "properties": [ - "dgit.com", - "sizmek.com" - ], - "resources": [ - "dgit.com", - "eyeblaster.com", - "eyewonder.com", - "mdadx.com", - "serving-sys.com", - "unicast.com" - ] - }, - "dianomi": { - "properties": [ - "dianomi.com" - ], - "resources": [ - "dianomi.com" - ] - }, - "Didit": { - "properties": [ - "didit.com" - ], - "resources": [ - "did-it.com", - "didit.com" - ] - }, - "Digg": { - "properties": [ - "digg.com" - ], - "resources": [ - "digg.com" - ] - }, - "DigitalAdConsortium": { - "properties": [ - "dac.co.jp" - ], - "resources": [ - "impact-ad.jp" - ] - }, - "Digital River": { - "properties": [ - "digitalriver.com", - "keywordmax.com", - "netflame.cc" - ], - "resources": [ - "digitalriver.com", - "keywordmax.com", - "netflame.cc" - ] - }, - "Digital Target": { - "properties": [ - "digitaltarget.ru" - ], - "resources": [ - "digitaltarget.ru" - ] - }, - "Digitize": { - "properties": [ - "digitize.ie" - ], - "resources": [ - "digitize.ie" - ] - }, - "DirectAdvert": { - "properties": [ - "directadvert.ru" - ], - "resources": [ - "directadvert.ru" - ] - }, - "DirectCORP": { - "properties": [ - "directcorp.de", - "ipcounter.de" - ], - "resources": [ - "directcorp.de", - "ipcounter.de" - ] - }, - "Direct Response Group": { - "properties": [ - "directresponsegroup.com" - ], - "resources": [ - "directresponsegroup.com", - "ppctracking.net" - ] - }, - "Directtrack": { - "properties": [ - "directtrack.com" - ], - "resources": [ - "directtrack.com" - ] - }, - "Disqus": { - "properties": [ - "disqus.com", - "disqusads.com" - ], - "resources": [ - "disqus.com", - "disqusads.com" - ] - }, - "DistilNetworks": { - "properties": [ - "distilnetworks.com" - ], - "resources": [ - "distilnetworks.com", - "distiltag.com" - ] - }, - "DistrictM": { - "properties": [ - "districtm.net" - ], - "resources": [ - "districtm.io" - ] - }, - "dmpxs": { - "properties": [ - "dmpxs.com" - ], - "resources": [ - "dmpxs.com" - ] - }, - "DoublePimp": { - "properties": [ - "doublepimp.com" - ], - "resources": [ - "doublepimp.com" - ] - }, - "DoublePositive": { - "properties": [ - "doublepositive.com" - ], - "resources": [ - "bid-tag.com", - "doublepositive.com" - ] - }, - "DoubleVerify": { - "properties": [ - "doubleverify.com" - ], - "resources": [ - "doubleverify.com" - ] - }, - "Drawbridge": { - "properties": [ - "drawbridge.com" - ], - "resources": [ - "adsymptotic.com", - "drawbrid.ge", - "drawbridge.com" - ] - }, - "DS-IQ": { - "properties": [ - "ds-iq.com" - ], - "resources": [ - "ds-iq.com" - ] - }, - "DSNR Group": { - "properties": [ - "dsnrgroup.com", - "dsnrmg.com", - "traffiliate.com", - "z5x.net" - ], - "resources": [ - "dsnrgroup.com", - "dsnrmg.com", - "traffiliate.com", - "z5x.com", - "z5x.net" - ] - }, - "dwstat.com": { - "properties": [ - "dwstat.cn" - ], - "resources": [ - "dwstat.cn" - ] - }, - "DynAdmic": { - "properties": [ - "dynadmic.com" - ], - "resources": [ - "dynadmic.com", - "dyntrk.com" - ] - }, - "DynamicOxygen": { - "properties": [ - "dynamicoxygen.com", - "exitjunction.com" - ], - "resources": [ - "dynamicoxygen.com", - "exitjunction.com" - ] - }, - "DynamicYield": { - "properties": [ - "dynamicyield.com" - ], - "resources": [ - "dynamicyield.com" - ] - }, - "Earnify": { - "properties": [ - "earnify.com" - ], - "resources": [ - "earnify.com" - ] - }, - "eBay": { - "properties": [ - "ebay.at", - "ebay.ba", - "ebay.be", - "ebay.ca", - "ebay.ch", - "ebay.cn", - "ebay.co.jp", - "ebay.co.kr", - "ebay.co.uk", - "ebay.com", - "ebay.com.au", - "ebay.com.hk", - "ebay.com.my", - "ebay.com.ph", - "ebay.com.sg", - "ebay.com.tw", - "ebay.de", - "ebay.es", - "ebay.fr", - "ebay.ie", - "ebay.in", - "ebay.it", - "ebay.nl", - "ebay.pl" - ], - "resources": [ - "ebay.com" - ] - }, - "Echo": { - "properties": [ - "aboutecho.com", - "haloscan.com", - "js-kit.com" - ], - "resources": [ - "aboutecho.com", - "haloscan.com", - "js-kit.com" - ] - }, - "ECSAnalytics": { - "properties": [ - "ecsanalytics.com", - "theecsinc.com" - ], - "resources": [ - "ecsanalytics.com" - ] - }, - "EFF": { - "properties": [ - "do-not-tracker.org", - "eff.org", - "eviltracker.net", - "trackersimulator.org" - ], - "resources": [ - "do-not-tracker.org", - "eff.org", - "eviltracker.net", - "trackersimulator.org" - ] - }, - "Effective Measure": { - "properties": [ - "effectivemeasure.com", - "effectivemeasure.net" - ], - "resources": [ - "effectivemeasure.com", - "effectivemeasure.net" - ] - }, - "ekolay": { - "properties": [ - "hurriyet.com.tr" - ], - "resources": [ - "e-kolay.net", - "ekolay.net", - "hurriyet.com.tr" - ] - }, - "Eleavers": { - "properties": [ - "eleavers.com" - ], - "resources": [ - "eleavers.com" - ] - }, - "Emego": { - "properties": [ - "usemax.de" - ], - "resources": [ - "usemax.de" - ] - }, - "Emerse": { - "properties": [ - "emerse.com" - ], - "resources": [ - "emerse.com" - ] - }, - "EMX": { - "properties": [ - "emxdigital.com" - ], - "resources": [ - "brealtime.com", - "clearstream.tv", - "emxdgt.com", - "emxdigital.com" - ] - }, - "Enecto": { - "properties": [ - "enecto.com" - ], - "resources": [ - "enecto.com" - ] - }, - "engage:BDR": { - "properties": [ - "engagebdr.com" - ], - "resources": [ - "bnmla.com", - "engagebdr.com" - ] - }, - "Engago Technology": { - "properties": [ - "engago.com" - ], - "resources": [ - "appmetrx.com", - "engago.com" - ] - }, - "Engine Network": { - "properties": [ - "enginenetwork.com" - ], - "resources": [ - "enginenetwork.com" - ] - }, - "Ensighten": { - "properties": [ - "ensighten.com" - ], - "resources": [ - "ensighten.com" - ] - }, - "Entireweb": { - "properties": [ - "entireweb.com" - ], - "resources": [ - "entireweb.com" - ] - }, - "Epic Media Group": { - "properties": [ - "epicadvertising.com", - "epicmarketplace.com", - "theepicmediagroup.com" - ], - "resources": [ - "epicadvertising.com", - "epicmarketplace.com", - "epicmobileads.com", - "theepicmediagroup.com", - "trafficmp.com" - ] - }, - "eProof.com": { - "properties": [ - "eproof.com" - ], - "resources": [ - "eproof.com" - ] - }, - "Epsilon": { - "properties": [ - "epsilon.com" - ], - "resources": [ - "epsilon.com" - ] - }, - "EQ Ads": { - "properties": [ - "eqads.com" - ], - "resources": [ - "eqads.com" - ] - }, - "EroAdvertising": { - "properties": [ - "ero-advertising.com" - ], - "resources": [ - "ero-advertising.com" - ] - }, - "Etarget": { - "properties": [ - "etarget.net", - "etargetnet.com" - ], - "resources": [ - "etarget.net", - "etargetnet.com" - ] - }, - "Etineria": { - "properties": [ - "adwitserver.com", - "etineria.com" - ], - "resources": [ - "adwitserver.com", - "etineria.com" - ] - }, - "etracker": { - "properties": [ - "etracker.com", - "etracker.de" - ], - "resources": [ - "etracker.com", - "etracker.de", - "sedotracker.com", - "sedotracker.de" - ] - }, - "eTrigue": { - "properties": [ - "etrigue.com" - ], - "resources": [ - "etrigue.com" - ] - }, - "Eulerian Technologies": { - "properties": [ - "eulerian.com" - ], - "resources": [ - "eulerian.com", - "eulerian.net" - ] - }, - "Evergage": { - "properties": [ - "evergage.com" - ], - "resources": [ - "mybuys.com", - "veruta.com" - ] - }, - "Everyday Health": { - "properties": [ - "everydayhealth.com", - "waterfrontmedia.com" - ], - "resources": [ - "everydayhealth.com", - "waterfrontmedia.com" - ] - }, - "Evisions Marketing": { - "properties": [ - "engineseeker.com", - "evisionsmarketing.com" - ], - "resources": [ - "engineseeker.com", - "evisionsmarketing.com" - ] - }, - "Evolve": { - "properties": [ - "evolvemediacorp.com", - "gorillanation.com" - ], - "resources": [ - "evolvemediacorp.com", - "evolvemediametrics.com", - "gorillanation.com" - ] - }, - "eWayDirect": { - "properties": [ - "ewaydirect.com" - ], - "resources": [ - "ewaydirect.com", - "ixs1.net" - ] - }, - "ewebse": { - "properties": [ - "777seo.com", - "ewebse.com" - ], - "resources": [ - "777seo.com", - "ewebse.com" - ] - }, - "excitad": { - "properties": [ - "excitad.com" - ], - "resources": [ - "excitad.com" - ] - }, - "eXelate": { - "properties": [ - "exelate.com" - ], - "resources": [ - "exelate.com", - "exelator.com" - ] - }, - "ExoClick": { - "properties": [ - "exoclick.com" - ], - "resources": [ - "exoclick.com" - ] - }, - "Exosrv": { - "properties": [ - "exosrv.com" - ], - "resources": [ - "exosrv.com" - ] - }, - "Experian": { - "properties": [ - "experian.com" - ], - "resources": [ - "audienceiq.com", - "experian.com" - ] - }, - "expo-MAX": { - "properties": [ - "expo-max.com" - ], - "resources": [ - "expo-max.com" - ] - }, - "Exponential Interactive": { - "properties": [ - "exponential.com", - "fulltango.com" - ], - "resources": [ - "adotube.com", - "exponential.com", - "fulltango.com", - "tribalfusion.com" - ] - }, - "Extension Factory": { - "properties": [ - "extensionfactory.com" - ], - "resources": [ - "extensionfactory.com" - ] - }, - "EXTENSIONS.RU": { - "properties": [ - "extensions.ru" - ], - "resources": [ - "extensions.ru" - ] - }, - "eXTReMe digital": { - "properties": [ - "extremetracking.com" - ], - "resources": [ - "extreme-dm.com", - "extremetracking.com" - ] - }, - "Eyeconomy": { - "properties": [ - "eyeconomy.co.uk" - ], - "resources": [ - "eyeconomy.co.uk", - "eyeconomy.com", - "sublimemedia.net", - "www.eyeconomy.co.uk" - ] - }, - "EyeNewton": { - "properties": [ - "eyenewton.ru" - ], - "resources": [ - "eyenewton.ru" - ] - }, - "Eyeota": { - "properties": [ - "eyeota.net" - ], - "resources": [ - "eyeota.net" - ] - }, - "eyeReturn Marketing": { - "properties": [ - "eyereturnmarketing.com" - ], - "resources": [ - "eyereturn.com", - "eyereturnmarketing.com" - ] - }, - "Eyeviewdigital": { - "properties": [ - "eyeviewdigital.com" - ], - "resources": [ - "eyeviewads.com", - "eyeviewdigital.com" - ] - }, - "Facebook": { - "properties": [ - "atlassolutions.com", - "facebook.com", - "facebook.de", - "facebook.fr", - "facebook.net", - "fb.com", - "fb.me", - "fbcdn.net", - "friendfeed.com", - "instagram.com", - "internalfb.com", - "messenger.com", - "oculus.com", - "whatsapp.com", - "workplace.com" - ], - "resources": [ - "apps.fbsbx.com", - "atdmt.com", - "atlassolutions.com", - "facebook.com", - "facebook.de", - "facebook.fr", - "facebook.net", - "fb.com", - "fb.me", - "fbcdn.net", - "fbsbx.com", - "friendfeed.com", - "instagram.com", - "messenger.com" - ] - }, - "Facilitate Digital": { - "properties": [ - "adsfac.eu", - "adsfac.net", - "adsfac.us", - "facilitatedigital.com" - ], - "resources": [ - "adsfac.eu", - "adsfac.info", - "adsfac.net", - "adsfac.sg", - "adsfac.us", - "facilitatedigital.com" - ] - }, - "Fairfax Media": { - "properties": [ - "fairfax.com.au", - "fxj.com.au", - "www.fxj.com.au" - ], - "resources": [ - "fairfax.com.au", - "fxj.com.au", - "www.fxj.com.au" - ] - }, - "faithadnet": { - "properties": [ - "faithadnet.com" - ], - "resources": [ - "faithadnet.com" - ] - }, - "Fanplayr": { - "properties": [ - "fanplayr.com" - ], - "resources": [ - "fanplayr.com" - ] - }, - "Fathom": { - "properties": [ - "fathomdelivers.com", - "fathomseo.com" - ], - "resources": [ - "fathomdelivers.com", - "fathomseo.com" - ] - }, - "Federated Media": { - "properties": [ - "hyfn.com", - "lijit.com" - ], - "resources": [ - "federatedmedia.net", - "fmpub.net", - "hyfn.com", - "lijit.com" - ] - }, - "Feedjit": { - "properties": [ - "feedjit.com" - ], - "resources": [ - "feedjit.com" - ] - }, - "FetchBack": { - "properties": [ - "fetchback.com" - ], - "resources": [ - "fetchback.com" - ] - }, - "Fiksu": { - "properties": [ - "fiksu.com" - ], - "resources": [ - "fiksu.com" - ] - }, - "FinancialContent": { - "properties": [ - "financialcontent.com" - ], - "resources": [ - "financialcontent.com" - ] - }, - "Fizz-Buzz Media": { - "properties": [ - "fizzbuzzmedia.com", - "fizzbuzzmedia.net" - ], - "resources": [ - "fizzbuzzmedia.com", - "fizzbuzzmedia.net" - ] - }, - "Flashtalking": { - "properties": [ - "flashtalking.com" - ], - "resources": [ - "encoremetrics.com", - "flashtalking.com", - "sitecompass.com" - ] - }, - "Flattr": { - "properties": [ - "flattr.com" - ], - "resources": [ - "flattr.com" - ] - }, - "Flite": { - "properties": [ - "flite.com", - "widgetserver.com" - ], - "resources": [ - "flite.com", - "widgetserver.com" - ] - }, - "Fluct": { - "properties": [ - "adingo.jp", - "fluct.jp" - ], - "resources": [ - "adingo.jp", - "fluct.jp" - ] - }, - "Flytxt": { - "properties": [ - "flytxt.com" - ], - "resources": [ - "flytxt.com" - ] - }, - "Footprint": { - "properties": [ - "footprintlive.com" - ], - "resources": [ - "footprintlive.com" - ] - }, - "Forbes": { - "properties": [ - "brandsideplatform.com", - "forbes.com" - ], - "resources": [ - "brandsideplatform.com", - "forbes.com" - ] - }, - "Foresee": { - "properties": [ - "foresee.com" - ], - "resources": [ - "answerscloud.com" - ] - }, - "Fox One Stop Media": { - "properties": [ - "fimserve.com", - "foxnetworks.com", - "foxonestop.com", - "mobsmith.com", - "myads.com", - "othersonline.com" - ], - "resources": [ - "fimserve.com", - "foxnetworks.com", - "foxonestop.com", - "mobsmith.com", - "myads.com", - "othersonline.com" - ] - }, - "FreakOut": { - "properties": [ - "fout.jp" - ], - "resources": [ - "fout.jp" - ] - }, - "Freedom Communications": { - "properties": [ - "freedom.com" - ], - "resources": [ - "freedom.com" - ] - }, - "Free Online Users": { - "properties": [ - "freeonlineusers.com" - ], - "resources": [ - "freeonlineusers.com" - ] - }, - "Free-PageRank.com": { - "properties": [ - "free-pagerank.com" - ], - "resources": [ - "free-pagerank.com" - ] - }, - "FreeWheel": { - "properties": [ - "freewheel.tv", - "fwmrm.net" - ], - "resources": [ - "freewheel.tv", - "fwmrm.net", - "stickyadstv.com" - ] - }, - "FriendFinder Networks": { - "properties": [ - "adultfriendfinder.com", - "ffn.com", - "pop6.com" - ], - "resources": [ - "adultfriendfinder.com", - "ffn.com", - "pop6.com" - ] - }, - "Friends2Follow": { - "properties": [ - "friends2follow.com" - ], - "resources": [ - "friends2follow.com" - ] - }, - "Frog Sex": { - "properties": [ - "double-check.com", - "frogsex.com" - ], - "resources": [ - "double-check.com", - "frogsex.com" - ] - }, - "FuelX": { - "properties": [ - "fuelx.com" - ], - "resources": [ - "fuel451.com" - ] - }, - "Fullstory": { - "properties": [ - "fullstory.com" - ], - "resources": [ - "fullstory.com" - ] - }, - "Future Ads": { - "properties": [ - "futureads.com", - "resultlinks.com" - ], - "resources": [ - "futureads.com", - "resultlinks.com" - ] - }, - "Fyber": { - "properties": [ - "fyber.com" - ], - "resources": [ - "fyber.com" - ] - }, - "Game Advertising Online": { - "properties": [ - "game-advertising-online.com" - ], - "resources": [ - "game-advertising-online.com" - ] - }, - "Games2win": { - "properties": [ - "games2win.com", - "inviziads.com" - ], - "resources": [ - "games2win.com", - "inviziads.com" - ] - }, - "Gamned": { - "properties": [ - "gamned.com" - ], - "resources": [ - "gamned.com" - ] - }, - "Gannett": { - "properties": [ - "gannett.com", - "pointroll.com" - ], - "resources": [ - "gannett.com", - "pointroll.com" - ] - }, - "GB-World": { - "properties": [ - "gb-world.net" - ], - "resources": [ - "gb-world.net" - ] - }, - "Gemius": { - "properties": [ - "gemius.com", - "gemius.pl" - ], - "resources": [ - "gemius.com", - "gemius.pl" - ] - }, - "Genesis Media": { - "properties": [ - "genesismedia.com" - ], - "resources": [ - "genesismedia.com", - "genesismediaus.com" - ] - }, - "GENIEE": { - "properties": [ - "geniee.co.jp" - ], - "resources": [ - "geniee.co.jp", - "gssprt.jp" - ] - }, - "GENIE GROUP": { - "properties": [ - "geniegroupltd.co.uk", - "www.geniegroupltd.co.uk" - ], - "resources": [ - "geniegroupltd.co.uk", - "www.geniegroupltd.co.uk" - ] - }, - "Genius.com": { - "properties": [ - "genius.com", - "rsvpgenius.com" - ], - "resources": [ - "genius.com", - "rsvpgenius.com" - ] - }, - "GeoAds": { - "properties": [ - "geoads.com" - ], - "resources": [ - "geoads.com" - ] - }, - "GetGlue": { - "properties": [ - "elfie.com", - "smrtlnks.com" - ], - "resources": [ - "getglue.com", - "smrtlnks.com" - ] - }, - "GetIntent": { - "properties": [ - "adhigh.net", - "getintent.com" - ], - "resources": [ - "adhigh.net", - "getintent.com" - ] - }, - "Get Satisfaction": { - "properties": [ - "getsatisfaction.com" - ], - "resources": [ - "getsatisfaction.com" - ] - }, - "GetSiteControl": { - "properties": [ - "getsitecontrol.com" - ], - "resources": [ - "getsitecontrol.com" - ] - }, - "GfK Group": { - "properties": [ - "gfk.com" - ], - "resources": [ - "daphnecm.com", - "gfk.com", - "gfkdaphne.com" - ] - }, - "Gigya": { - "properties": [ - "gigya.com" - ], - "resources": [ - "gigcount.com", - "gigya.com" - ] - }, - "GISMAds": { - "properties": [ - "gismads.jp" - ], - "resources": [ - "gismads.jp" - ] - }, - "GitHub": { - "properties": [ - "gaug.es", - "github.com" - ], - "resources": [ - "gaug.es", - "github.com" - ] - }, - "Glam Media": { - "properties": [ - "glam.com", - "glammedia.com" - ], - "resources": [ - "glam.com", - "glammedia.com" - ] - }, - "Gleam": { - "properties": [ - "gleam.io" - ], - "resources": [ - "fraudjs.io", - "gleam.io" - ] - }, - "Global Takeoff": { - "properties": [ - "globaltakeoff.com", - "globaltakeoff.net" - ], - "resources": [ - "globaltakeoff.com", - "globaltakeoff.net" - ] - }, - "Globe7": { - "properties": [ - "globe7.com" - ], - "resources": [ - "globe7.com" - ] - }, - "Go Daddy": { - "properties": [ - "godaddy.com", - "trafficfacts.com" - ], - "resources": [ - "godaddy.com", - "trafficfacts.com" - ] - }, - "GoDataFeed": { - "properties": [ - "godatafeed.com" - ], - "resources": [ - "godatafeed.com" - ] - }, - "GoGrid": { - "properties": [ - "datapipe.com", - "formalyzer.com" - ], - "resources": [ - "datapipe.com", - "formalyzer.com", - "gogrid.com", - "komli.net" - ] - }, - "Goldbach": { - "properties": [ - "goldbachgroup.com" - ], - "resources": [ - "goldbach.com", - "goldbachgroup.com" - ] - }, - "GoldSpot Media": { - "properties": [ - "goldspotmedia.com" - ], - "resources": [ - "goldspotmedia.com" - ] - }, - "Google": { - "properties": [ - "abc.xyz", - "admeld.com", - "blogger.com", - "blogspot.com", - "crashlytics.com", - "google-melange.com", - "google.ac", - "google.ad", - "google.ae", - "google.al", - "google.am", - "google.as", - "google.at", - "google.az", - "google.ba", - "google.be", - "google.bf", - "google.bg", - "google.bi", - "google.bj", - "google.bs", - "google.bt", - "google.by", - "google.ca", - "google.cat", - "google.cd", - "google.cf", - "google.cg", - "google.ch", - "google.ci", - "google.cl", - "google.cm", - "google.cn", - "google.co.ao", - "google.co.bw", - "google.co.ck", - "google.co.cr", - "google.co.id", - "google.co.il", - "google.co.in", - "google.co.jp", - "google.co.ke", - "google.co.kr", - "google.co.ls", - "google.co.ma", - "google.co.mz", - "google.co.nz", - "google.co.th", - "google.co.tz", - "google.co.ug", - "google.co.uk", - "google.co.uz", - "google.co.ve", - "google.co.vi", - "google.co.za", - "google.co.zm", - "google.co.zw", - "google.com", - "google.com.af", - "google.com.ag", - "google.com.ai", - "google.com.ar", - "google.com.au", - "google.com.bd", - "google.com.bh", - "google.com.bn", - "google.com.bo", - "google.com.br", - "google.com.bz", - "google.com.co", - "google.com.cu", - "google.com.cy", - "google.com.do", - "google.com.ec", - "google.com.eg", - "google.com.et", - "google.com.fj", - "google.com.gh", - "google.com.gi", - "google.com.gt", - "google.com.hk", - "google.com.jm", - "google.com.kh", - "google.com.kw", - "google.com.lb", - "google.com.ly", - "google.com.mm", - "google.com.mt", - "google.com.mx", - "google.com.my", - "google.com.na", - "google.com.nf", - "google.com.ng", - "google.com.ni", - "google.com.np", - "google.com.om", - "google.com.pa", - "google.com.pe", - "google.com.pg", - "google.com.ph", - "google.com.pk", - "google.com.pr", - "google.com.py", - "google.com.qa", - "google.com.sa", - "google.com.sb", - "google.com.sg", - "google.com.sl", - "google.com.sv", - "google.com.tj", - "google.com.tr", - "google.com.tw", - "google.com.ua", - "google.com.uy", - "google.com.vc", - "google.com.vn", - "google.cv", - "google.cz", - "google.de", - "google.dj", - "google.dk", - "google.dm", - "google.dz", - "google.ee", - "google.es", - "google.fi", - "google.fm", - "google.fr", - "google.ga", - "google.ge", - "google.gg", - "google.gl", - "google.gm", - "google.gp", - "google.gr", - "google.gy", - "google.hn", - "google.hr", - "google.ht", - "google.hu", - "google.ie", - "google.im", - "google.iq", - "google.is", - "google.it", - "google.je", - "google.jo", - "google.kg", - "google.ki", - "google.kz", - "google.la", - "google.li", - "google.lk", - "google.lt", - "google.lu", - "google.lv", - "google.md", - "google.me", - "google.mg", - "google.mk", - "google.ml", - "google.mn", - "google.ms", - "google.mu", - "google.mv", - "google.mw", - "google.ne", - "google.nl", - "google.no", - "google.nr", - "google.nu", - "google.pl", - "google.pn", - "google.ps", - "google.pt", - "google.ro", - "google.rs", - "google.ru", - "google.rw", - "google.sc", - "google.se", - "google.sh", - "google.si", - "google.sk", - "google.sm", - "google.sn", - "google.so", - "google.st", - "google.td", - "google.tg", - "google.tk", - "google.tl", - "google.tm", - "google.tn", - "google.to", - "google.tt", - "google.vg", - "google.vu", - "google.ws", - "googlesource.com", - "ingress.com", - "nest.com", - "panoramio.com", - "pinpoint-dot-chromeperf.appspot.com", - "youtube.com" - ], - "resources": [ - "2mdn.net", - "admeld.com", - "admob.com", - "apture.com", - "blogger.com", - "cc-dt.com", - "crashlytics.com", - "destinationurl.com", - "doubleclick.net", - "ggpht.com", - "gmail.com", - "gmodules.com", - "google-analytics.com", - "google.ac", - "google.ad", - "google.ae", - "google.al", - "google.am", - "google.as", - "google.at", - "google.az", - "google.ba", - "google.be", - "google.bf", - "google.bg", - "google.bi", - "google.bj", - "google.bs", - "google.bt", - "google.by", - "google.ca", - "google.cat", - "google.cc", - "google.cd", - "google.cf", - "google.cg", - "google.ch", - "google.ci", - "google.cl", - "google.cm", - "google.cn", - "google.co.ao", - "google.co.bw", - "google.co.ck", - "google.co.cr", - "google.co.id", - "google.co.il", - "google.co.in", - "google.co.jp", - "google.co.ke", - "google.co.kr", - "google.co.ls", - "google.co.ma", - "google.co.mz", - "google.co.nz", - "google.co.th", - "google.co.tz", - "google.co.ug", - "google.co.uk", - "google.co.uz", - "google.co.ve", - "google.co.vi", - "google.co.za", - "google.co.zm", - "google.co.zw", - "google.com", - "google.com.af", - "google.com.ag", - "google.com.ai", - "google.com.ar", - "google.com.au", - "google.com.bd", - "google.com.bh", - "google.com.bn", - "google.com.bo", - "google.com.br", - "google.com.bz", - "google.com.co", - "google.com.cu", - "google.com.cy", - "google.com.do", - "google.com.ec", - "google.com.eg", - "google.com.et", - "google.com.fj", - "google.com.gh", - "google.com.gi", - "google.com.gt", - "google.com.hk", - "google.com.jm", - "google.com.kh", - "google.com.kw", - "google.com.lb", - "google.com.lc", - "google.com.ly", - "google.com.mm", - "google.com.mt", - "google.com.mx", - "google.com.my", - "google.com.na", - "google.com.nf", - "google.com.ng", - "google.com.ni", - "google.com.np", - "google.com.om", - "google.com.pa", - "google.com.pe", - "google.com.pg", - "google.com.ph", - "google.com.pk", - "google.com.pr", - "google.com.py", - "google.com.qa", - "google.com.sa", - "google.com.sb", - "google.com.sg", - "google.com.sl", - "google.com.sv", - "google.com.tj", - "google.com.tn", - "google.com.tr", - "google.com.tw", - "google.com.ua", - "google.com.uy", - "google.com.vc", - "google.com.vn", - "google.cv", - "google.cz", - "google.de", - "google.dj", - "google.dk", - "google.dm", - "google.dz", - "google.ee", - "google.es", - "google.fi", - "google.fm", - "google.fr", - "google.ga", - "google.ge", - "google.gf", - "google.gg", - "google.gl", - "google.gm", - "google.gp", - "google.gr", - "google.gy", - "google.hn", - "google.hr", - "google.ht", - "google.hu", - "google.ie", - "google.im", - "google.io", - "google.iq", - "google.is", - "google.it", - "google.je", - "google.jo", - "google.kg", - "google.ki", - "google.kz", - "google.la", - "google.li", - "google.lk", - "google.lt", - "google.lu", - "google.lv", - "google.md", - "google.me", - "google.mg", - "google.mk", - "google.ml", - "google.mn", - "google.ms", - "google.mu", - "google.mv", - "google.mw", - "google.ne", - "google.nl", - "google.no", - "google.nr", - "google.nu", - "google.pl", - "google.pn", - "google.ps", - "google.pt", - "google.ro", - "google.rs", - "google.ru", - "google.rw", - "google.sc", - "google.se", - "google.sh", - "google.si", - "google.sk", - "google.sm", - "google.sn", - "google.so", - "google.st", - "google.td", - "google.tg", - "google.tk", - "google.tl", - "google.tm", - "google.tn", - "google.to", - "google.tt", - "google.vg", - "google.vu", - "google.ws", - "googleadservices.com", - "googleapis.com", - "googlemail.com", - "googlesyndication.com", - "googletagservices.com", - "googleusercontent.com", - "googlevideo.com", - "gstatic.com", - "invitemedia.com", - "postrank.com", - "recaptcha.net", - "smtad.net", - "youtube.com" - ] - }, - "GoSquared": { - "properties": [ - "gosquared.com" - ], - "resources": [ - "gosquared.com" - ] - }, - "GoStats": { - "properties": [ - "gostats.com" - ], - "resources": [ - "gostats.com" - ] - }, - "Grapeshot": { - "properties": [ - "grapeshot.co.uk", - "www.grapeshot.co.uk" - ], - "resources": [ - "grapeshot.co.uk", - "www.grapeshot.co.uk" - ] - }, - "GrapheneMedia": { - "properties": [ - "graphenemedia.in" - ], - "resources": [ - "graphenedigitalanalytics.in" - ] - }, - "Graphnium": { - "properties": [ - "graphinium.com" - ], - "resources": [ - "crm4d.com" - ] - }, - "Gravity": { - "properties": [ - "gravity.com", - "grvcdn.com" - ], - "resources": [ - "gravity.com", - "grvcdn.com" - ] - }, - "Gridcash": { - "properties": [ - "adless.io", - "gridcash.net" - ], - "resources": [ - "adless.io", - "gridcash.net" - ] - }, - "Grocery Shopping Network": { - "properties": [ - "groceryshopping.net" - ], - "resources": [ - "groceryshopping.net" - ] - }, - "GroovinAds": { - "properties": [ - "groovinads.com" - ], - "resources": [ - "groovinads.com" - ] - }, - "Gruner + Jahr": { - "properties": [ - "guj.de", - "ligatus.com" - ], - "resources": [ - "guj.de", - "ligatus.com" - ] - }, - "GTop": { - "properties": [ - "arenaweb.ro" - ], - "resources": [ - "arenaweb.ro", - "gtop.ro", - "gtopstats.com" - ] - }, - "GumGum": { - "properties": [ - "gumgum.com" - ], - "resources": [ - "gumgum.com" - ] - }, - "Gunggo": { - "properties": [ - "gunggo.com" - ], - "resources": [ - "gunggo.com" - ] - }, - "Hands Mobile": { - "properties": [ - "hands.com.br", - "www.hands.com.br" - ], - "resources": [ - "hands.com.br", - "www.hands.com.br" - ] - }, - "Harrenmedia": { - "properties": [ - "harrenmedia.com", - "harrenmedianetwork.com" - ], - "resources": [ - "harrenmedia.com", - "harrenmedianetwork.com" - ] - }, - "HealthPricer": { - "properties": [ - "adacado.com", - "healthpricer.com" - ], - "resources": [ - "adacado.com", - "healthpricer.com" - ] - }, - "Hearst": { - "properties": [ - "hearst.com", - "ic-live.com", - "iclive.com", - "icrossing.com", - "raasnet.com" - ], - "resources": [ - "hearst.com", - "ic-live.com", - "iclive.com", - "icrossing.com", - "raasnet.com", - "redaril.com", - "sptag.com", - "sptag1.com", - "sptag2.com", - "sptag3.com" - ] - }, - "Heyzap": { - "properties": [ - "heyzap.com" - ], - "resources": [ - "heyzap.com" - ] - }, - "HilltopAds": { - "properties": [ - "hilltopads.com" - ], - "resources": [ - "hilltopads.com", - "hilltopads.net", - "shoporielder.pro" - ] - }, - "Hi-media": { - "properties": [ - "himediagroup.com" - ], - "resources": [ - "comclick.com", - "hi-media.com", - "himediagroup.com" - ] - }, - "Histats": { - "properties": [ - "histats.com" - ], - "resources": [ - "histats.com" - ] - }, - "HitsLink": { - "properties": [ - "hitslink.com" - ], - "resources": [ - "hitslink.com" - ] - }, - "Hit Sniffer": { - "properties": [ - "hitsniffer.com" - ], - "resources": [ - "hitsniffer.com" - ] - }, - "Horyzon Media": { - "properties": [ - "horyzon-media.com" - ], - "resources": [ - "horyzon-media.com" - ] - }, - "HotelChamp": { - "properties": [ - "hotelchamp.com" - ], - "resources": [ - "hotelchamp.com" - ] - }, - "Hotjar": { - "properties": [ - "hotjar.com" - ], - "resources": [ - "hotjar.com" - ] - }, - "HotMart": { - "properties": [ - "hotmart.com" - ], - "resources": [ - "hotmart.com" - ] - }, - "HOTWords": { - "properties": [ - "hotwords.com", - "hotwords.es" - ], - "resources": [ - "hotwords.com", - "hotwords.es" - ] - }, - "HP": { - "properties": [ - "hp.com", - "opentext.com", - "optimost.com" - ], - "resources": [ - "hp.com", - "optimost.com" - ] - }, - "Httpool": { - "properties": [ - "httpool.com" - ], - "resources": [ - "httpool.com" - ] - }, - "HubSpot": { - "properties": [ - "hubspot.com" - ], - "resources": [ - "hs-analytics.net", - "hubspot.com" - ] - }, - "HUNT Mobile Ads": { - "properties": [ - "huntmads.com" - ], - "resources": [ - "huntmads.com" - ] - }, - "Hurra.com": { - "properties": [ - "hurra.com" - ], - "resources": [ - "hurra.com" - ] - }, - "IAB": { - "properties": [ - "digitru.st", - "iabtechlab.com" - ], - "resources": [ - "digitru.st" - ] - }, - "IAC": { - "properties": [ - "iac.com", - "iacadvertising.com" - ], - "resources": [ - "iac.com", - "iacadvertising.com" - ] - }, - "iBehavior": { - "properties": [ - "i-behavior.com", - "ib-ibi.com" - ], - "resources": [ - "i-behavior.com", - "ib-ibi.com" - ] - }, - "IBM": { - "properties": [ - "ibm.com", - "multicloud-ibm.com" - ], - "resources": [ - "cmcore.com", - "coremetrics.com", - "ibm.com", - "unica.com", - "xtify.com" - ] - }, - "ID5": { - "properties": [ - "id5.io" - ], - "resources": [ - "id5-sync.com" - ] - }, - "IDG": { - "properties": [ - "idg.com", - "idgtechnetwork.com" - ], - "resources": [ - "idg.com", - "idgtechnetwork.com" - ] - }, - "iEntry": { - "properties": [ - "600z.com", - "ientry.com" - ], - "resources": [ - "600z.com", - "ientry.com" - ] - }, - "IgnitAd": { - "properties": [ - "ignitad.com" - ], - "resources": [ - "ignitad.com" - ] - }, - "IgnitionOne": { - "properties": [ - "ignitionone.com", - "ignitionone.net", - "searchignite.com" - ], - "resources": [ - "ignitionone.com", - "ignitionone.net", - "searchignite.com" - ] - }, - "iMedia": { - "properties": [ - "imedia.cz" - ], - "resources": [ - "imedia.cz" - ] - }, - "Improve Digital": { - "properties": [ - "360yield.com", - "improvedigital.com" - ], - "resources": [ - "360yield.com", - "improvedigital.com" - ] - }, - "Inadco": { - "properties": [ - "inadco.com" - ], - "resources": [ - "anadcoads.com", - "inadco.com", - "inadcoads.com" - ] - }, - "InboundWriter": { - "properties": [ - "enquisite.com", - "inboundwriter.com" - ], - "resources": [ - "enquisite.com", - "inboundwriter.com" - ] - }, - "IndexExchange": { - "properties": [ - "indexexchange.com" - ], - "resources": [ - "indexexchange.com" - ] - }, - "Infectious Media": { - "properties": [ - "infectiousmedia.com" - ], - "resources": [ - "impressiondesk.com", - "infectiousmedia.com" - ] - }, - "Infernotions": { - "properties": [ - "infernotions.com" - ], - "resources": [ - "infernotions.com" - ] - }, - "Inflection Point Media": { - "properties": [ - "inflectionpointmedia.com" - ], - "resources": [ - "inflectionpointmedia.com" - ] - }, - "Infogroup": { - "properties": [ - "infogroup.com" - ], - "resources": [ - "infogroup.com" - ] - }, - "Infolinks": { - "properties": [ - "infolinks.com" - ], - "resources": [ - "infolinks.com" - ] - }, - "INFOnline": { - "properties": [ - "infonline.de" - ], - "resources": [ - "infonline.de", - "ioam.de", - "ivwbox.de" - ] - }, - "InfoStars": { - "properties": [ - "hotlog.ru", - "infostars.ru" - ], - "resources": [ - "hotlog.ru", - "infostars.ru" - ] - }, - "Infra-Ad": { - "properties": [ - "infra-ad.com" - ], - "resources": [ - "infra-ad.com" - ] - }, - "InMobi": { - "properties": [ - "aerserv.com", - "inmobi.com", - "sproutinc.com" - ], - "resources": [ - "aerserv.com", - "inmobi.com", - "sproutinc.com" - ] - }, - "inneractive": { - "properties": [ - "inner-active.com" - ], - "resources": [ - "inner-active.com" - ] - }, - "Innity": { - "properties": [ - "innity.com" - ], - "resources": [ - "innity.com" - ] - }, - "InsightExpress": { - "properties": [ - "insightexpress.com" - ], - "resources": [ - "insightexpress.com", - "insightexpressai.com" - ] - }, - "InSkin Media": { - "properties": [ - "inskinmedia.com" - ], - "resources": [ - "inskinmedia.com" - ] - }, - "Inspectlet": { - "properties": [ - "inspectlet.com" - ], - "resources": [ - "inspectlet.com" - ] - }, - "Instinctive": { - "properties": [ - "instinctive.io" - ], - "resources": [ - "instinctive.io", - "instinctiveads.com" - ] - }, - "Integral Ad Science": { - "properties": [ - "integralads.com" - ], - "resources": [ - "adsafemedia.com", - "adsafeprotected.com", - "iasds01.com", - "integralads.com" - ] - }, - "IntelligenceFocus": { - "properties": [ - "intelligencefocus.com", - "leadchampion.com" - ], - "resources": [ - "domodomain.com", - "intelligencefocus.com", - "leadchampion.com" - ] - }, - "Intent Media": { - "properties": [ - "intentmedia.com" - ], - "resources": [ - "intentmedia.com", - "intentmedia.net" - ] - }, - "Intergi": { - "properties": [ - "intergi.com" - ], - "resources": [ - "intergi.com" - ] - }, - "Intermarkets": { - "properties": [ - "intermarkets.net" - ], - "resources": [ - "intermarkets.net" - ] - }, - "Intermundo Media": { - "properties": [ - "intermundomedia.com" - ], - "resources": [ - "intermundomedia.com" - ] - }, - "Internet Brands": { - "properties": [ - "ibpxl.com", - "internetbrands.com" - ], - "resources": [ - "ibpxl.com", - "internetbrands.com" - ] - }, - "Interpolls": { - "properties": [ - "interpolls.com" - ], - "resources": [ - "interpolls.com" - ] - }, - "Inuvo": { - "properties": [ - "inuvo.com" - ], - "resources": [ - "inuvo.com" - ] - }, - "InvestingChannel": { - "properties": [ - "investingchannel.com" - ], - "resources": [ - "investingchannel.com" - ] - }, - "iovation": { - "properties": [ - "iovation.com" - ], - "resources": [ - "iesnare.com", - "iovation.com" - ] - }, - "iPerceptions": { - "properties": [ - "iperceptions.com" - ], - "resources": [ - "iperceptions.com" - ] - }, - "IponWeb": { - "properties": [ - "iponweb.com" - ], - "resources": [ - "iponweb.com", - "iponweb.net" - ] - }, - "iPROM": { - "properties": [ - "centraliprom.com", - "iprom.net", - "iprom.si", - "mediaiprom.com" - ], - "resources": [ - "centraliprom.com", - "iprom.net", - "iprom.si", - "mediaiprom.com" - ] - }, - "iPromote": { - "properties": [ - "ipromote.com" - ], - "resources": [ - "ipromote.com" - ] - }, - "iProspect": { - "properties": [ - "iprospect.com" - ], - "resources": [ - "clickmanage.com", - "iprospect.com" - ] - }, - "ISI Technologies": { - "properties": [ - "adversalservers.com", - "digbro.com" - ], - "resources": [ - "adversalservers.com", - "digbro.com" - ] - }, - "IslayTech": { - "properties": [ - "islay.tech" - ], - "resources": [ - "islay.tech" - ] - }, - "ismatlab.com": { - "properties": [ - "ismatlab.com" - ], - "resources": [ - "ismatlab.com" - ] - }, - "Itch": { - "properties": [ - "itch.io" - ], - "resources": [ - "itch.io" - ] - }, - "ItIsATracker": { - "properties": [ - "itisatracker.com" - ], - "resources": [ - "itisatracker.com" - ] - }, - "I.UA": { - "properties": [ - "i.ua" - ], - "resources": [ - "i.ua" - ] - }, - "Jaroop": { - "properties": [ - "jaroop.com" - ], - "resources": [ - "jaroop.com" - ] - }, - "JasperLabs": { - "properties": [ - "jasperlabs.com" - ], - "resources": [ - "jasperlabs.com" - ] - }, - "Jemm": { - "properties": [ - "jemmgroup.com" - ], - "resources": [ - "jemmgroup.com" - ] - }, - "Jink": { - "properties": [ - "jink.de", - "jinkads.com" - ], - "resources": [ - "jink.de", - "jinkads.com" - ] - }, - "Jirbo": { - "properties": [ - "adcolony.com" - ], - "resources": [ - "adcolony.com", - "jirbo.com" - ] - }, - "Jivox": { - "properties": [ - "jivox.com" - ], - "resources": [ - "jivox.com" - ] - }, - "JobThread": { - "properties": [ - "jobthread.com" - ], - "resources": [ - "jobthread.com" - ] - }, - "JSE": { - "properties": [ - "jsecoin.com" - ], - "resources": [ - "freecontent.bid", - "freecontent.date", - "freecontent.stream", - "hashing.win", - "hostingcloud.racing", - "hostingcloud.science", - "jsecoin.com" - ] - }, - "JuicyAds": { - "properties": [ - "juicyads.com" - ], - "resources": [ - "juicyads.com" - ] - }, - "Jumptap": { - "properties": [ - "jumptap.com" - ], - "resources": [ - "jumptap.com" - ] - }, - "justuno": { - "properties": [ - "justuno.com" - ], - "resources": [ - "justuno.com" - ] - }, - "Kaltura": { - "properties": [ - "kaltura.com" - ], - "resources": [ - "kaltura.com" - ] - }, - "Kargo": { - "properties": [ - "kargo.com" - ], - "resources": [ - "kargo.com" - ] - }, - "Kenshoo": { - "properties": [ - "kenshoo.com", - "xg4ken.com" - ], - "resources": [ - "kenshoo.com", - "xg4ken.com" - ] - }, - "Keyade": { - "properties": [ - "keyade.com" - ], - "resources": [ - "keyade.com" - ] - }, - "KeyMetric": { - "properties": [ - "keymetric.net" - ], - "resources": [ - "keymetric.net" - ] - }, - "Keywee": { - "properties": [ - "keywee.co" - ], - "resources": [ - "keywee.co" - ] - }, - "kikin": { - "properties": [ - "kikin.com" - ], - "resources": [ - "kikin.com" - ] - }, - "KISSmetrics": { - "properties": [ - "kissmetrics.com" - ], - "resources": [ - "kissmetrics.com" - ] - }, - "KissMyAds": { - "properties": [ - "kissmyads.com" - ], - "resources": [ - "kissmyads.com" - ] - }, - "Kitara Media": { - "properties": [ - "103092804.com", - "kitaramedia.com" - ], - "resources": [ - "103092804.com", - "kitaramedia.com" - ] - }, - "Kitcode": { - "properties": [ - "kitcode.net" - ], - "resources": [ - "kitcode.net" - ] - }, - "KIT digital": { - "properties": [ - "kitd.com" - ], - "resources": [ - "keewurd.com", - "kitd.com", - "peerset.com" - ] - }, - "Kokteyl": { - "properties": [ - "admost.com", - "kokteyl.com" - ], - "resources": [ - "admost.com", - "kokteyl.com" - ] - }, - "Komli": { - "properties": [ - "komli.com" - ], - "resources": [ - "komli.com" - ] - }, - "Konduto": { - "properties": [ - "konduto.com" - ], - "resources": [ - "k-analytix.com", - "konduto.com" - ] - }, - "Kontera": { - "properties": [ - "kontera.com" - ], - "resources": [ - "kontera.com" - ] - }, - "Korrelate": { - "properties": [ - "korrelate.com" - ], - "resources": [ - "adsummos.com", - "adsummos.net", - "korrelate.com" - ] - }, - "Krux": { - "properties": [ - "krux.com", - "kruxdigital.com" - ], - "resources": [ - "krux.com", - "kruxdigital.com", - "krxd.net" - ] - }, - "Lakana": { - "properties": [ - "lakana.com" - ], - "resources": [ - "ibsys.com", - "lakana.com" - ] - }, - "Layer-Ad.org": { - "properties": [ - "layer-ad.org" - ], - "resources": [ - "layer-ad.org" - ] - }, - "Layer Ads": { - "properties": [ - "layer-ads.net" - ], - "resources": [ - "layer-ads.net" - ] - }, - "LeadBolt": { - "properties": [ - "leadbolt.com" - ], - "resources": [ - "leadbolt.com" - ] - }, - "LeadForensics": { - "properties": [ - "leadforensics.com" - ], - "resources": [ - "leadforensics.com" - ] - }, - "LeadFormix": { - "properties": [ - "calliduscloud.com", - "leadforce1.com", - "leadformix.com" - ], - "resources": [ - "calliduscloud.com", - "leadforce1.com", - "leadformix.com" - ] - }, - "LeadsHub": { - "properties": [ - "ztsrv.com" - ], - "resources": [ - "ztsrv.com" - ] - }, - "LeanPlum": { - "properties": [ - "leanplum.com" - ], - "resources": [ - "leanplum.com" - ] - }, - "Legolas Media": { - "properties": [ - "legolas-media.com" - ], - "resources": [ - "legolas-media.com" - ] - }, - "Levexis": { - "properties": [ - "levexis.com" - ], - "resources": [ - "levexis.com" - ] - }, - "Lexos Media": { - "properties": [ - "adbull.com", - "lexosmedia.com" - ], - "resources": [ - "adbull.com", - "lexosmedia.com" - ] - }, - "LifeStreet": { - "properties": [ - "lfstmedia.com", - "lifestreetmedia.com" - ], - "resources": [ - "lfstmedia.com", - "lifestreetmedia.com" - ] - }, - "Limelight Networks": { - "properties": [ - "limelight.com" - ], - "resources": [ - "clickability.com", - "limelight.com", - "llnwd.net" - ] - }, - "LineZing": { - "properties": [ - "linezing.com" - ], - "resources": [ - "linezing.com" - ] - }, - "LinkConnector": { - "properties": [ - "linkconnector.com" - ], - "resources": [ - "linkconnector.com" - ] - }, - "LinkedIn": { - "properties": [ - "linkedin.com" - ], - "resources": [ - "licdn.com", - "linkedin.com" - ] - }, - "LinkShare": { - "properties": [ - "rakutenmarketing.com" - ], - "resources": [ - "linkshare.com", - "linksynergy.com", - "rakutenmarketing.com" - ] - }, - "Linkz": { - "properties": [ - "linkz.net" - ], - "resources": [ - "linkz.net" - ] - }, - "Listrak": { - "properties": [ - "listrak.com", - "listrakbi.com" - ], - "resources": [ - "listrak.com", - "listrakbi.com" - ] - }, - "LiveIntent": { - "properties": [ - "liveintent.com" - ], - "resources": [ - "liadm.com", - "liveintent.com" - ] - }, - "LiveInternet": { - "properties": [ - "liveinternet.ru", - "yadro.ru" - ], - "resources": [ - "liveinternet.ru", - "yadro.ru" - ] - }, - "LivePerson": { - "properties": [ - "liveperson.com" - ], - "resources": [ - "liveperson.com", - "liveperson.net", - "nuconomy.com" - ] - }, - "LiveRail": { - "properties": [ - "liverail.com" - ], - "resources": [ - "liverail.com" - ] - }, - "LiveRamp": { - "properties": [ - "liveramp.com" - ], - "resources": [ - "liveramp.com", - "tvpixel.com" - ] - }, - "LKQD": { - "properties": [ - "lkqd.com", - "lkqd.net" - ], - "resources": [ - "lkqd.com", - "lkqd.net" - ] - }, - "Local Yokel Media": { - "properties": [ - "localyokelmedia.com" - ], - "resources": [ - "localyokelmedia.com" - ] - }, - "Localytics": { - "properties": [ - "localytics.com" - ], - "resources": [ - "localytics.com" - ] - }, - "LockerDome": { - "properties": [ - "lockerdome.com" - ], - "resources": [ - "lockerdome.com" - ] - }, - "Lockerz": { - "properties": [ - "lockerz.com" - ], - "resources": [ - "lockerz.com" - ] - }, - "Logdy": { - "properties": [ - "logdy.com" - ], - "resources": [ - "logdy.com" - ] - }, - "Longboard Media": { - "properties": [ - "longboardmedia.com" - ], - "resources": [ - "longboardmedia.com" - ] - }, - "LongTail Video": { - "properties": [ - "jwplayer.com" - ], - "resources": [ - "longtailvideo.com", - "ltassrv.com" - ] - }, - "Loomia": { - "properties": [ - "loomia.com" - ], - "resources": [ - "loomia.com" - ] - }, - "LoopFuse": { - "properties": [ - "lfov.net", - "loopfuse.net" - ], - "resources": [ - "lfov.net", - "loopfuse.net" - ] - }, - "LoopMe": { - "properties": [ - "loopme.com" - ], - "resources": [ - "loopme.com" - ] - }, - "Lotame": { - "properties": [ - "crwdcntrl.net", - "lotame.com" - ], - "resources": [ - "crwdcntrl.net", - "lotame.com" - ] - }, - "LotLinx": { - "properties": [ - "lotlinx.com" - ], - "resources": [ - "lotlinx.com" - ] - }, - "Lower My Bills": { - "properties": [ - "lowermybills.com" - ], - "resources": [ - "lowermybills.com" - ] - }, - "lptracker": { - "properties": [ - "lptracker.io" - ], - "resources": [ - "lptracker.io" - ] - }, - "LucidMedia": { - "properties": [ - "lucidmedia.com" - ], - "resources": [ - "lucidmedia.com" - ] - }, - "LuckyOrange": { - "properties": [ - "luckyorange.com" - ], - "resources": [ - "luckyorange.com", - "luckyorange.net" - ] - }, - "Lynchpin": { - "properties": [ - "lynchpin.com" - ], - "resources": [ - "lynchpin.com", - "lypn.com" - ] - }, - "Lyris": { - "properties": [ - "aurea.com" - ], - "resources": [ - "aurea.com", - "clicktracks.com", - "lyris.com" - ] - }, - "Lytiks": { - "properties": [ - "lytiks.com" - ], - "resources": [ - "lytiks.com" - ] - }, - "m6d": { - "properties": [ - "dstillery.com" - ], - "resources": [ - "dstillery.com", - "m6d.com", - "media6degrees.com" - ] - }, - "Madhouse": { - "properties": [ - "madhouse.cn" - ], - "resources": [ - "madhouse.cn" - ] - }, - "Madison Logic": { - "properties": [ - "dinclinx.com", - "madisonlogic.com" - ], - "resources": [ - "dinclinx.com", - "madisonlogic.com" - ] - }, - "madvertise": { - "properties": [ - "madvertise.com" - ], - "resources": [ - "madvertise.com" - ] - }, - "Magnetic": { - "properties": [ - "domdex.net", - "magnetic.com" - ], - "resources": [ - "domdex.com", - "domdex.net", - "magnetic.com", - "qjex.net" - ] - }, - "Magnify360": { - "properties": [ - "dialogmgr.com", - "magnify360.com" - ], - "resources": [ - "dialogmgr.com", - "magnify360.com" - ] - }, - "MailChimp": { - "properties": [ - "campaign-archive1.com", - "mailchi.mp", - "mailchimp.com" - ], - "resources": [ - "campaign-archive1.com", - "list-manage.com", - "mailchi.mp", - "mailchimp.com" - ] - }, - "Mail.Ru": { - "properties": [ - "list.ru", - "mail.ru" - ], - "resources": [ - "list.ru", - "mail.ru" - ] - }, - "Manifest": { - "properties": [ - "bannerbank.ru", - "manifest.ru" - ], - "resources": [ - "bannerbank.ru", - "manifest.ru" - ] - }, - "Marchex": { - "properties": [ - "industrybrains.com", - "marchex.com" - ], - "resources": [ - "industrybrains.com", - "marchex.com" - ] - }, - "Marimedia": { - "properties": [ - "marimedia.net" - ], - "resources": [ - "marimedia.net" - ] - }, - "MarketGid": { - "properties": [ - "dt00.net", - "dt07.net", - "marketgid.com" - ], - "resources": [ - "dt00.net", - "dt07.net", - "marketgid.com" - ] - }, - "Marketo": { - "properties": [ - "marketo.com" - ], - "resources": [ - "marketo.com", - "marketo.net" - ] - }, - "Markit": { - "properties": [ - "markit.com", - "wsod.com" - ], - "resources": [ - "markit.com", - "wsod.com" - ] - }, - "MarkMonitor": { - "properties": [ - "9c9media.ca", - "markmonitor.com" - ], - "resources": [ - "9c9media.ca", - "markmonitor.com" - ] - }, - "Marktest": { - "properties": [ - "marktest.com", - "marktest.pt" - ], - "resources": [ - "marktest.com", - "marktest.pt" - ] - }, - "Martini Media": { - "properties": [ - "martiniadnetwork.com" - ], - "resources": [ - "martiniadnetwork.com", - "martinimedianetwork.com" - ] - }, - "mashero": { - "properties": [ - "mashero.com" - ], - "resources": [ - "mashero.com" - ] - }, - "MashLogic": { - "properties": [ - "mashlogic.com" - ], - "resources": [ - "mashlogic.com" - ] - }, - "Match.com": { - "properties": [ - "chemistry.com", - "match.com" - ], - "resources": [ - "chemistry.com", - "match.com", - "meetic-partners.com" - ] - }, - "Matomy": { - "properties": [ - "matomy.com" - ], - "resources": [ - "adnetinteractive.com", - "adsmarket.com", - "matomy.com", - "matomymarket.com", - "matomymedia.com", - "mediawhiz.com", - "optimatic.com", - "xtendmedia.com" - ] - }, - "MaxBounty": { - "properties": [ - "maxbounty.com", - "mb01.com" - ], - "resources": [ - "maxbounty.com", - "mb01.com" - ] - }, - "MaxMind": { - "properties": [ - "maxmind.com" - ], - "resources": [ - "maxmind.com", - "mmapiws.com" - ] - }, - "MaxPoint": { - "properties": [ - "maxpointinteractive.com", - "maxusglobal.com", - "mxptint.net" - ], - "resources": [ - "maxpointinteractive.com", - "maxusglobal.com", - "mxptint.net" - ] - }, - "McAfee": { - "properties": [ - "mcafee.com", - "mcafeesecure.com" - ], - "resources": [ - "mcafee.com", - "mcafeesecure.com", - "scanalert.com" - ] - }, - "MdotM": { - "properties": [ - "mdotm.com" - ], - "resources": [ - "mdotm.com" - ] - }, - "MediaBrix": { - "properties": [ - "mediabrix.com" - ], - "resources": [ - "mediabrix.com" - ] - }, - "MediaCom": { - "properties": [ - "mediacom.com" - ], - "resources": [ - "mediacom.com" - ] - }, - "mediaFORGE": { - "properties": [ - "mediaforge.com" - ], - "resources": [ - "mediaforge.com" - ] - }, - "Medialets": { - "properties": [ - "medialets.com" - ], - "resources": [ - "medialets.com" - ] - }, - "MediaMath": { - "properties": [ - "mediamath.com" - ], - "resources": [ - "adroitinteractive.com", - "designbloxlive.com", - "mathtag.com", - "mediamath.com" - ] - }, - "Médiamétrie-eStat": { - "properties": [ - "mediametrie-estat.com" - ], - "resources": [ - "estat.com", - "mediametrie-estat.com" - ] - }, - "media.net": { - "properties": [ - "media.net" - ], - "resources": [ - "media.net" - ] - }, - "Mediaocean": { - "properties": [ - "adbuyer.com", - "mediaocean.com" - ], - "resources": [ - "adbuyer.com", - "mediaocean.com" - ] - }, - "MediaShakers": { - "properties": [ - "media-servers.net", - "mediashakers.com" - ], - "resources": [ - "media-servers.net", - "mediashakers.com" - ] - }, - "MediaTrust": { - "properties": [ - "mediatrust.com" - ], - "resources": [ - "mediatrust.com" - ] - }, - "Medicx Media Solutions": { - "properties": [ - "medicxmedia.com" - ], - "resources": [ - "medicxmedia.com" - ] - }, - "Meebo": { - "properties": [ - "meebo.com" - ], - "resources": [ - "meebo.com", - "meebocdn.net" - ] - }, - "MegaIndex": { - "properties": [ - "megaindex.ru" - ], - "resources": [ - "megaindex.ru" - ] - }, - "Mercadopago": { - "properties": [ - "mercadolibre.cl", - "mercadolibre.co.cr", - "mercadolibre.com", - "mercadolibre.com.ar", - "mercadolibre.com.bo", - "mercadolibre.com.co", - "mercadolibre.com.do", - "mercadolibre.com.ec", - "mercadolibre.com.gt", - "mercadolibre.com.hn", - "mercadolibre.com.mx", - "mercadolibre.com.ni", - "mercadolibre.com.pa", - "mercadolibre.com.pe", - "mercadolibre.com.py", - "mercadolibre.com.sv", - "mercadolibre.com.uy", - "mercadolibre.com.ve", - "mercadolivre.com.br", - "mercadopago.com" - ], - "resources": [ - "mercadopago.com" - ] - }, - "Mercent": { - "properties": [ - "mercent.com" - ], - "resources": [ - "mercent.com" - ] - }, - "MerchantAdvantage": { - "properties": [ - "merchantadvantage.com" - ], - "resources": [ - "merchantadvantage.com" - ] - }, - "Merchenta": { - "properties": [ - "merchenta.com" - ], - "resources": [ - "merchenta.com" - ] - }, - "Merkle": { - "properties": [ - "merkleinc.com", - "rkdms.com" - ], - "resources": [ - "merkleinc.com", - "rimmkaufman.com", - "rkdms.com" - ] - }, - "Meta Network": { - "properties": [ - "metanetwork.com" - ], - "resources": [ - "metanetwork.com" - ] - }, - "Meteor": { - "properties": [ - "meteorsolutions.com" - ], - "resources": [ - "meteorsolutions.com" - ] - }, - "MetrixLab": { - "properties": [ - "crm-metrix.com", - "customerconversio.com", - "metrixlab.com", - "opinionbar.com" - ], - "resources": [ - "adoftheyear.com", - "crm-metrix.com", - "customerconversio.com", - "metrixlab.com", - "opinionbar.com" - ] - }, - "MicroAd": { - "properties": [ - "microad.jp", - "www.microad.jp" - ], - "resources": [ - "microad.jp", - "www.microad.jp" - ] - }, - "Microsoft": { - "properties": [ - "acompli.net", - "aka.ms", - "azure.com", - "azure.net", - "azurerms.com", - "bing.com", - "cloudappsecurity.com", - "gamesforwindows.com", - "getgamesmart.com", - "gfx.ms", - "healthvault.com", - "hockeyapp.net", - "ieaddons.com", - "iegallery.com", - "live.com", - "microsoft.com", - "microsoftalumni.com", - "microsoftalumni.org", - "microsoftazuread-sso.com", - "microsoftedgeinsiders.com", - "microsoftonline-p.com", - "microsoftonline-p.net", - "microsoftonline.com", - "microsoftstore.com", - "microsoftstream.com", - "msappproxy.net", - "msft.net", - "msftidentity.com", - "msidentity.com", - "msn.com", - "o365weve.com", - "oaspapps.com", - "office.com", - "office365.com", - "officelive.com", - "onedrive.com", - "onenote.com", - "outlook.com", - "outlookmobile.com", - "phonefactor.net", - "s-msn.com", - "sfx.ms", - "sharepoint.com", - "skype.com", - "skypeforbusiness.com", - "staffhub.ms", - "sway-extensions.com", - "sway.com", - "trafficmanager.net", - "virtualearth.net", - "visualstudio.com", - "windows.net", - "windowsazure.com", - "windowsphone.com", - "worldwidetelescope.org", - "wunderlist.com", - "xbox.com", - "yammer.com" - ], - "resources": [ - "aadrm.com", - "adbureau.net", - "adecn.com", - "aquantive.com", - "aspnetcdn.com", - "assets-yammer.com", - "azure.com", - "azureedge.net", - "bing.com", - "cloudapp.net", - "gamesforwindows.com", - "getgamesmart.com", - "gfx.ms", - "healthvault.com", - "live.com", - "microsoft.com", - "microsoftazuread-sso.com", - "microsoftonline-p.com", - "microsoftonline-p.net", - "microsoftonline.com", - "microsoftstore.com", - "msads.net", - "msauthimages.net", - "msecnd.net", - "msedge.net", - "msndirect.com", - "msocdn.com", - "netconversions.com", - "oaspapps.com", - "office.com", - "office.net", - "officelive.com", - "onenote.net", - "onestore.ms", - "onmicrosoft.com", - "outlook.com", - "roiservice.com", - "s-msn.com", - "sfbassets.com", - "sharepoint.com", - "skype.com", - "skypeassets.com", - "sway-cdn.com", - "sway-extensions.com", - "windows.net", - "windowsazure.com", - "yammerusercontent.com" - ] - }, - "Millennial Media": { - "properties": [ - "decktrade.com", - "millennialmedia.com", - "mydas.mobi" - ], - "resources": [ - "decktrade.com", - "millennialmedia.com", - "mydas.mobi" - ] - }, - "Mindset Media": { - "properties": [ - "mindset-media.com" - ], - "resources": [ - "mindset-media.com", - "mmismm.com" - ] - }, - "MinerAlt": { - "properties": [ - "mineralt.io", - "vidzi.nu", - "vidzi.tv" - ], - "resources": [ - "1q2w3.website", - "analytics.blue", - "aster18cdn.nl", - "belicimo.pw", - "besstahete.info", - "dinorslick.icu", - "feesocrald.com", - "gramombird.com", - "istlandoll.com", - "mepirtedic.com", - "mineralt.io", - "pampopholf.com", - "tercabilis.info", - "tulip18.com", - "vidzi.tv", - "yololike.space" - ] - }, - "Minescripts": { - "properties": [ - "minescripts.info" - ], - "resources": [ - "minescripts.info", - "sslverify.info" - ] - }, - "MineXMR": { - "properties": [ - "minexmr.stream" - ], - "resources": [ - "minexmr.stream" - ] - }, - "Mirando": { - "properties": [ - "mirando.de" - ], - "resources": [ - "mirando.de" - ] - }, - "Mixpanel": { - "properties": [ - "mixpanel.com" - ], - "resources": [ - "mixpanel.com", - "mxpnl.com" - ] - }, - "Mixpo": { - "properties": [ - "mixpo.com" - ], - "resources": [ - "mixpo.com" - ] - }, - "Moat": { - "properties": [ - "moat.com", - "moatads.com" - ], - "resources": [ - "moat.com", - "moatads.com" - ] - }, - "MobFox": { - "properties": [ - "mobfox.com" - ], - "resources": [ - "mobfox.com" - ] - }, - "Mobials": { - "properties": [ - "mobials.com" - ], - "resources": [ - "mobials.com" - ] - }, - "MobileAdTrading": { - "properties": [ - "mobileadtrading.com" - ], - "resources": [ - "mobileadtrading.com" - ] - }, - "Mobile Meteor": { - "properties": [ - "mobilemeteor.com" - ], - "resources": [ - "mobilemeteor.com", - "showmeinn.com" - ] - }, - "Mobile Storm": { - "properties": [ - "mobilestorm.com" - ], - "resources": [ - "mobilestorm.com" - ] - }, - "MobVision": { - "properties": [ - "admoda.com" - ], - "resources": [ - "admoda.com", - "mobvision.com" - ] - }, - "Mocean Mobile": { - "properties": [ - "moceanmobile.com" - ], - "resources": [ - "moceanmobile.com" - ] - }, - "Mochila": { - "properties": [ - "mochila.com" - ], - "resources": [ - "mochila.com" - ] - }, - "Mojiva": { - "properties": [ - "mojiva.com" - ], - "resources": [ - "mojiva.com" - ] - }, - "Monetate": { - "properties": [ - "monetate.com", - "monetate.net" - ], - "resources": [ - "monetate.com", - "monetate.net" - ] - }, - "MONETIZEdigital": { - "properties": [ - "cpalead.com" - ], - "resources": [ - "cpalead.com" - ] - }, - "Monetize More": { - "properties": [ - "monetizemore.com" - ], - "resources": [ - "monetizemore.com" - ] - }, - "Mongoose Metrics": { - "properties": [ - "mongoosemetrics.com" - ], - "resources": [ - "mongoosemetrics.com" - ] - }, - "Monitus": { - "properties": [ - "monitus.net" - ], - "resources": [ - "monitus.net" - ] - }, - "Monoloop": { - "properties": [ - "monoloop.com" - ], - "resources": [ - "monoloop.com" - ] - }, - "Monster": { - "properties": [ - "monster.com" - ], - "resources": [ - "monster.com" - ] - }, - "Moolah Media": { - "properties": [ - "moolah-media.com", - "moolahmedia.com" - ], - "resources": [ - "moolah-media.com", - "moolahmedia.com" - ] - }, - "MoPub": { - "properties": [ - "mopub.com" - ], - "resources": [ - "mopub.com" - ] - }, - "motigo": { - "properties": [ - "motigo.com" - ], - "resources": [ - "motigo.com", - "nedstatbasic.net" - ] - }, - "Mouseflow": { - "properties": [ - "mouseflow.com" - ], - "resources": [ - "mouseflow.com" - ] - }, - "MovieLush.com": { - "properties": [ - "affbuzzads.com", - "movielush.com" - ], - "resources": [ - "affbuzzads.com", - "movielush.com" - ] - }, - "Multiple Stream Media": { - "properties": [ - "adclickmedia.com", - "multiplestreammktg.com" - ], - "resources": [ - "adclickmedia.com", - "multiplestreammktg.com" - ] - }, - "MUNDO Media": { - "properties": [ - "mundomedia.com", - "silver-path.com" - ], - "resources": [ - "mundomedia.com", - "silver-path.com" - ] - }, - "MyCounter": { - "properties": [ - "mycounter.com.ua" - ], - "resources": [ - "mycounter.com.ua" - ] - }, - "MyPagerank.Net": { - "properties": [ - "mypagerank.net" - ], - "resources": [ - "mypagerank.net" - ] - }, - "MyPressPlus": { - "properties": [ - "mypressplus.com", - "ppjol.net" - ], - "resources": [ - "mypressplus.com", - "ppjol.net" - ] - }, - "Mystighty": { - "properties": [ - "mystighty.info" - ], - "resources": [ - "mystighty.info", - "sweeterge.info" - ] - }, - "myThings": { - "properties": [ - "mythings.com", - "mythingsmedia.com" - ], - "resources": [ - "mythings.com", - "mythingsmedia.com" - ] - }, - "MyWebGrocer": { - "properties": [ - "mywebgrocer.com" - ], - "resources": [ - "mywebgrocer.com" - ] - }, - "Nanigans": { - "properties": [ - "nanigans.com" - ], - "resources": [ - "nanigans.com" - ] - }, - "Narrative": { - "properties": [ - "narrative.io" - ], - "resources": [ - "narrative.io" - ] - }, - "NativeAds": { - "properties": [ - "nativeads.com" - ], - "resources": [ - "nativeads.com" - ] - }, - "Nativo": { - "properties": [ - "nativo.com", - "postrelease.com" - ], - "resources": [ - "nativo.com", - "postrelease.com" - ] - }, - "Navegg": { - "properties": [ - "navdmp.com", - "navegg.com" - ], - "resources": [ - "navdmp.com", - "navegg.com" - ] - }, - "NDN": { - "properties": [ - "newsinc.com" - ], - "resources": [ - "newsinc.com" - ] - }, - "Negishim": { - "properties": [ - "negishim.org" - ], - "resources": [ - "negishim.org" - ] - }, - "NeroHut": { - "properties": [ - "nerohut.com" - ], - "resources": [ - "nerohut.com", - "nhsrv.cf" - ] - }, - "NetAffiliation": { - "properties": [ - "netaffiliation.com" - ], - "resources": [ - "netaffiliation.com" - ] - }, - "Net Applications": { - "properties": [ - "netapplications.com" - ], - "resources": [ - "hitsprocessor.com", - "netapplications.com" - ] - }, - "NetBina": { - "properties": [ - "netbina.com" - ], - "resources": [ - "netbina.com" - ] - }, - "NetElixir": { - "properties": [ - "adelixir.com", - "netelixir.com" - ], - "resources": [ - "adelixir.com", - "netelixir.com" - ] - }, - "Netmining": { - "properties": [ - "netmining.com", - "netmng.com" - ], - "resources": [ - "netmining.com", - "netmng.com" - ] - }, - "Net-Results": { - "properties": [ - "net-results.com", - "nr7.us" - ], - "resources": [ - "cdnma.com", - "net-results.com", - "nr7.us" - ] - }, - "NetSeer": { - "properties": [ - "netseer.com" - ], - "resources": [ - "netseer.com" - ] - }, - "NetShelter": { - "properties": [ - "ziffdavistech.com" - ], - "resources": [ - "netshelter.com", - "netshelter.net", - "ziffdavistech.com" - ] - }, - "Neustar": { - "properties": [ - "adadvisor.net", - "home.neustar", - "neustar.biz" - ], - "resources": [ - "adadvisor.net", - "neustar.biz" - ] - }, - "New Relic": { - "properties": [ - "newrelic.com" - ], - "resources": [ - "newrelic.com", - "nr-data.net" - ] - }, - "NewsRight": { - "properties": [ - "apnewsregistry.com", - "newsright.com" - ], - "resources": [ - "apnewsregistry.com", - "newsright.com" - ] - }, - "newtention": { - "properties": [ - "newtention.de", - "newtention.net", - "newtentionassets.net" - ], - "resources": [ - "newtention.de", - "newtention.net", - "newtentionassets.net" - ] - }, - "Nexage": { - "properties": [ - "nexage.com" - ], - "resources": [ - "nexage.com" - ] - }, - "Nextag": { - "properties": [ - "nextag.com" - ], - "resources": [ - "nextag.com" - ] - }, - "NextPerformance": { - "properties": [ - "nextperf.com", - "nextperformance.com", - "nxtck.com" - ], - "resources": [ - "nextperf.com", - "nextperformance.com", - "nxtck.com" - ] - }, - "NextSTAT": { - "properties": [ - "nextstat.com" - ], - "resources": [ - "nextstat.com" - ] - }, - "Nielsen": { - "properties": [ - "glanceguide.com", - "imrworldwide.com", - "imrworldwide.net", - "nielsen.com" - ], - "resources": [ - "glanceguide.com", - "imrworldwide.com", - "imrworldwide.net", - "nielsen.com" - ] - }, - "Ninua": { - "properties": [ - "networkedblogs.com", - "ninua.com" - ], - "resources": [ - "networkedblogs.com", - "ninua.com" - ] - }, - "Nokta": { - "properties": [ - "noktamedya.com", - "virgul.com" - ], - "resources": [ - "noktamedya.com", - "virgul.com" - ] - }, - "NowSpots": { - "properties": [ - "nowspots.com" - ], - "resources": [ - "nowspots.com" - ] - }, - "nrelate": { - "properties": [ - "nrelate.com" - ], - "resources": [ - "nrelate.com" - ] - }, - "NuDataSecurity": { - "properties": [ - "nudatasecurity.com" - ], - "resources": [ - "nudatasecurity.com" - ] - }, - "Nuffnang": { - "properties": [ - "nuffnang.com", - "nuffnang.com.my", - "www.nuffnang.com.my" - ], - "resources": [ - "nuffnang.com", - "nuffnang.com.my", - "www.nuffnang.com.my" - ] - }, - "nugg.ad": { - "properties": [ - "nugg.ad" - ], - "resources": [ - "nugg.ad", - "nuggad.net" - ] - }, - "nurago": { - "properties": [ - "sensic.net" - ], - "resources": [ - "nurago.com", - "nurago.de", - "sensic.net" - ] - }, - "Oberon Media": { - "properties": [ - "iwin.com" - ], - "resources": [ - "blaze.com", - "iwin.com", - "oberon-media.com" - ] - }, - "Observer": { - "properties": [ - "observerapp.com" - ], - "resources": [ - "observerapp.com" - ] - }, - "Ohana Media": { - "properties": [ - "adohana.com", - "ohana-media.com", - "ohanaqb.com" - ], - "resources": [ - "adohana.com", - "ohana-media.com", - "ohanaqb.com" - ] - }, - "Omnicom Group": { - "properties": [ - "accuenmedia.com", - "omnicomgroup.com" - ], - "resources": [ - "accuenmedia.com", - "omnicomgroup.com", - "p-td.com" - ] - }, - "onAd": { - "properties": [ - "onad.eu" - ], - "resources": [ - "onad.eu" - ] - }, - "OnAudience": { - "properties": [ - "behavioralengine.com", - "onaudience.com" - ], - "resources": [ - "behavioralengine.com", - "onaudience.com" - ] - }, - "Onclusive": { - "properties": [ - "onclusive.com" - ], - "resources": [ - "airpr.com" - ] - }, - "OneAd": { - "properties": [ - "onead.com.tw" - ], - "resources": [ - "guoshipartners.com", - "onevision.com.tw" - ] - }, - "One iota": { - "properties": [ - "itsoneiota.com", - "oneiota.co.uk" - ], - "resources": [ - "itsoneiota.com", - "oneiota.co.uk" - ] - }, - "OneStat": { - "properties": [ - "onestat.com" - ], - "resources": [ - "onestat.com" - ] - }, - "Oneupweb": { - "properties": [ - "oneupweb.com", - "sodoit.com" - ], - "resources": [ - "oneupweb.com", - "sodoit.com" - ] - }, - "OnlineMetrix": { - "properties": [ - "online-metrix.net" - ], - "resources": [ - "online-metrix.net" - ] - }, - "Ooyala": { - "properties": [ - "ooyala.com" - ], - "resources": [ - "oo4.com", - "ooyala.com" - ] - }, - "Open New Media": { - "properties": [ - "onm.de" - ], - "resources": [ - "onm.de" - ] - }, - "Openstat": { - "properties": [ - "openstat.com" - ], - "resources": [ - "openstat.com", - "openstat.ru", - "spylog.com" - ] - }, - "Opentracker": { - "properties": [ - "opentracker.net" - ], - "resources": [ - "opentracker.net" - ] - }, - "OpenX": { - "properties": [ - "openx.com", - "openx.net" - ], - "resources": [ - "liftdna.com", - "openx.com", - "openx.net", - "openx.org", - "openxenterprise.com", - "servedbyopenx.com" - ] - }, - "Opera": { - "properties": [ - "opera.com" - ], - "resources": [ - "mobiletheory.com", - "opera.com" - ] - }, - "Opolen": { - "properties": [ - "opolen.com.br" - ], - "resources": [ - "opolen.com.br" - ] - }, - "OPT": { - "properties": [ - "www.opt.ne.jp" - ], - "resources": [ - "advg.jp", - "opt.ne.jp", - "p-advg.com", - "www.opt.ne.jp" - ] - }, - "Optify": { - "properties": [ - "optify.net" - ], - "resources": [ - "optify.net" - ] - }, - "Optimal": { - "properties": [ - "bn.co" - ], - "resources": [ - "cpmadvisors.com", - "cpmatic.com", - "nprove.com", - "optim.al", - "orbengine.com", - "xa.net" - ] - }, - "Optimizely": { - "properties": [ - "optimizely.com" - ], - "resources": [ - "optimizely.com" - ] - }, - "OptimumResponse": { - "properties": [ - "optimumresponse.com" - ], - "resources": [ - "optimumresponse.com" - ] - }, - "OptinMonster": { - "properties": [ - "optinmonster.com", - "optnmstr.com" - ], - "resources": [ - "optinmonster.com", - "optnmstr.com" - ] - }, - "OptMD": { - "properties": [ - "optmd.com" - ], - "resources": [ - "optmd.com" - ] - }, - "Oracle": { - "properties": [ - "oracle.com" - ], - "resources": [ - "atgsvcs.com", - "eloqua.com", - "estara.com", - "instantservice.com", - "istrack.com", - "maxymiser.com", - "oracle.com" - ] - }, - "OrangeSoda": { - "properties": [ - "orangesoda.com", - "otracking.com" - ], - "resources": [ - "orangesoda.com", - "otracking.com" - ] - }, - "Outbrain": { - "properties": [ - "outbrain.com", - "sphere.com" - ], - "resources": [ - "outbrain.com", - "sphere.com", - "visualrevenue.com" - ] - }, - "Out There Media": { - "properties": [ - "out-there-media.com" - ], - "resources": [ - "out-there-media.com" - ] - }, - "Oversee.net": { - "properties": [ - "dsnextgen.com", - "oversee.net" - ], - "resources": [ - "dsnextgen.com", - "oversee.net" - ] - }, - "ÖWA": { - "properties": [ - "oewa.at" - ], - "resources": [ - "oewa.at", - "oewabox.at" - ] - }, - "OwnerIQ": { - "properties": [ - "owneriq.com", - "owneriq.net" - ], - "resources": [ - "owneriq.com", - "owneriq.net" - ] - }, - "OxaMedia": { - "properties": [ - "oxamedia.com" - ], - "resources": [ - "adconnexa.com", - "adsbwm.com", - "oxamedia.com" - ] - }, - "PageFair": { - "properties": [ - "pagefair.com", - "pagefair.net" - ], - "resources": [ - "pagefair.com", - "pagefair.net" - ] - }, - "Paid-To-Promote.net": { - "properties": [ - "paid-to-promote.net" - ], - "resources": [ - "paid-to-promote.net" - ] - }, - "Papaya": { - "properties": [ - "papayamobile.com" - ], - "resources": [ - "papayamobile.com" - ] - }, - "Pardot": { - "properties": [ - "pardot.com" - ], - "resources": [ - "pardot.com" - ] - }, - "Parse.ly": { - "properties": [ - "parsely.com" - ], - "resources": [ - "parsely.com" - ] - }, - "PayHit": { - "properties": [ - "payhit.com" - ], - "resources": [ - "payhit.com" - ] - }, - "PaymentsMB": { - "properties": [ - "paymentsmb.com" - ], - "resources": [ - "paymentsmb.com" - ] - }, - "Paypal": { - "properties": [ - "paypal.com", - "simility.com" - ], - "resources": [ - "paypal.com", - "simility.com" - ] - }, - "Paypopup.com": { - "properties": [ - "paypopup.com" - ], - "resources": [ - "lzjl.com", - "paypopup.com" - ] - }, - "PebblePost": { - "properties": [ - "pebblepost.com" - ], - "resources": [ - "pbbl.co" - ] - }, - "Peer39": { - "properties": [ - "peer39.com", - "peer39.net" - ], - "resources": [ - "peer39.com", - "peer39.net" - ] - }, - "PeerFly": { - "properties": [ - "peerfly.com" - ], - "resources": [ - "peerfly.com" - ] - }, - "Peerius": { - "properties": [ - "peerius.com" - ], - "resources": [ - "peerius.com" - ] - }, - "Performancing": { - "properties": [ - "performancing.com" - ], - "resources": [ - "performancing.com" - ] - }, - "PerimeterX": { - "properties": [ - "perimeterx.com" - ], - "resources": [ - "perimeterx.com" - ] - }, - "PersianStat.com": { - "properties": [ - "persianstat.com" - ], - "resources": [ - "persianstat.com" - ] - }, - "Pheedo": { - "properties": [ - "pheedo.com" - ], - "resources": [ - "pheedo.com" - ] - }, - "Phonalytics": { - "properties": [ - "phonalytics.com" - ], - "resources": [ - "phonalytics.com" - ] - }, - "phpMyVisites": { - "properties": [ - "phpmyvisites.us" - ], - "resources": [ - "phpmyvisites.us" - ] - }, - "Pictela": { - "properties": [ - "pictela.com", - "pictela.net" - ], - "resources": [ - "pictela.com", - "pictela.net" - ] - }, - "PinPoll": { - "properties": [ - "pinpoll.com" - ], - "resources": [ - "pinpoll.com" - ] - }, - "Pinterest": { - "properties": [ - "pinterest.at", - "pinterest.ca", - "pinterest.ch", - "pinterest.cl", - "pinterest.co.kr", - "pinterest.co.uk", - "pinterest.com", - "pinterest.com.au", - "pinterest.com.mx", - "pinterest.de", - "pinterest.dk", - "pinterest.es", - "pinterest.fr", - "pinterest.ie", - "pinterest.jp", - "pinterest.nz", - "pinterest.pt", - "pinterest.se" - ], - "resources": [ - "pinimg.com", - "pinterest.com" - ] - }, - "Piwik": { - "properties": [ - "piwik.org" - ], - "resources": [ - "piwik.org" - ] - }, - "PixAnalytics": { - "properties": [ - "pixanalytics.com" - ], - "resources": [ - "pixanalytics.com" - ] - }, - "Pixel.sg": { - "properties": [ - "pixel.sg" - ], - "resources": [ - "pixel.sg" - ] - }, - "Piximedia": { - "properties": [ - "piximedia.com" - ], - "resources": [ - "piximedia.com" - ] - }, - "Pixlee": { - "properties": [ - "pixlee.com" - ], - "resources": [ - "pixlee.com" - ] - }, - "PLATFORM ONE": { - "properties": [ - "platform-one.co.jp", - "www.platform-one.co.jp" - ], - "resources": [ - "platform-one.co.jp", - "www.platform-one.co.jp" - ] - }, - "plista": { - "properties": [ - "plista.com" - ], - "resources": [ - "plista.com" - ] - }, - "PocketCents": { - "properties": [ - "pocketcents.com" - ], - "resources": [ - "pocketcents.com" - ] - }, - "Polar Mobile": { - "properties": [ - "mediavoice.com" - ], - "resources": [ - "mediavoice.com", - "polarmobile.com" - ] - }, - "Politads": { - "properties": [ - "politads.com" - ], - "resources": [ - "politads.com" - ] - }, - "Polymorph": { - "properties": [ - "getpolymorph.com" - ], - "resources": [ - "adsnative.com", - "getpolymorph.com" - ] - }, - "Pontiflex": { - "properties": [ - "pontiflex.com" - ], - "resources": [ - "pontiflex.com" - ] - }, - "Poool": { - "properties": [ - "poool.fr" - ], - "resources": [ - "poool.fr" - ] - }, - "PopAds": { - "properties": [ - "popads.net" - ], - "resources": [ - "popads.net", - "popadscdn.net" - ] - }, - "PopRule": { - "properties": [ - "gocampaignlive.com", - "poprule.com" - ], - "resources": [ - "gocampaignlive.com", - "poprule.com" - ] - }, - "Popunder.ru": { - "properties": [ - "popunder.ru" - ], - "resources": [ - "popunder.ru" - ] - }, - "Po.st": { - "properties": [ - "po.st" - ], - "resources": [ - "po.st" - ] - }, - "Powerlinks": { - "properties": [ - "powerlinks.com" - ], - "resources": [ - "powerlinks.com" - ] - }, - "PPCProtect": { - "properties": [ - "ppcprotect.com" - ], - "resources": [ - "ppcprotect.com" - ] - }, - "PrecisionClick": { - "properties": [ - "precisionclick.com" - ], - "resources": [ - "precisionclick.com" - ] - }, - "PredictAd": { - "properties": [ - "predictad.com" - ], - "resources": [ - "predictad.com" - ] - }, - "Pressflex": { - "properties": [ - "blogads.com", - "pressflex.com" - ], - "resources": [ - "blogads.com", - "pressflex.com" - ] - }, - "Prime Visibility": { - "properties": [ - "primevisibility.com" - ], - "resources": [ - "adcde.com", - "addlvr.com", - "adonnetwork.com", - "adonnetwork.net", - "adtrgt.com", - "bannertgt.com", - "cptgt.com", - "cpvfeed.com", - "cpvtgt.com", - "dashboardad.net", - "popcde.com", - "primevisibility.com", - "sdfje.com", - "urtbk.com" - ] - }, - "Primis": { - "properties": [ - "primis.tech" - ], - "resources": [ - "sekindo.com" - ] - }, - "PrismApp": { - "properties": [ - "prismapp.io" - ], - "resources": [ - "prismapp.io" - ] - }, - "Proclivity": { - "properties": [ - "proclivitysystems.com", - "pswec.com" - ], - "resources": [ - "proclivitymedia.com", - "proclivitysystems.com", - "pswec.com" - ] - }, - "Project Wonderful": { - "properties": [ - "projectwonderful.com" - ], - "resources": [ - "projectwonderful.com" - ] - }, - "PrometheusIntelligenceTechnology": { - "properties": [ - "prometheusintelligencetechnology.com" - ], - "resources": [ - "prometheusintelligencetechnology.com" - ] - }, - "Pronunciator": { - "properties": [ - "pronunciator.com", - "visitorville.com" - ], - "resources": [ - "pronunciator.com", - "visitorville.com" - ] - }, - "Propeller Ads": { - "properties": [ - "propellerads.com" - ], - "resources": [ - "propellerads.com" - ] - }, - "Prosperent": { - "properties": [ - "prosperent.com" - ], - "resources": [ - "prosperent.com" - ] - }, - "Protected Media": { - "properties": [ - "ad-score.com", - "protected.media" - ], - "resources": [ - "ad-score.com", - "protected.media" - ] - }, - "Provers": { - "properties": [ - "provers.pro" - ], - "resources": [ - "provers.pro" - ] - }, - "Psonstrentie": { - "properties": [ - "psonstrentie.info" - ], - "resources": [ - "psonstrentie.info" - ] - }, - "Public-Idées": { - "properties": [ - "publicidees.com" - ], - "resources": [ - "publicidees.com" - ] - }, - "Publishers Clearing House": { - "properties": [ - "pch.com" - ], - "resources": [ - "pch.com" - ] - }, - "PubMatic": { - "properties": [ - "pubmatic.com" - ], - "resources": [ - "pubmatic.com", - "revinet.com" - ] - }, - "PulsePoint": { - "properties": [ - "pulsepoint.com" - ], - "resources": [ - "pulsepoint.com" - ] - }, - "PunchTab": { - "properties": [ - "punchtab.com" - ], - "resources": [ - "punchtab.com" - ] - }, - "quadrantOne": { - "properties": [ - "quadrantone.com" - ], - "resources": [ - "quadrantone.com" - ] - }, - "Quake Marketing": { - "properties": [ - "quakemarketing.com" - ], - "resources": [ - "quakemarketing.com" - ] - }, - "Qualaroo": { - "properties": [ - "qualaroo.com" - ], - "resources": [ - "kissinsights.com", - "qualaroo.com" - ] - }, - "Quantcast": { - "properties": [ - "quantcast.com", - "quantserve.com" - ], - "resources": [ - "quantcast.com", - "quantserve.com" - ] - }, - "QuantumAdvertising": { - "properties": [ - "quantum-advertising.com" - ], - "resources": [ - "quantum-advertising.com" - ] - }, - "QuinStreet": { - "properties": [ - "quinstreet.com", - "thecounter.com" - ], - "resources": [ - "qnsr.com", - "qsstats.com", - "quinstreet.com", - "thecounter.com" - ] - }, - "Quintelligence": { - "properties": [ - "quintelligence.com" - ], - "resources": [ - "quintelligence.com" - ] - }, - "QUISMA": { - "properties": [ - "quisma.com" - ], - "resources": [ - "iaded.com", - "quisma.com", - "quismatch.com", - "xaded.com", - "xmladed.com" - ] - }, - "RadarURL": { - "properties": [ - "radarurl.com" - ], - "resources": [ - "radarurl.com" - ] - }, - "Radial": { - "properties": [ - "radial.com" - ], - "resources": [ - "gsicommerce.com", - "gsimedia.net" - ] - }, - "Radiate Media": { - "properties": [ - "gtnetwork.com.au", - "solesolution.com" - ], - "resources": [ - "gtnetwork.com.au", - "matchbin.com", - "radiatemedia.com", - "solesolution.com" - ] - }, - "RadiumOne": { - "properties": [ - "radiumone.com" - ], - "resources": [ - "gwallet.com", - "radiumone.com" - ] - }, - "Radius Marketing": { - "properties": [ - "radiusmarketing.com" - ], - "resources": [ - "radiusmarketing.com" - ] - }, - "Rambler": { - "properties": [ - "rambler.ru" - ], - "resources": [ - "rambler.ru" - ] - }, - "Rapleaf": { - "properties": [ - "rapleaf.com", - "rlcdn.com" - ], - "resources": [ - "rapleaf.com", - "rlcdn.com" - ] - }, - "ReachLocal": { - "properties": [ - "reachlocal.com", - "rlcdn.net" - ], - "resources": [ - "reachlocal.com", - "rlcdn.net" - ] - }, - "React2Media": { - "properties": [ - "react2media.com" - ], - "resources": [ - "react2media.com" - ] - }, - "reddit": { - "properties": [ - "reddit.com" - ], - "resources": [ - "reddit.com" - ] - }, - "Redux Media": { - "properties": [ - "reduxmedia.com" - ], - "resources": [ - "reduxmedia.com" - ] - }, - "Rekko": { - "properties": [ - "convertglobal.com", - "rekko.com" - ], - "resources": [ - "convertglobal.com", - "rekko.com" - ] - }, - "Reklamport": { - "properties": [ - "reklamport.com" - ], - "resources": [ - "reklamport.com" - ] - }, - "Reklam Store": { - "properties": [ - "reklamstore.com" - ], - "resources": [ - "reklamstore.com" - ] - }, - "Reklamz": { - "properties": [ - "reklamz.com" - ], - "resources": [ - "reklamz.com" - ] - }, - "Relevad": { - "properties": [ - "relestar.com", - "relevad.com" - ], - "resources": [ - "relestar.com", - "relevad.com" - ] - }, - "Renegade Internet": { - "properties": [ - "advertserve.com", - "renegadeinternet.com" - ], - "resources": [ - "advertserve.com", - "renegadeinternet.com" - ] - }, - "Reporo": { - "properties": [ - "reporo.com" - ], - "resources": [ - "buzzcity.com" - ] - }, - "Research Now": { - "properties": [ - "researchnow.com", - "valuedopinions.co.uk" - ], - "resources": [ - "researchnow.com", - "valuedopinions.co.uk" - ] - }, - "ResolutionMedia": { - "properties": [ - "nonstoppartner.net" - ], - "resources": [ - "nonstoppartner.net" - ] - }, - "Resolution Media": { - "properties": [ - "resolutionmedia.com" - ], - "resources": [ - "resolutionmedia.com" - ] - }, - "Resonate": { - "properties": [ - "resonateinsights.com", - "resonatenetworks.com" - ], - "resources": [ - "reson8.com", - "resonateinsights.com", - "resonatenetworks.com" - ] - }, - "Responsys": { - "properties": [ - "responsys.com" - ], - "resources": [ - "responsys.com" - ] - }, - "Retail Automata": { - "properties": [ - "retailautomata.com" - ], - "resources": [ - "retailautomata.com" - ] - }, - "ReTargeter": { - "properties": [ - "retargeter.com" - ], - "resources": [ - "retargeter.com" - ] - }, - "Retirement Living": { - "properties": [ - "blvdstatus.com", - "retirement-living.com" - ], - "resources": [ - "blvdstatus.com", - "retirement-living.com" - ] - }, - "RevContent": { - "properties": [ - "revcontent.com" - ], - "resources": [ - "revcontent.com" - ] - }, - "RevenueMax": { - "properties": [ - "revenuemax.de" - ], - "resources": [ - "revenuemax.de" - ] - }, - "Revtracks": { - "properties": [ - "revtrax.com" - ], - "resources": [ - "revtrax.com" - ] - }, - "Rhythm": { - "properties": [ - "rhythmone.com" - ], - "resources": [ - "1rx.io", - "rhythmnewmedia.com", - "rhythmone.com", - "rhythmxchange.com", - "rnmd.net" - ] - }, - "RichAudience": { - "properties": [ - "richaudience.com" - ], - "resources": [ - "richaudience.com" - ] - }, - "RichRelevance": { - "properties": [ - "richrelevance.com" - ], - "resources": [ - "richrelevance.com" - ] - }, - "RightAction": { - "properties": [ - "rightaction.com" - ], - "resources": [ - "rightaction.com" - ] - }, - "RIM": { - "properties": [ - "global.blackberry.com", - "laptopverge.com" - ], - "resources": [ - "global.blackberry.com", - "laptopverge.com", - "rim.com", - "scoreloop.com" - ] - }, - "Ringier": { - "properties": [ - "ringier.cz" - ], - "resources": [ - "ringier.cz" - ] - }, - "RMBN": { - "properties": [ - "traforet.com" - ], - "resources": [ - "rmbn.net", - "rmbn.ru", - "traforet.com" - ] - }, - "RMM": { - "properties": [ - "rmmonline.com" - ], - "resources": [ - "rmmonline.com" - ] - }, - "Rocket Fuel": { - "properties": [ - "rfihub.com", - "rfihub.net", - "rocketfuel.com" - ], - "resources": [ - "rfihub.com", - "rfihub.net", - "rocketfuel.com", - "ru4.com", - "xplusone.com" - ] - }, - "Rollick": { - "properties": [ - "gorollick.com" - ], - "resources": [ - "rollick.io" - ] - }, - "Rovion": { - "properties": [ - "rovion.com" - ], - "resources": [ - "rovion.com" - ] - }, - "Roxr": { - "properties": [ - "clicky.com", - "roxr.net" - ], - "resources": [ - "clicky.com", - "getclicky.com", - "roxr.net", - "staticstuff.net" - ] - }, - "rtk": { - "properties": [ - "rtk.io" - ], - "resources": [ - "rtk.io" - ] - }, - "RubiconProject": { - "properties": [ - "rubiconproject.com" - ], - "resources": [ - "adsbyisocket.com", - "isocket.com", - "rubiconproject.com" - ] - }, - "RunAds": { - "properties": [ - "runads.com" - ], - "resources": [ - "runads.com", - "rundsp.com" - ] - }, - "RuTarget": { - "properties": [ - "rutarget.ru" - ], - "resources": [ - "rutarget.ru" - ] - }, - "Sabavision": { - "properties": [ - "sabavision.com" - ], - "resources": [ - "sabavision.com" - ] - }, - "Sabre": { - "properties": [ - "reztrack.com", - "sabre.com", - "sabrehospitality.com" - ], - "resources": [ - "reztrack.com", - "sabre.com", - "sabrehospitality.com" - ] - }, - "Safecount": { - "properties": [ - "safecount.net" - ], - "resources": [ - "dl-rms.com", - "dlqm.net", - "questionmarket.com", - "safecount.net" - ] - }, - "SageMetrics": { - "properties": [ - "sagemetrics.com" - ], - "resources": [ - "sageanalyst.net", - "sagemetrics.com" - ] - }, - "Salesforce.com": { - "properties": [ - "force.com", - "salesforce.com", - "trailblazer.me" - ], - "resources": [ - "documentforce.com", - "force.com", - "forcesslreports.com", - "forceusercontent.com", - "lightning.com", - "salesforce-communities.com", - "salesforce-hub.com", - "salesforce.com", - "salesforceliveagent.com", - "trailblazer.me", - "visualforce.com" - ] - }, - "Salesintelligence": { - "properties": [ - "salesintelligence.pl" - ], - "resources": [ - "plugin.management" - ] - }, - "Samurai Factory": { - "properties": [ - "samurai-factory.jp", - "shinobi.jp" - ], - "resources": [ - "samurai-factory.jp", - "shinobi.jp" - ] - }, - "SAP": { - "properties": [ - "sap.com" - ], - "resources": [ - "sap.com", - "seewhy.com" - ] - }, - "Sapient": { - "properties": [ - "bridgetrack.com", - "sapient.com" - ], - "resources": [ - "bridgetrack.com", - "sapient.com" - ] - }, - "SAS": { - "properties": [ - "aimatch.com", - "sas.com" - ], - "resources": [ - "aimatch.com", - "sas.com" - ] - }, - "SAY": { - "properties": [ - "saymedia.com", - "typepad.com", - "videoegg.com" - ], - "resources": [ - "saymedia.com", - "typepad.com", - "videoegg.com" - ] - }, - "Scandinavian AdNetworks": { - "properties": [ - "scandinavianadnetworks.com" - ], - "resources": [ - "scandinavianadnetworks.com" - ] - }, - "ScribeFire": { - "properties": [ - "scribefire.com" - ], - "resources": [ - "scribefire.com" - ] - }, - "Scribol": { - "properties": [ - "scribol.com" - ], - "resources": [ - "scribol.com" - ] - }, - "SearchForce": { - "properties": [ - "searchforce.com", - "searchforce.net" - ], - "resources": [ - "searchforce.com", - "searchforce.net" - ] - }, - "Seevast": { - "properties": [ - "kanoodle.com" - ], - "resources": [ - "kanoodle.com", - "pulse360.com", - "seevast.com", - "syndigonetworks.com" - ] - }, - "SeeVolution": { - "properties": [ - "seevolution.com", - "svlu.net" - ], - "resources": [ - "seevolution.com", - "svlu.net" - ] - }, - "Segment.io": { - "properties": [ - "segment.io" - ], - "resources": [ - "segment.io" - ] - }, - "Selectable Media": { - "properties": [ - "selectablemedia.com" - ], - "resources": [ - "nabbr.com", - "selectablemedia.com" - ] - }, - "Semantiqo": { - "properties": [ - "semantiqo.com" - ], - "resources": [ - "semantiqo.com" - ] - }, - "Semasio": { - "properties": [ - "semasio.com" - ], - "resources": [ - "semasio.com", - "semasio.net" - ] - }, - "SendPulse": { - "properties": [ - "sendpulse.com" - ], - "resources": [ - "sendpulse.com" - ] - }, - "Service4refresh": { - "properties": [ - "service4refresh.info" - ], - "resources": [ - "service4refresh.info" - ] - }, - "SessionCam": { - "properties": [ - "sessioncam.com" - ], - "resources": [ - "sessioncam.com" - ] - }, - "SevenAds": { - "properties": [ - "sevenads.net" - ], - "resources": [ - "sevenads.net" - ] - }, - "SexInYourCity": { - "properties": [ - "sexinyourcity.com" - ], - "resources": [ - "sexinyourcity.com" - ] - }, - "ShaftTraffic": { - "properties": [ - "shafttraffic.com" - ], - "resources": [ - "libertystmedia.com", - "shafttraffic.com" - ] - }, - "Shareaholic": { - "properties": [ - "shareaholic.com" - ], - "resources": [ - "shareaholic.com" - ] - }, - "ShareASale": { - "properties": [ - "shareasale.com" - ], - "resources": [ - "shareasale.com" - ] - }, - "ShareThis": { - "properties": [ - "sharethis.com" - ], - "resources": [ - "sharethis.com" - ] - }, - "Sharethrough": { - "properties": [ - "sharethrough.com" - ], - "resources": [ - "sharethrough.com" - ] - }, - "ShinyStat": { - "properties": [ - "shinystat.com" - ], - "resources": [ - "shinystat.com" - ] - }, - "Shopzilla": { - "properties": [ - "shopzilla.com" - ], - "resources": [ - "shopzilla.com" - ] - }, - "Shortest": { - "properties": [ - "shorte.st" - ], - "resources": [ - "shorte.st" - ] - }, - "SiftScience": { - "properties": [ - "sift.com" - ], - "resources": [ - "siftscience.com" - ] - }, - "Signifyd": { - "properties": [ - "signifyd.com" - ], - "resources": [ - "signifyd.com" - ] - }, - "Silverpop": { - "properties": [ - "mkt51.net", - "silverpop.com" - ], - "resources": [ - "mkt51.net", - "pages05.net", - "silverpop.com", - "vtrenz.net" - ] - }, - "Simpli.fi": { - "properties": [ - "simpli.fi" - ], - "resources": [ - "simpli.fi" - ] - }, - "SiteScout": { - "properties": [ - "sitescout.com" - ], - "resources": [ - "sitescout.com" - ] - }, - "Six Apart": { - "properties": [ - "movabletype.com", - "sixapart.com" - ], - "resources": [ - "movabletype.com", - "sixapart.com" - ] - }, - "Skimlinks": { - "properties": [ - "skimlinks.com", - "skimresources.com" - ], - "resources": [ - "skimlinks.com", - "skimresources.com" - ] - }, - "Skribit": { - "properties": [ - "paulstamatiou.com" - ], - "resources": [ - "paulstamatiou.com", - "skribit.com" - ] - }, - "Skupe Net": { - "properties": [ - "adcentriconline.com", - "skupenet.com" - ], - "resources": [ - "adcentriconline.com", - "skupenet.com" - ] - }, - "Smaato": { - "properties": [ - "smaato.com" - ], - "resources": [ - "smaato.com" - ] - }, - "SmartAdServer": { - "properties": [ - "smartadserver.com" - ], - "resources": [ - "smartadserver.com" - ] - }, - "Smartlook": { - "properties": [ - "smartlook.com" - ], - "resources": [ - "smartlook.com" - ] - }, - "SmartyAds": { - "properties": [ - "smartyads.com" - ], - "resources": [ - "smartyads.com" - ] - }, - "Smi": { - "properties": [ - "24smi.net" - ], - "resources": [ - "24smi.net" - ] - }, - "Smiley Media": { - "properties": [ - "smileymedia.com" - ], - "resources": [ - "smileymedia.com" - ] - }, - "Smowtion": { - "properties": [ - "smowtion.com" - ], - "resources": [ - "smowtion.com" - ] - }, - "Snap": { - "properties": [ - "snap.com" - ], - "resources": [ - "snap.com" - ] - }, - "SnapEngage": { - "properties": [ - "snapengage.com" - ], - "resources": [ - "snapengage.com" - ] - }, - "Snoobi": { - "properties": [ - "snoobi.fi" - ], - "resources": [ - "snoobi.com", - "snoobi.fi" - ] - }, - "SocialChorus": { - "properties": [ - "socialchorus.com" - ], - "resources": [ - "halogenmediagroup.com", - "halogennetwork.com", - "socialchorus.com" - ] - }, - "SocialInterface": { - "properties": [ - "socialinterface.com" - ], - "resources": [ - "ratevoice.com", - "socialinterface.com" - ] - }, - "SocialTwist": { - "properties": [ - "socialtwist.com" - ], - "resources": [ - "socialtwist.com" - ] - }, - "sociomantic labs": { - "properties": [ - "sociomantic.com" - ], - "resources": [ - "sociomantic.com" - ] - }, - "Socital": { - "properties": [ - "socital.com" - ], - "resources": [ - "socital.com" - ] - }, - "Sojern": { - "properties": [ - "sojern.com" - ], - "resources": [ - "sojern.com" - ] - }, - "SomoAudience": { - "properties": [ - "somoaudience.com" - ], - "resources": [ - "somoaudience.com" - ] - }, - "Sonobi": { - "properties": [ - "sonobi.com" - ], - "resources": [ - "sonobi.com" - ] - }, - "sophus3": { - "properties": [ - "sophus3.com" - ], - "resources": [ - "sophus3.co.uk", - "sophus3.com" - ] - }, - "Sortable": { - "properties": [ - "sortable.com" - ], - "resources": [ - "deployads.com" - ] - }, - "Sourcepoint": { - "properties": [ - "sourcepoint.com" - ], - "resources": [ - "summerhamster.com" - ] - }, - "Sovrn": { - "properties": [ - "sovrn.com" - ], - "resources": [ - "sovrn.com" - ] - }, - "Space Chimp Media": { - "properties": [ - "spacechimpmedia.com" - ], - "resources": [ - "spacechimpmedia.com" - ] - }, - "SpareChange": { - "properties": [ - "sparechange.io" - ], - "resources": [ - "sparechange.io" - ] - }, - "Sparklit": { - "properties": [ - "adbutler.com", - "sparklit.com" - ], - "resources": [ - "adbutler.com", - "sparklit.com" - ] - }, - "Spark Studios": { - "properties": [ - "sparkstudios.com" - ], - "resources": [ - "sparkstudios.com" - ] - }, - "Specific Media": { - "properties": [ - "sitemeter.com", - "specificmedia.com" - ], - "resources": [ - "adviva.co.uk", - "adviva.net", - "sitemeter.com", - "specificclick.net", - "specificmedia.com" - ] - }, - "Spectate": { - "properties": [ - "spectate.com" - ], - "resources": [ - "spectate.com" - ] - }, - "Sponge": { - "properties": [ - "spongegroup.com" - ], - "resources": [ - "spongegroup.com" - ] - }, - "Spongecell": { - "properties": [ - "spongecell.com" - ], - "resources": [ - "spongecell.com" - ] - }, - "SponsorAds": { - "properties": [ - "sponsorads.de" - ], - "resources": [ - "sponsorads.de" - ] - }, - "Spot200": { - "properties": [ - "spot200.com" - ], - "resources": [ - "spot200.com" - ] - }, - "SpotX": { - "properties": [ - "spotx.tv" - ], - "resources": [ - "spotx.tv" - ] - }, - "SpotXchange": { - "properties": [ - "spotxchange.com" - ], - "resources": [ - "spotxcdn.com", - "spotxchange.com" - ] - }, - "Spring Metrics": { - "properties": [ - "springmetrics.com" - ], - "resources": [ - "springmetrics.com" - ] - }, - "SpringServe": { - "properties": [ - "springserve.com" - ], - "resources": [ - "springserve.com" - ] - }, - "Sputnik.ru": { - "properties": [ - "sputnik.ru" - ], - "resources": [ - "sputnik.ru" - ] - }, - "StackAdapt": { - "properties": [ - "stackadapt.com" - ], - "resources": [ - "stackadapt.com" - ] - }, - "StackTrack": { - "properties": [ - "stat-track.com" - ], - "resources": [ - "stat-track.com" - ] - }, - "StarGames": { - "properties": [ - "stargames.net", - "stargamesaffiliate.com" - ], - "resources": [ - "stargames.net", - "stargamesaffiliate.com" - ] - }, - "stat4u": { - "properties": [ - "4u.pl" - ], - "resources": [ - "4u.pl" - ] - }, - "StatCounter": { - "properties": [ - "statcounter.com" - ], - "resources": [ - "statcounter.com" - ] - }, - "Statisfy": { - "properties": [ - "statisfy.net" - ], - "resources": [ - "statisfy.net" - ] - }, - "STATSIT": { - "properties": [ - "statsit.com" - ], - "resources": [ - "statsit.com" - ] - }, - "SteelHouse": { - "properties": [ - "steelhouse.com", - "steelhousemedia.com" - ], - "resources": [ - "steelhouse.com", - "steelhousemedia.com" - ] - }, - "Storeland": { - "properties": [ - "storeland.ru" - ], - "resources": [ - "storeland.ru" - ] - }, - "Storygize": { - "properties": [ - "storygize.com" - ], - "resources": [ - "storygize.com", - "storygize.net" - ] - }, - "Stratigent": { - "properties": [ - "stratigent.com" - ], - "resources": [ - "stratigent.com" - ] - }, - "Streamray": { - "properties": [ - "cams.com", - "streamray.com" - ], - "resources": [ - "cams.com", - "streamray.com" - ] - }, - "StrikeAd": { - "properties": [ - "strikead.com" - ], - "resources": [ - "strikead.com" - ] - }, - "Stripe": { - "properties": [ - "stripe.com" - ], - "resources": [ - "stripe.network" - ] - }, - "StrongMail": { - "properties": [ - "strongmail.com" - ], - "resources": [ - "popularmedia.com", - "strongmail.com" - ] - }, - "Struq": { - "properties": [ - "struq.com" - ], - "resources": [ - "struq.com" - ] - }, - "StumbleUpon": { - "properties": [ - "stumbleupon.com" - ], - "resources": [ - "stumble-upon.com", - "stumbleupon.com" - ] - }, - "Sublime Skinz": { - "properties": [ - "sublime.xyz" - ], - "resources": [ - "ayads.co", - "sublime.xyz" - ] - }, - "Suite 66": { - "properties": [ - "suite66.com" - ], - "resources": [ - "suite66.com" - ] - }, - "Summit": { - "properties": [ - "summitmedia.co.uk", - "www.summit.co.uk" - ], - "resources": [ - "summitmedia.co.uk", - "www.summit.co.uk" - ] - }, - "Superfish": { - "properties": [ - "superfish.com" - ], - "resources": [ - "superfish.com" - ] - }, - "SupersonicAds": { - "properties": [ - "supersonicads.com" - ], - "resources": [ - "supersonicads.com" - ] - }, - "Survata": { - "properties": [ - "survata.com" - ], - "resources": [ - "survata.com" - ] - }, - "SwiftMining": { - "properties": [ - "swiftmining.win" - ], - "resources": [ - "swiftmining.win" - ] - }, - "Switch": { - "properties": [ - "switchadhub.com", - "switchconcepts.com" - ], - "resources": [ - "switchadhub.com", - "switchads.com", - "switchconcepts.co.uk", - "switchconcepts.com" - ] - }, - "Swoop": { - "properties": [ - "swoop.com" - ], - "resources": [ - "swoop.com" - ] - }, - "SymphonyAM": { - "properties": [ - "factortg.com" - ], - "resources": [ - "factortg.com" - ] - }, - "Synacor": { - "properties": [ - "synacor.com" - ], - "resources": [ - "synacor.com" - ] - }, - "Syncapse": { - "properties": [ - "clickable.net", - "syncapse.com" - ], - "resources": [ - "clickable.net", - "syncapse.com" - ] - }, - "Syrup Ad": { - "properties": [ - "adotsolution.com" - ], - "resources": [ - "adotsolution.com" - ] - }, - "Taboola": { - "properties": [ - "taboola.com" - ], - "resources": [ - "perfectmarket.com", - "taboola.com" - ] - }, - "Tailsweep": { - "properties": [ - "tailsweep.com" - ], - "resources": [ - "tailsweep.com" - ] - }, - "Taleria": { - "properties": [ - "telaria.com" - ], - "resources": [ - "freeskreen.com" - ] - }, - "Tapad": { - "properties": [ - "tapad.com" - ], - "resources": [ - "tapad.com" - ] - }, - "Tapgage": { - "properties": [ - "bizmey.com", - "tapgage.com" - ], - "resources": [ - "bizmey.com", - "tapgage.com" - ] - }, - "TapIt!": { - "properties": [ - "tapit.com" - ], - "resources": [ - "tapit.com" - ] - }, - "Tap.me": { - "properties": [ - "tap.me" - ], - "resources": [ - "tap.me" - ] - }, - "Targetix": { - "properties": [ - "targetix.net" - ], - "resources": [ - "targetix.net" - ] - }, - "Tatto Media": { - "properties": [ - "tattomedia.com" - ], - "resources": [ - "quicknoodles.com", - "tattomedia.com" - ] - }, - "Teadma": { - "properties": [ - "teadma.com" - ], - "resources": [ - "teadma.com" - ] - }, - "Teads.tv": { - "properties": [ - "teads.tv" - ], - "resources": [ - "teads.tv" - ] - }, - "Tealium": { - "properties": [ - "tealium.com" - ], - "resources": [ - "tealiumiq.com" - ] - }, - "Technorati": { - "properties": [ - "technorati.com" - ], - "resources": [ - "technorati.com", - "technoratimedia.com" - ] - }, - "TechSolutions": { - "properties": [ - "techsolutions.com.tw" - ], - "resources": [ - "techsolutions.com.tw" - ] - }, - "TellApart": { - "properties": [ - "tellapart.com", - "tellapt.com" - ], - "resources": [ - "tellapart.com", - "tellapt.com" - ] - }, - "Telstra": { - "properties": [ - "sensis.com.au", - "sensisdata.com.au", - "telstra.com.au" - ], - "resources": [ - "sensis.com.au", - "sensisdata.com.au", - "sensisdigitalmedia.com.au", - "telstra.com.au" - ] - }, - "TENSQUARE": { - "properties": [ - "tensquare.com" - ], - "resources": [ - "tensquare.com" - ] - }, - "Terra": { - "properties": [ - "eztargetmedia.com", - "terra.com.br", - "www.terra.com.br" - ], - "resources": [ - "eztargetmedia.com", - "terra.com.br", - "www.terra.com.br" - ] - }, - "The Heron Partnership": { - "properties": [ - "marinsm.com" - ], - "resources": [ - "heronpartners.com.au", - "marinsm.com", - "marinsoftware.com" - ] - }, - "The Numa Group": { - "properties": [ - "hittail.com", - "thenumagroup.com" - ], - "resources": [ - "hittail.com", - "thenumagroup.com" - ] - }, - "The Search Agency": { - "properties": [ - "thesearchagency.com" - ], - "resources": [ - "thesearchagency.com", - "thesearchagency.net" - ] - }, - "The Trade Desk": { - "properties": [ - "thetradedesk.com" - ], - "resources": [ - "adsrvr.org", - "thetradedesk.com" - ] - }, - "ThingLink": { - "properties": [ - "thinglink.com" - ], - "resources": [ - "thinglink.com" - ] - }, - "Think Realtime": { - "properties": [ - "echosearch.com", - "thinkrealtime.com" - ], - "resources": [ - "echosearch.com", - "esm1.net", - "thinkrealtime.com" - ] - }, - "Thismoment": { - "properties": [ - "thismoment.com" - ], - "resources": [ - "thismoment.com" - ] - }, - "Thummit": { - "properties": [ - "thummit.com" - ], - "resources": [ - "thummit.com" - ] - }, - "Tinder": { - "properties": [ - "carbonads.com", - "tinder.com" - ], - "resources": [ - "carbonads.com", - "tinder.com" - ] - }, - "TiqIQ": { - "properties": [ - "tiqiq.com" - ], - "resources": [ - "tiqiq.com" - ] - }, - "Tisoomi": { - "properties": [ - "adternal.com", - "tisoomi.com" - ], - "resources": [ - "adternal.com", - "tisoomi.com" - ] - }, - "TLVMedia": { - "properties": [ - "tlvmedia.com" - ], - "resources": [ - "tlvmedia.com" - ] - }, - "TNS": { - "properties": [ - "statistik-gallup.net", - "tns-counter.ru", - "tns-cs.net", - "tnsglobal.com" - ], - "resources": [ - "sesamestats.com", - "statistik-gallup.net", - "tns-counter.ru", - "tns-cs.net", - "tnsglobal.com" - ] - }, - "Todacell": { - "properties": [ - "todacell.com" - ], - "resources": [ - "todacell.com" - ] - }, - "ToneFuse": { - "properties": [ - "tonefuse.com" - ], - "resources": [ - "tonefuse.com" - ] - }, - "ToneMedia": { - "properties": [ - "clickfuse.com" - ], - "resources": [ - "clickfuse.com", - "tonemedia.com" - ] - }, - "tongdun.cn": { - "properties": [ - "tongdun.cn" - ], - "resources": [ - "fraudmetrix.cn", - "tongdun.net" - ] - }, - "Topsy": { - "properties": [ - "topsy.com" - ], - "resources": [ - "topsy.com" - ] - }, - "TouchCommerce": { - "properties": [ - "nuance.com" - ], - "resources": [ - "inq.com", - "nuance.com", - "touchcommerce.com" - ] - }, - "TraceMyIP.org": { - "properties": [ - "tracemyip.org" - ], - "resources": [ - "tracemyip.org" - ] - }, - "TrackingSoft": { - "properties": [ - "roia.biz", - "trackingsoft.com" - ], - "resources": [ - "roia.biz", - "trackingsoft.com" - ] - }, - "Trackset": { - "properties": [ - "trackset.com" - ], - "resources": [ - "trackset.com" - ] - }, - "Tradedoubler": { - "properties": [ - "tradedoubler.com" - ], - "resources": [ - "tradedoubler.com" - ] - }, - "TradeTracker": { - "properties": [ - "tradetracker.com" - ], - "resources": [ - "tradetracker.com", - "tradetracker.net" - ] - }, - "TrafficHaus": { - "properties": [ - "traffichaus.com", - "traffichouse.com" - ], - "resources": [ - "traffichaus.com", - "traffichouse.com" - ] - }, - "TrafficRevenue": { - "properties": [ - "trafficrevenue.net" - ], - "resources": [ - "trafficrevenue.net" - ] - }, - "TrafficScore": { - "properties": [ - "trafficscore.com" - ], - "resources": [ - "trafficscore.com" - ] - }, - "Traffiq": { - "properties": [ - "traffiq.com" - ], - "resources": [ - "traffiq.com" - ] - }, - "Trafmag": { - "properties": [ - "trafmag.com" - ], - "resources": [ - "trafmag.com" - ] - }, - "Traverse": { - "properties": [ - "traversedata.com" - ], - "resources": [ - "traversedlp.com" - ] - }, - "Travora Media": { - "properties": [ - "travoramedia.com" - ], - "resources": [ - "traveladnetwork.com", - "traveladvertising.com", - "travoramedia.com" - ] - }, - "Tremor Video": { - "properties": [ - "tremorvideo.com" - ], - "resources": [ - "scanscout.com", - "tmnetads.com", - "tremorhub.com", - "tremormedia.com", - "tremorvideo.com" - ] - }, - "Triggit": { - "properties": [ - "triggit.com" - ], - "resources": [ - "triggit.com" - ] - }, - "TripleLift": { - "properties": [ - "triplelift.com" - ], - "resources": [ - "3lift.com", - "triplelift.com" - ] - }, - "Trovus": { - "properties": [ - "trovus.co.uk", - "www.trovus.co.uk" - ], - "resources": [ - "trovus.co.uk", - "www.trovus.co.uk" - ] - }, - "TruEffect": { - "properties": [ - "adlegend.com", - "trueffect.com" - ], - "resources": [ - "adlegend.com", - "trueffect.com" - ] - }, - "Trumba": { - "properties": [ - "trumba.com" - ], - "resources": [ - "trumba.com" - ] - }, - "TRUSTe": { - "properties": [ - "truste.com" - ], - "resources": [ - "truste.com" - ] - }, - "TrustX": { - "properties": [ - "trustx.org" - ], - "resources": [ - "trustx.org" - ] - }, - "TubeMogul": { - "properties": [ - "tmogul.com", - "tubemogul.com" - ], - "resources": [ - "tmogul.com", - "tubemogul.com" - ] - }, - "TurnTo": { - "properties": [ - "turntonetworks.com" - ], - "resources": [ - "turnto.com", - "turntonetworks.com" - ] - }, - "Tweetboard": { - "properties": [ - "tweetboard.com" - ], - "resources": [ - "tweetboard.com" - ] - }, - "Twelvefold": { - "properties": [ - "buzzlogic.com", - "twelvefold.com" - ], - "resources": [ - "buzzlogic.com", - "twelvefold.com" - ] - }, - "Twitter": { - "properties": [ - "digits.com", - "fabric.io", - "tweetdeck.com", - "twitter.com", - "twitter.jp" - ], - "resources": [ - "ads-twitter.com", - "fabric.io", - "tweetdeck.com", - "twimg.com", - "twitter.com", - "twitter.jp" - ] - }, - "Twitter Counter": { - "properties": [ - "twittercounter.com" - ], - "resources": [ - "twittercounter.com" - ] - }, - "Twyn Group": { - "properties": [ - "twyn-group.com", - "twyn.com" - ], - "resources": [ - "twyn-group.com", - "twyn.com" - ] - }, - "Tyroo": { - "properties": [ - "tyroo.com" - ], - "resources": [ - "tyroo.com" - ] - }, - "UberMedia": { - "properties": [ - "tweetup.com", - "ubermedia.com" - ], - "resources": [ - "tweetup.com", - "ubermedia.com" - ] - }, - "UberTags": { - "properties": [ - "ubertags.com" - ], - "resources": [ - "ubertags.com" - ] - }, - "ucfunnel": { - "properties": [ - "ucfunnel.com" - ], - "resources": [ - "aralego.com", - "ucfunnel.com" - ] - }, - "uCoz": { - "properties": [ - "ucoz.ae", - "ucoz.com", - "ucoz.fr", - "ucoz.net", - "ucoz.ru" - ], - "resources": [ - "ucoz.ae", - "ucoz.br", - "ucoz.com", - "ucoz.du", - "ucoz.fr", - "ucoz.net", - "ucoz.ru" - ] - }, - "Umbel": { - "properties": [ - "umbel.com" - ], - "resources": [ - "umbel.com" - ] - }, - "Unanimis": { - "properties": [ - "unanimis.co.uk", - "www.unanimis.co.uk" - ], - "resources": [ - "unanimis.co.uk", - "www.unanimis.co.uk" - ] - }, - "Unbounce": { - "properties": [ - "unbounce.com" - ], - "resources": [ - "unbounce.com" - ] - }, - "Underdog Media": { - "properties": [ - "udmserve.net", - "underdogmedia.com" - ], - "resources": [ - "udmserve.net", - "underdogmedia.com" - ] - }, - "Undertone": { - "properties": [ - "undertone.com", - "undertonevideo.com" - ], - "resources": [ - "undertone.com", - "undertonenetworks.com", - "undertonevideo.com" - ] - }, - "UniQlick": { - "properties": [ - "51network.com", - "uniqlick.com", - "wanmo.com" - ], - "resources": [ - "51network.com", - "uniqlick.com", - "wanmo.com" - ] - }, - "Unruly": { - "properties": [ - "unruly.co" - ], - "resources": [ - "unrulymedia.com" - ] - }, - "Upland": { - "properties": [ - "uplandsoftware.com" - ], - "resources": [ - "leadlander.com", - "sf14g.com", - "trackalyzer.com", - "uplandsoftware.com" - ] - }, - "Uptrends": { - "properties": [ - "uptrends.com" - ], - "resources": [ - "uptrends.com" - ] - }, - "up-value": { - "properties": [ - "up-value.de" - ], - "resources": [ - "up-value.de" - ] - }, - "Usability Sciences": { - "properties": [ - "usabilitysciences.com" - ], - "resources": [ - "usabilitysciences.com", - "webiqonline.com" - ] - }, - "User Local": { - "properties": [ - "nakanohito.jp" - ], - "resources": [ - "nakanohito.jp" - ] - }, - "UserVoice": { - "properties": [ - "uservoice.com" - ], - "resources": [ - "uservoice.com" - ] - }, - "V12 Data": { - "properties": [ - "v12group.com" - ], - "resources": [ - "v12data.com", - "v12group.com" - ] - }, - "Value Ad": { - "properties": [ - "valuead.com" - ], - "resources": [ - "valuead.com" - ] - }, - "Various": { - "properties": [ - "amigos.com", - "getiton.com", - "medley.com", - "nostringsattached.com", - "various.com" - ], - "resources": [ - "amigos.com", - "getiton.com", - "medley.com", - "nostringsattached.com", - "various.com" - ] - }, - "Vdopia": { - "properties": [ - "ivdopia.com", - "vdopia.com" - ], - "resources": [ - "ivdopia.com", - "vdopia.com" - ] - }, - "Veeseo": { - "properties": [ - "veeseo.com" - ], - "resources": [ - "veeseo.com" - ] - }, - "Velocity Media": { - "properties": [ - "adsvelocity.com" - ], - "resources": [ - "adsvelocity.com" - ] - }, - "Velti": { - "properties": [ - "mobclix.com", - "velti.com" - ], - "resources": [ - "mobclix.com", - "velti.com" - ] - }, - "Vemba": { - "properties": [ - "vemba.com" - ], - "resources": [ - "vemba.com" - ] - }, - "Venatus Media": { - "properties": [ - "venatusmedia.com" - ], - "resources": [ - "venatusmedia.com" - ] - }, - "Vendemore": { - "properties": [ - "vendemore.com" - ], - "resources": [ - "vendemore.com" - ] - }, - "Vendio": { - "properties": [ - "singlefeed.com", - "vendio.com" - ], - "resources": [ - "singlefeed.com", - "vendio.com" - ] - }, - "Veoxa": { - "properties": [ - "veoxa.com" - ], - "resources": [ - "veoxa.com" - ] - }, - "Veremedia": { - "properties": [ - "veremedia.com" - ], - "resources": [ - "veremedia.com" - ] - }, - "Vertical Acuity": { - "properties": [ - "verticalacuity.com" - ], - "resources": [ - "verticalacuity.com" - ] - }, - "VerticalHealth": { - "properties": [ - "verticalhealth.com" - ], - "resources": [ - "verticalhealth.net" - ] - }, - "VerticalResponse": { - "properties": [ - "verticalresponse.com", - "vresp.com" - ], - "resources": [ - "verticalresponse.com", - "vresp.com" - ] - }, - "Vertster": { - "properties": [ - "vertster.com" - ], - "resources": [ - "vertster.com" - ] - }, - "VG WORT": { - "properties": [ - "vgwort.de" - ], - "resources": [ - "vgwort.de" - ] - }, - "Vibrant Media": { - "properties": [ - "vibrantmedia.com" - ], - "resources": [ - "intellitxt.com", - "picadmedia.com", - "vibrantmedia.com" - ] - }, - "VideoIntelligence": { - "properties": [ - "vi.ai" - ], - "resources": [ - "vi.ai" - ] - }, - "Videology": { - "properties": [ - "tidaltv.com", - "videologygroup.com" - ], - "resources": [ - "tidaltv.com", - "videologygroup.com" - ] - }, - "Viewbix": { - "properties": [ - "qoof.com", - "viewbix.com" - ], - "resources": [ - "qoof.com", - "viewbix.com" - ] - }, - "VigLink": { - "properties": [ - "viglink.com" - ], - "resources": [ - "viglink.com" - ] - }, - "Vimeo": { - "properties": [ - "vimeo.com", - "vimeocdn.com" - ], - "resources": [ - "vimeo.com", - "vimeocdn.com" - ] - }, - "VINDICO": { - "properties": [ - "vindicogroup.com", - "vindicosuite.com" - ], - "resources": [ - "vindicogroup.com", - "vindicosuite.com" - ] - }, - "VisibleBrands": { - "properties": [ - "visbrands.com" - ], - "resources": [ - "visbrands.com" - ] - }, - "Visible Measures": { - "properties": [ - "visiblemeasures.com" - ], - "resources": [ - "viewablemedia.net", - "visiblemeasures.com" - ] - }, - "VisiStat": { - "properties": [ - "id.kickfire.com", - "sa-as.com" - ], - "resources": [ - "d.kickfire.com", - "sa-as.com", - "visistat.com" - ] - }, - "Visit Streamer": { - "properties": [ - "visitstreamer.com" - ], - "resources": [ - "visitstreamer.com" - ] - }, - "vistrac": { - "properties": [ - "vistrac.com" - ], - "resources": [ - "vistrac.com" - ] - }, - "VisualDNA": { - "properties": [ - "vdna-assets.com", - "visualdna-stats.com", - "visualdna.com" - ], - "resources": [ - "vdna-assets.com", - "visualdna-stats.com", - "visualdna.com" - ] - }, - "ViziSense": { - "properties": [ - "vizisense.com", - "vizisense.net" - ], - "resources": [ - "vizisense.com", - "vizisense.net" - ] - }, - "Vizu": { - "properties": [ - "vizu.com" - ], - "resources": [ - "vizu.com" - ] - }, - "Vizury": { - "properties": [ - "vizury.com" - ], - "resources": [ - "vizury.com" - ] - }, - "VKontakte": { - "properties": [ - "vk.com" - ], - "resources": [ - "userapi.com", - "vk.com", - "vkontakte.ru" - ] - }, - "Voice2Page": { - "properties": [ - "voice2page.com" - ], - "resources": [ - "voice2page.com" - ] - }, - "Vserv": { - "properties": [ - "vserv.com", - "vserv.mobi" - ], - "resources": [ - "vserv.com", - "vserv.mobi" - ] - }, - "Vuble": { - "properties": [ - "vuble.tv" - ], - "resources": [ - "mediabong.com" - ] - }, - "Wahoha": { - "properties": [ - "contentwidgets.net", - "wahoha.com" - ], - "resources": [ - "contentwidgets.net", - "wahoha.com" - ] - }, - "Wayfair": { - "properties": [ - "wayfair.com" - ], - "resources": [ - "wayfair.com" - ] - }, - "WebAds": { - "properties": [ - "webads.co.uk", - "www.webads.co.uk" - ], - "resources": [ - "webads.co.uk", - "www.webads.co.uk" - ] - }, - "Webclicktracker": { - "properties": [ - "webclicktracker.com" - ], - "resources": [ - "webclicktracker.com" - ] - }, - "Web.com": { - "properties": [ - "feedperfect.com", - "web.com" - ], - "resources": [ - "feedperfect.com", - "web.com" - ] - }, - "WebGozar.com": { - "properties": [ - "webgozar.com", - "webgozar.ir" - ], - "resources": [ - "webgozar.com", - "webgozar.ir" - ] - }, - "Webmecanik": { - "properties": [ - "webmecanik.com" - ], - "resources": [ - "webmecanik.com" - ] - }, - "WebMetro": { - "properties": [ - "dsmmadvantage.com", - "revanadigital.com" - ], - "resources": [ - "dsmmadvantage.com", - "revanadigital.com", - "webmetro.com" - ] - }, - "Webmine": { - "properties": [ - "webmine.cz" - ], - "resources": [ - "authedwebmine.cz", - "webmine.cz" - ] - }, - "WebminePool": { - "properties": [ - "webminepool.com" - ], - "resources": [ - "webminepool.com" - ] - }, - "Webmining": { - "properties": [ - "webmining.co" - ], - "resources": [ - "webmining.co" - ] - }, - "Weborama": { - "properties": [ - "weborama.com" - ], - "resources": [ - "weborama.com", - "weborama.fr" - ] - }, - "WebsiteAlive": { - "properties": [ - "websitealive.com", - "websitealive0.com", - "websitealive1.com", - "websitealive2.com", - "websitealive3.com", - "websitealive4.com", - "websitealive5.com", - "websitealive6.com", - "websitealive7.com", - "websitealive8.com", - "websitealive9.com" - ], - "resources": [ - "websitealive.com" - ] - }, - "Web Stats": { - "properties": [ - "onlinewebstats.com" - ], - "resources": [ - "onlinewebstats.com" - ] - }, - "Web Tracking Services": { - "properties": [ - "web-stat.com", - "webtrackingservices.com" - ], - "resources": [ - "web-stat.com", - "webtrackingservices.com" - ] - }, - "Webtraffic": { - "properties": [ - "webtraffic.no", - "webtraffic.se" - ], - "resources": [ - "webtraffic.no", - "webtraffic.se" - ] - }, - "Web Traxs": { - "properties": [ - "webtraxs.com" - ], - "resources": [ - "webtraxs.com" - ] - }, - "Webtrekk": { - "properties": [ - "webtrekk.com", - "webtrekk.net" - ], - "resources": [ - "webtrekk.com", - "webtrekk.net" - ] - }, - "Webtrends": { - "properties": [ - "webtrends.com" - ], - "resources": [ - "reinvigorate.net", - "webtrends.com", - "webtrendslive.com" - ] - }, - "White Ops": { - "properties": [ - "adzmath.com", - "whiteops.com" - ], - "resources": [ - "adzmath.com", - "whiteops.com" - ] - }, - "whos.amung.us": { - "properties": [ - "amung.us" - ], - "resources": [ - "amung.us" - ] - }, - "WideOrbit": { - "properties": [ - "wideorbit.com" - ], - "resources": [ - "dep-x.com" - ] - }, - "Wingify": { - "properties": [ - "vwo.com", - "wingify.com" - ], - "resources": [ - "visualwebsiteoptimizer.com", - "vwo.com", - "wingify.com" - ] - }, - "WiredMinds": { - "properties": [ - "wiredminds.de" - ], - "resources": [ - "wiredminds.com", - "wiredminds.de" - ] - }, - "Wishabi": { - "properties": [ - "wishabi.com", - "wishabi.net" - ], - "resources": [ - "flipp.com", - "wishabi.com", - "wishabi.net" - ] - }, - "Woopra": { - "properties": [ - "woopra-ns.com", - "woopra.com" - ], - "resources": [ - "woopra-ns.com", - "woopra.com" - ] - }, - "WordStream": { - "properties": [ - "wordstream.com" - ], - "resources": [ - "wordstream.com" - ] - }, - "WOW Analytics": { - "properties": [ - "wowanalytics.co.uk" - ], - "resources": [ - "wowanalytics.co.uk" - ] - }, - "WPP": { - "properties": [ - "compete.com", - "decdna.net", - "groupm.com", - "kantarmedia.com", - "mecglobal.com", - "mindshareworld.com", - "themig.com", - "wpp.com", - "xaxis.com" - ], - "resources": [ - "247realmedia.com", - "accelerator-media.com", - "acceleratorusa.com", - "compete.com", - "decdna.net", - "decideinteractive.com", - "gmads.net", - "groupm.com", - "kantarmedia.com", - "mecglobal.com", - "mindshare.nl", - "mindshareworld.com", - "mookie1.com", - "pm14.com", - "realmedia.com", - "targ.ad", - "themig.com", - "wpp.com", - "xaxis.com" - ] - }, - "Wysistat": { - "properties": [ - "wysistat.net" - ], - "resources": [ - "wysistat.com", - "wysistat.net" - ] - }, - "xAd": { - "properties": [ - "xad.com" - ], - "resources": [ - "xad.com" - ] - }, - "Xertive Media": { - "properties": [ - "xertivemedia.com" - ], - "resources": [ - "admanager-xertive.com", - "xertivemedia.com" - ] - }, - "xplosion interactive": { - "properties": [ - "xplosion.de" - ], - "resources": [ - "xplosion.de" - ] - }, - "Xrost DS": { - "properties": [ - "adplan-ds.com" - ], - "resources": [ - "adplan-ds.com" - ] - }, - "Yabuka": { - "properties": [ - "yabuka.com" - ], - "resources": [ - "yabuka.com" - ] - }, - "Yahoo!": { - "properties": [ - "flickr.com", - "flurry.com", - "tumblr.com", - "yahoo.co.jp", - "yahoo.com", - "yahoostudios.com", - "yuilibrary.com" - ], - "resources": [ - "adinterax.com", - "adrevolver.com", - "bluelithium.com", - "dapper.net", - "flickr.com", - "flurry.com", - "interclick.com", - "luminate.com", - "mybloglog.com", - "overture.com", - "pixazza.com", - "rightmedia.com", - "rmxads.com", - "rocketmail.com", - "secure-adserver.com", - "staticflickr.com", - "tumblr.com", - "yahoo.co.jp", - "yahoo.com", - "yahooapis.com", - "yahooapis.jp", - "yahoofs.com", - "yieldmanager.com", - "yieldmanager.net", - "yimg.com", - "yimg.jp", - "yldmgrimg.net", - "ymail.com", - "yuilibrary.com", - "zenfs.com" - ] - }, - "Yandex": { - "properties": [ - "kinopoisk.ru", - "moikrug.ru", - "yadi.sk", - "yandex.by", - "yandex.com", - "yandex.com.tr", - "yandex.ru", - "yandex.st", - "yandex.ua" - ], - "resources": [ - "api-maps.yandex.ru", - "moikrug.ru", - "web-visor.com", - "yandex.by", - "yandex.com", - "yandex.com.tr", - "yandex.ru", - "yandex.st", - "yandex.ua" - ] - }, - "Ybrant Digital": { - "properties": [ - "addynamix.com", - "brightcom.com", - "luj.sdsjweb.com" - ], - "resources": [ - "addynamix.com", - "adserverplus.com", - "brightcom.com", - "oridian.com", - "ybrantdigital.com" - ] - }, - "YD": { - "properties": [ - "ydworld.com", - "yieldivision.com" - ], - "resources": [ - "ydworld.com", - "yieldivision.com" - ] - }, - "YellowHammer": { - "properties": [ - "yhmg.com" - ], - "resources": [ - "attracto.com", - "clickhype.com", - "yellowhammermg.com", - "yhmg.com" - ] - }, - "YellowTracker": { - "properties": [ - "yellowtracker.com" - ], - "resources": [ - "yellowtracker.com" - ] - }, - "Yes Ads": { - "properties": [ - "yesads.com" - ], - "resources": [ - "yesads.com" - ] - }, - "YieldAds": { - "properties": [ - "yieldads.com" - ], - "resources": [ - "yieldads.com" - ] - }, - "YieldBids": { - "properties": [ - "ybx.io" - ], - "resources": [ - "ybx.io" - ] - }, - "YieldBot": { - "properties": [ - "yieldbot.com" - ], - "resources": [ - "yldbt.com" - ] - }, - "YieldBuild": { - "properties": [ - "yieldbuild.com" - ], - "resources": [ - "yieldbuild.com" - ] - }, - "Yieldify": { - "properties": [ - "yieldify.com" - ], - "resources": [ - "yieldify.com" - ] - }, - "Yieldlab": { - "properties": [ - "yieldlab.de", - "yieldlab.net" - ], - "resources": [ - "yieldlab.de", - "yieldlab.net" - ] - }, - "Yieldmo": { - "properties": [ - "yieldmo.com" - ], - "resources": [ - "yieldmo.com" - ] - }, - "YieldNexus": { - "properties": [ - "ynxs.io" - ], - "resources": [ - "ynxs.io" - ] - }, - "YOC": { - "properties": [ - "yoc.com" - ], - "resources": [ - "yoc.com" - ] - }, - "Yoggrt": { - "properties": [ - "yoggrt.com" - ], - "resources": [ - "yoggrt.com" - ] - }, - "youknowbest": { - "properties": [ - "youknowbest.com" - ], - "resources": [ - "youknowbest.com" - ] - }, - "YSance": { - "properties": [ - "ysance.com" - ], - "resources": [ - "y-track.com" - ] - }, - "YuMe": { - "properties": [ - "yume.com", - "yumenetworks.com" - ], - "resources": [ - "yume.com", - "yumenetworks.com" - ] - }, - "ZafulAffiliate": { - "properties": [ - "zaful.com" - ], - "resources": [ - "zaful.com" - ] - }, - "Zango": { - "properties": [ - "metricsdirect.com", - "zango.com" - ], - "resources": [ - "metricsdirect.com", - "zango.com" - ] - }, - "zanox": { - "properties": [ - "buy.at", - "zanox-affiliate.de", - "zanox.com" - ], - "resources": [ - "buy.at", - "zanox-affiliate.de", - "zanox.com" - ] - }, - "zapunited": { - "properties": [ - "zaparena.com", - "zapunited.com" - ], - "resources": [ - "zaparena.com", - "zapunited.com" - ] - }, - "ZEDO": { - "properties": [ - "zedo.com", - "zincx.com" - ], - "resources": [ - "zedo.com", - "zincx.com" - ] - }, - "Zefir": { - "properties": [ - "ze-fir.com" - ], - "resources": [ - "ze-fir.com" - ] - }, - "Zemanta": { - "properties": [ - "zemanta.com" - ], - "resources": [ - "zemanta.com" - ] - }, - "Zendesk": { - "properties": [ - "zendesk.com" - ], - "resources": [ - "zendesk.com" - ] - }, - "ZestAd": { - "properties": [ - "zestad.com" - ], - "resources": [ - "zestad.com" - ] - }, - "Zeta Email Solutions": { - "properties": [ - "insightgrit.com", - "zetaemailsolutions.com" - ], - "resources": [ - "insightgrit.com", - "zetaemailsolutions.com" - ] - }, - "Zopim": { - "properties": [ - "zopim.com" - ], - "resources": [ - "zopim.com" - ] - }, - "Zumobi": { - "properties": [ - "zumobi.com" - ], - "resources": [ - "zumobi.com" - ] - }, - "ZypMedia": { - "properties": [ - "zypmedia.com" - ], - "resources": [ - "extend.tv", - "zypmedia.com" - ] - } + "2leep.com": { + "properties": ["2leep.com"], + "resources": ["2leep.com"] + }, + "33Across": { + "properties": ["33across.com", "tynt.com"], + "resources": ["33across.com", "tynt.com"] + }, + "365Media": { + "properties": ["aggregateintelligence.com"], + "resources": ["365media.com", "aggregateintelligence.com"] + }, + "4INFO": { + "properties": ["4info.com", "adhaven.com"], + "resources": ["4info.com", "adhaven.com"] + }, + "4mads": { + "properties": ["4mads.com"], + "resources": ["4mads.com"] + }, + "63 Squares": { + "properties": ["63labs.com"], + "resources": ["63labs.com", "63squares.com", "i-stats.com"] + }, + "Abax Interactive": { + "properties": ["abaxinteractive.com"], + "resources": ["abaxinteractive.com"] + }, + "Accelia": { + "properties": ["accelia.net", "durasite.net"], + "resources": ["accelia.net", "durasite.net"] + }, + "Accordant Media": { + "properties": ["accordantmedia.com"], + "resources": ["accordantmedia.com"] + }, + "Acquisio": { + "properties": ["acquisio.com", "clickequations.net"], + "resources": ["acquisio.com", "clickequations.net"] + }, + "Actisens": { + "properties": ["actisens.com", "gestionpub.com"], + "resources": ["actisens.com", "gestionpub.com"] + }, + "ActiveConversion": { + "properties": ["activeconversion.com", "activemeter.com"], + "resources": ["activeconversion.com", "activemeter.com"] + }, + "ActivEngage": { + "properties": ["activengage.com"], + "resources": ["activengage.com"] + }, + "Act-On": { + "properties": ["act-on.com", "actonsoftware.com"], + "resources": ["act-on.com", "actonsoftware.com"] + }, + "Acuity": { + "properties": ["acuity.com", "acuityads.com", "acuityplatform.com"], + "resources": ["acuity.com", "acuityads.com", "acuityplatform.com"] + }, + "Acxiom": { + "properties": ["acxiom.com", "mm7.net"], + "resources": ["acxiom.com", "acxiomapac.com", "mm7.net", "pippio.com"] + }, + "AD2ONE": { + "properties": ["ad2onegroup.com"], + "resources": ["ad2onegroup.com"] + }, + "Ad4Game": { + "properties": ["ad4game.com"], + "resources": ["ad4game.com"] + }, + "ad6media": { + "properties": ["ad6media.fr"], + "resources": ["ad6media.fr"] + }, + "Adabra": { + "properties": ["adabra.com"], + "resources": ["adabra.com"] + }, + "Adality": { + "properties": ["adality.de"], + "resources": ["adality.de", "adrtx.net"] + }, + "AdaptiveAds": { + "properties": ["adaptiveads.com"], + "resources": ["adaptiveads.com"] + }, + "Adaptly": { + "properties": ["adaptly.com"], + "resources": ["adaptly.com"] + }, + "Adap.tv": { + "properties": ["adap.tv"], + "resources": ["adap.tv"] + }, + "Adara Media": { + "properties": ["adaramedia.com", "opinmind.com", "yieldoptimizer.com"], + "resources": ["adaramedia.com", "opinmind.com", "yieldoptimizer.com"] + }, + "Adatus": { + "properties": ["adatus.com"], + "resources": ["adatus.com"] + }, + "Adbot": { + "properties": ["adbot.tw"], + "resources": ["adbot.tw"] + }, + "Adbrain": { + "properties": ["adbrain.com"], + "resources": ["adbrain.com", "adbrn.com"] + }, + "adBrite": { + "properties": ["adbrite.com"], + "resources": ["adbrite.com"] + }, + "Adbroker.de": { + "properties": ["adbroker.de"], + "resources": ["adbroker.de"] + }, + "Adchemy": { + "properties": ["adchemy.com"], + "resources": ["adchemy.com"] + }, + "AdCirrus": { + "properties": ["adcirrus.com"], + "resources": ["adcirrus.com"] + }, + "Ad Decisive": { + "properties": ["a2dfp.net", "addecisive.com"], + "resources": ["a2dfp.net", "addecisive.com"] + }, + "AddFreeStats": { + "properties": ["3dstats.com", "addfreestats.com"], + "resources": ["3dstats.com", "addfreestats.com"] + }, + "addGloo": { + "properties": ["addgloo.com"], + "resources": ["addgloo.com"] + }, + "AddThis": { + "properties": ["addthis.com"], + "resources": [ + "addthis.com", + "addthiscdn.com", + "addthisedge.com", + "clearspring.com", + "connectedads.net", + "xgraph.com", + "xgraph.net" + ] + }, + "Addvantage Media": { + "properties": ["addvantagemedia.com"], + "resources": ["addvantagemedia.com"] + }, + "Ad Dynamo": { + "properties": ["addynamo.com"], + "resources": ["addynamo.com", "addynamo.net"] + }, + "Adelphic": { + "properties": ["adelphic.com"], + "resources": ["adelphic.com", "ipredictive.com"] + }, + "AdEngage": { + "properties": ["adengage.com"], + "resources": ["adengage.com"] + }, + "AD Europe": { + "properties": ["adeurope.com"], + "resources": ["adeurope.com"] + }, + "AdExtent": { + "properties": ["adextent.com"], + "resources": ["adextent.com"] + }, + "AdF.ly": { + "properties": ["adf.ly"], + "resources": ["adf.ly"] + }, + "Adfonic": { + "properties": ["adfonic.com"], + "resources": ["adfonic.com"] + }, + "Adforge": { + "properties": ["adforgeinc.com"], + "resources": ["adforgeinc.com"] + }, + "Adform": { + "properties": ["adform.com"], + "resources": ["adform.com", "adform.net", "adformdsp.net"] + }, + "AdFox": { + "properties": ["adfox.ru"], + "resources": ["adfox.ru"] + }, + "AdFrontiers": { + "properties": ["adfrontiers.com"], + "resources": ["adfrontiers.com"] + }, + "Adfunky": { + "properties": ["adfunky.com", "adfunkyserver.com"], + "resources": ["adfunky.com", "adfunkyserver.com"] + }, + "Adfusion": { + "properties": ["adfusion.com"], + "resources": ["adfusion.com"] + }, + "AdGainerSolutions": { + "properties": ["adgainersolutions.com"], + "resources": ["adgainersolutions.com"] + }, + "AdGent Digital": { + "properties": ["adgentdigital.com"], + "resources": ["adgentdigital.com", "shorttailmedia.com"] + }, + "AdGibbon": { + "properties": ["adgibbon.com"], + "resources": ["adgibbon.com"] + }, + "Adglare": { + "properties": ["adglare.com"], + "resources": ["adglare.com", "adglare.net"] + }, + "adhood": { + "properties": ["adhood.com"], + "resources": ["adhood.com"] + }, + "Adiant": { + "properties": ["adblade.com", "adiant.com"], + "resources": ["adblade.com", "adiant.com"] + }, + "AdInsight": { + "properties": ["responsetap.com"], + "resources": ["adinsight.com", "adinsight.eu", "responsetap.com"] + }, + "AdIQuity": { + "properties": ["adiquity.com"], + "resources": ["adiquity.com"] + }, + "ADITION": { + "properties": ["adition.com"], + "resources": ["adition.com"] + }, + "AdJug": { + "properties": ["adjug.com"], + "resources": ["adjug.com"] + }, + "AdJuggler": { + "properties": ["adjuggler.com", "adjuggler.net"], + "resources": ["adjuggler.com", "adjuggler.net"] + }, + "Adjust": { + "properties": ["adjust.com"], + "resources": ["adjust.com"] + }, + "AdKeeper": { + "properties": ["keep.com"], + "resources": ["adkeeper.com", "akncdn.com", "keep.com"] + }, + "AdKernel": { + "properties": ["adkernel.com"], + "resources": ["adkernel.com"] + }, + "Ad Knife": { + "properties": ["adknife.com"], + "resources": ["adknife.com"] + }, + "Adknowledge": { + "properties": [ + "adknowledge.com", + "adparlor.com", + "bidsystem.com", + "cubics.com", + "lookery.com" + ], + "resources": [ + "adknowledge.com", + "adparlor.com", + "bidsystem.com", + "cubics.com", + "lookery.com" + ] + }, + "AdLantis": { + "properties": ["adimg.net", "adlantis.jp", "www.adlantis.jp"], + "resources": ["adimg.net", "adlantis.jp", "www.adlantis.jp"] + }, + "AdLeave": { + "properties": ["adleave.com"], + "resources": ["adleave.com"] + }, + "Adlibrium": { + "properties": ["adlibrium.com"], + "resources": ["adlibrium.com"] + }, + "Adloox": { + "properties": ["adloox.com"], + "resources": ["adloox.com", "adlooxtracking.com"] + }, + "Adlucent": { + "properties": ["adlucent.com"], + "resources": ["adlucent.com"] + }, + "Ad Magnet": { + "properties": ["admagnet.com", "admagnet.net"], + "resources": ["admagnet.com", "admagnet.net"] + }, + "Admarketplace": { + "properties": ["admarketplace.com"], + "resources": ["admarketplace.com", "admarketplace.net", "ampxchange.com"] + }, + "AdMarvel": { + "properties": ["admarvel.com"], + "resources": ["admarvel.com"] + }, + "AdMatrix": { + "properties": ["admatrix.jp"], + "resources": ["admatrix.jp"] + }, + "AdMaven": { + "properties": ["ad-maven.com"], + "resources": [ + "ad-maven.com", + "agreensdistra.info", + "boudja.com", + "rensovetors.info", + "wrethicap.info" + ] + }, + "AdMaximizer Network": { + "properties": ["admaximizer.com"], + "resources": ["admaximizer.com"] + }, + "AdMedia": { + "properties": ["admedia.com"], + "resources": ["admedia.com"] + }, + "Admeta": { + "properties": ["admeta.com", "atemda.com"], + "resources": ["admeta.com", "atemda.com"] + }, + "Admicro": { + "properties": ["admicro.vn"], + "resources": ["admicro.vn", "vcmedia.vn"] + }, + "Admixer": { + "properties": ["admixer.co.kr"], + "resources": ["admixer.co.kr"] + }, + "Admized": { + "properties": ["admized.com"], + "resources": ["admized.com"] + }, + "Admobile": { + "properties": ["admobile.com"], + "resources": ["admobile.com"] + }, + "Admotion": { + "properties": ["admotion.com"], + "resources": ["admotion.com", "nspmotion.com"] + }, + "Adnetik": { + "properties": ["wtp101.com"], + "resources": ["adnetik.com", "wtp101.com"] + }, + "AdNetwork.net": { + "properties": ["adnetwork.net"], + "resources": ["adnetwork.net"] + }, + "Adnium": { + "properties": ["adnium.com"], + "resources": ["adnium.com", "montwam.top"] + }, + "adnologies": { + "properties": ["adnologies.com", "heias.com"], + "resources": ["adnologies.com", "heias.com"] + }, + "Adobe": { + "properties": ["adobe.com", "livefyre.com", "typekit.com"], + "resources": [ + "2o7.net", + "adobe.com", + "auditude.com", + "demdex.com", + "demdex.net", + "dmtracker.com", + "efrontier.com", + "everestads.net", + "everestjs.net", + "everesttech.net", + "fyre.co", + "hitbox.com", + "livefyre.com", + "omniture.com", + "omtrdc.net", + "touchclarity.com", + "typekit.com" + ] + }, + "AdOcean": { + "properties": ["adocean-global.com", "adocean.pl"], + "resources": ["adocean-global.com", "adocean.pl"] + }, + "Adometry": { + "properties": ["adometry.com"], + "resources": ["adometry.com", "dmtry.com"] + }, + "Adomik": { + "properties": ["adomik.com"], + "resources": ["adomik.com"] + }, + "AdOnion": { + "properties": ["adonion.com"], + "resources": ["adonion.com"] + }, + "Adorika": { + "properties": ["clickotmedia.com"], + "resources": ["clickotmedia.com"] + }, + "Adotmob": { + "properties": ["adotmob.com"], + "resources": ["adotmob.com"] + }, + "ADP Dealer Services": { + "properties": ["cdkglobal.com"], + "resources": [ + "admission.net", + "adpdealerservices.com", + "cdkglobal.com", + "cobalt.com" + ] + }, + "ad pepper media": { + "properties": ["adpepper.com", "adpepper.us"], + "resources": ["adpepper.com", "adpepper.us"] + }, + "AdPerfect": { + "properties": ["adperfect.com"], + "resources": ["adperfect.com"] + }, + "Adperium": { + "properties": ["adperium.com"], + "resources": ["adperium.com"] + }, + "Adpersia": { + "properties": ["adpersia.com"], + "resources": ["adpersia.com"] + }, + "adPrecision": { + "properties": ["adprecision.net", "adprs.net"], + "resources": ["adprecision.net", "adprs.net", "aprecision.net"] + }, + "AdPredictive": { + "properties": ["adpredictive.com"], + "resources": ["adpredictive.com"] + }, + "AdReactor": { + "properties": ["adreactor.com"], + "resources": ["adreactor.com"] + }, + "AdReady": { + "properties": ["digitalremedy.com"], + "resources": ["adready.com", "adreadytractions.com", "digitalremedy"] + }, + "AdRevolution": { + "properties": ["adrevolution.com"], + "resources": ["adrevolution.com"] + }, + "AdRiver": { + "properties": ["adriver.ru"], + "resources": ["adriver.ru"] + }, + "adrolays": { + "properties": ["contactimpact.de"], + "resources": ["adrolays.com", "adrolays.de", "contactimpact.de"] + }, + "AdRoll": { + "properties": ["adroll.com"], + "resources": ["adroll.com"] + }, + "adscale": { + "properties": ["stroeer.de"], + "resources": ["adscale.de", "stroeer.de"] + }, + "Adscience": { + "properties": ["adscience.nl"], + "resources": ["adscience.nl"] + }, + "AdScore": { + "properties": ["adscoremarketing.com"], + "resources": ["adsco.re"] + }, + "AdServerPub": { + "properties": ["adserverpub.com"], + "resources": ["adserverpub.com"] + }, + "AdShuffle": { + "properties": ["adshuffle.com"], + "resources": ["adshuffle.com"] + }, + "AdSide": { + "properties": ["adside.com", "doclix.com"], + "resources": ["adside.com", "doclix.com"] + }, + "AdSpeed": { + "properties": ["adspeed.com", "adspeed.net"], + "resources": ["adspeed.com", "adspeed.net"] + }, + "Adsperity": { + "properties": ["adsperity.com"], + "resources": ["adsperity.com"] + }, + "AdSpirit": { + "properties": ["adspirit.com", "adspirit.de", "adspirit.net"], + "resources": ["adspirit.com", "adspirit.de", "adspirit.net"] + }, + "Adsrevenue.net": { + "properties": ["adsrevenue.net"], + "resources": ["adsrevenue.net"] + }, + "AdStir": { + "properties": ["ad-stir.com"], + "resources": ["ad-stir.com"] + }, + "AdsTours": { + "properties": ["adstours.com", "clickintext.net"], + "resources": ["adstours.com", "clickintext.net"] + }, + "Adsty": { + "properties": ["adsty.com", "adx1.com"], + "resources": ["adsty.com", "adx1.com"] + }, + "Adsupply": { + "properties": ["4dsply.com", "adsupply.com"], + "resources": ["4dsply.com", "adsupply.com"] + }, + "Adswizz": { + "properties": ["adswizz.com"], + "resources": ["adswizz.com"] + }, + "ADTECH": { + "properties": ["adtech.com", "adtech.de", "adtechus.com"], + "resources": ["adtech.com", "adtech.de", "adtechus.com"] + }, + "Adtegrity.com": { + "properties": ["adtegrity.com", "adtegrity.net"], + "resources": ["adtegrity.com", "adtegrity.net"] + }, + "ADTELLIGENCE": { + "properties": ["adtelligence.de"], + "resources": ["adtelligence.de"] + }, + "Adthink": { + "properties": ["adthink.com"], + "resources": ["adthink.com", "audienceinsights.net"] + }, + "AdTiger": { + "properties": ["adtiger.de"], + "resources": ["adtiger.de"] + }, + "AdTruth": { + "properties": ["adtruth.com"], + "resources": ["adtruth.com"] + }, + "Adult AdWorld": { + "properties": ["adultadworld.com"], + "resources": ["adultadworld.com"] + }, + "Adultmoda": { + "properties": ["adultmoda.com"], + "resources": ["adultmoda.com"] + }, + "Adventive": { + "properties": ["adventive.com"], + "resources": ["adventive.com"] + }, + "Adventori": { + "properties": ["adventori.com"], + "resources": ["adventori.com"] + }, + "Adverline": { + "properties": ["adnext.fr", "adverline.com"], + "resources": ["adnext.fr", "adverline.com"] + }, + "Adversal.com": { + "properties": ["adv-adserver.com", "adversal.com"], + "resources": ["adv-adserver.com", "adversal.com"] + }, + "Adverticum": { + "properties": ["adsmart.com", "adverticum.com", "adverticum.net"], + "resources": ["adsmart.com", "adverticum.com", "adverticum.net"] + }, + "Advertise.com": { + "properties": ["advertise.com"], + "resources": ["advertise.com"] + }, + "AdvertiseSpace": { + "properties": ["advertisespace.com"], + "resources": ["advertisespace.com"] + }, + "Advert Stream": { + "properties": ["advertstream.com"], + "resources": ["advertstream.com"] + }, + "Advisor Media": { + "properties": ["advisormedia.cz"], + "resources": ["advisormedia.cz"] + }, + "Adworx": { + "properties": ["adworx.at", "adworx.be", "adworx.nl"], + "resources": ["adworx.at", "adworx.be", "adworx.nl"] + }, + "AdXpansion": { + "properties": ["adxpansion.com"], + "resources": ["adxpansion.com"] + }, + "Adxvalue": { + "properties": ["adxvalue.com", "adxvalue.de"], + "resources": ["adxvalue.com", "adxvalue.de"] + }, + "adyard": { + "properties": ["adyard.de"], + "resources": ["adyard.de"] + }, + "AdYield": { + "properties": ["adyield.com"], + "resources": ["adxyield.com", "adyield.com"] + }, + "AdYouLike": { + "properties": ["adyoulike.com"], + "resources": ["adyoulike.com", "omnitagjs.com", "pulpix.com"] + }, + "ADZ": { + "properties": ["adzcentral.com"], + "resources": ["adzcentral.com"] + }, + "Adzerk": { + "properties": ["adzerk.com"], + "resources": ["adzerk.com", "adzerk.net"] + }, + "adzly": { + "properties": ["adzly.com"], + "resources": ["adzly.com"] + }, + "Aegis Group": { + "properties": ["aemedia.com", "bluestreak.com", "dentsuaegisnetwork.com"], + "resources": ["aemedia.com", "bluestreak.com", "dentsuaegisnetwork.com"] + }, + "AERIFY MEDIA": { + "properties": ["aerifymedia.com", "anonymous-media.com"], + "resources": ["aerifymedia.com", "anonymous-media.com"] + }, + "Affectv": { + "properties": ["affectv.co.uk"], + "resources": ["affectv.co.uk"] + }, + "affilinet": { + "properties": ["affili.net", "affilinet-inside.de"], + "resources": [ + "affili.net", + "affilinet-inside.de", + "banner-rotation.com", + "successfultogether.co.uk" + ] + }, + "Affine": { + "properties": ["affine.tv", "affinesystems.com"], + "resources": ["affine.tv", "affinesystems.com"] + }, + "Affinity": { + "properties": ["affinity.com"], + "resources": ["affinity.com"] + }, + "AfterDownload": { + "properties": ["afdads.com", "afterdownload.com"], + "resources": ["afdads.com", "afterdownload.com"] + }, + "AIData": { + "properties": ["advombat.ru", "aidata.me"], + "resources": ["advombat.ru", "aidata.me"] + }, + "Aim4Media": { + "properties": ["aim4media.com"], + "resources": ["aim4media.com"] + }, + "Airpush": { + "properties": ["airpush.com"], + "resources": ["airpush.com"] + }, + "AivaLabs": { + "properties": ["aivalabs.com"], + "resources": ["aivalabs.com"] + }, + "a.js": { + "properties": [ + "alflying.date", + "alflying.win", + "anybest.site", + "flightsy.bid", + "flightsy.win", + "flightzy.bid", + "flightzy.date", + "flightzy.win", + "zymerget.bid", + "zymerget.faith" + ], + "resources": [ + "alflying.date", + "alflying.win", + "anybest.site", + "flightsy.bid", + "flightsy.win", + "flightzy.bid", + "flightzy.date", + "flightzy.win", + "zymerget.bid", + "zymerget.faith" + ] + }, + "AK": { + "properties": ["aggregateknowledge.com", "agkn.com"], + "resources": ["aggregateknowledge.com", "agkn.com"] + }, + "Akamai": { + "properties": ["akamai.com"], + "resources": [ + "abmr.net", + "akamai.com", + "edgesuite.net", + "go-mpulse.net", + "imiclk.com" + ] + }, + "AKQA": { + "properties": ["akqa.com"], + "resources": ["akqa.com", "srtk.net"] + }, + "Albacross": { + "properties": ["albacross.com"], + "resources": ["albacross.com"] + }, + "AllStarMediaGroup": { + "properties": ["allstarmediagroup.com"], + "resources": ["allstarmediagroup.com"] + }, + "Aloodo": { + "properties": ["aloodo.com"], + "resources": ["aloodo.com"] + }, + "AlterGeo": { + "properties": ["altergeo.ru"], + "resources": ["altergeo.ru"] + }, + "Amadesa": { + "properties": ["amadesa.com"], + "resources": ["amadesa.com"] + }, + "Amazing Counters": { + "properties": ["amazingcounters.com"], + "resources": ["amazingcounters.com"] + }, + "Amazon.com": { + "properties": [ + "6pm.com", + "abebooks.co.uk", + "abebooks.com", + "abebooks.de", + "abebooks.fr", + "abebooks.it", + "acx.com", + "alexa.com", + "amazon.ae", + "amazon.ca", + "amazon.cn", + "amazon.co.jp", + "amazon.co.uk", + "amazon.com", + "amazon.com.au", + "amazon.com.br", + "amazon.com.mx", + "amazon.com.sg", + "amazon.com.tr", + "amazon.de", + "amazon.es", + "amazon.fr", + "amazon.in", + "amazon.it", + "amazon.nl", + "amazon.sa", + "amazonaws.com", + "amazoninspire.com", + "assoc-amazon.com", + "audible.co.jp", + "audible.co.uk", + "audible.com", + "audible.de", + "audible.fr", + "audible.in", + "audible.it", + "bookdepository.com", + "boxofficemojo.com", + "brilliancepublishing.com", + "comixology.com", + "createspace.com", + "dpreview.com", + "dpreview.in", + "eastdane.com", + "fabric.com", + "goodreads.com", + "iberlibro.com", + "imdb.com", + "imdb.de", + "junglee.com", + "look.com", + "pillpack.com", + "shopbop.com", + "souq.com", + "twitch.com", + "twitch.tv", + "wholefoodsmarket.com", + "withoutabox.com", + "woot.com", + "yoyo.com", + "zappos.com", + "zvab.com" + ], + "resources": [ + "alexa.com", + "alexametrics.com", + "amazon-adsystem.com", + "amazon.ca", + "amazon.co.jp", + "amazon.co.uk", + "amazon.com", + "amazon.de", + "amazon.es", + "amazon.fr", + "amazon.it", + "amazonaws.com", + "assoc-amazon.com", + "cloudfront.net", + "ssl-images-amazon.com" + ] + }, + "Ambient Digital": { + "properties": ["adnetwork.vn", "ambientdigital.com.vn"], + "resources": ["adnetwork.vn", "ambientdigital.com.vn"] + }, + "Amobee": { + "properties": ["amobee.com", "smartclip.com"], + "resources": [ + "adconion.com", + "amgdgt.com", + "amobee.com", + "euroclick.com", + "smartclip.com", + "turn.com" + ] + }, + "Amplitude": { + "properties": ["amplitude.com"], + "resources": ["amplitude.com"] + }, + "AndBeyond": { + "properties": ["andbeyond.media"], + "resources": ["andbeyond.media"] + }, + "anormal-media.de": { + "properties": ["anormal-media.de", "primawebtools.de"], + "resources": ["anormal-media.de", "anormal-tracker.de", "primawebtools.de"] + }, + "Answers.com": { + "properties": ["answers.com", "dsply.com"], + "resources": ["dsply.com"] + }, + "AOL": { + "properties": [ + "5min.com", + "adsonar.com", + "advertising.com", + "aim.com", + "aol.com", + "aolcdn.com", + "aoltechguru.com", + "atwola.com", + "autoblog.com", + "cambio.com", + "dailyfinance.com", + "editions.com", + "engadget.com", + "games.com", + "homesessive.com", + "huffingtonpost.com", + "leadback.com", + "makers.com", + "mandatory.com", + "mapquest.com", + "moviefone.com", + "noisecreep.com", + "patch.com", + "pawnation.com", + "shortcuts.com", + "shoutcast.com", + "spinner.com", + "stylelist.com", + "stylemepretty.com", + "surphace.com", + "tacoda.net", + "techcrunch.com", + "theboombox.com", + "theboot.com", + "userplane.com", + "winamp.com" + ], + "resources": [ + "5min.com", + "adsonar.com", + "adtechjp.com", + "advertising.com", + "aim.com", + "aol.com", + "aolcdn.com", + "aolcloud.net", + "atwola.com", + "editions.com", + "leadback.com", + "mapquest.com", + "patch.com", + "shortcuts.com", + "shoutcast.com", + "spinner.com", + "surphace.com", + "tacoda.net", + "userplane.com", + "vidible.tv", + "winamp.com" + ] + }, + "AppCast": { + "properties": ["appcast.io"], + "resources": ["appcast.io"] + }, + "Appenda": { + "properties": ["appenda.com"], + "resources": ["appenda.com"] + }, + "AppFlood": { + "properties": ["appflood.com"], + "resources": ["appflood.com"] + }, + "Appier": { + "properties": ["appier.com"], + "resources": ["appier.com"] + }, + "Applifier": { + "properties": ["applifier.com"], + "resources": ["applifier.com"] + }, + "Applovin": { + "properties": ["applovin.com"], + "resources": ["applovin.com"] + }, + "AppNexus": { + "properties": ["adlantic.nl", "adnxs.com", "adrdgt.com", "appnexus.com"], + "resources": ["adlantic.nl", "adnxs.com", "adrdgt.com", "appnexus.com"] + }, + "AppsFlyer": { + "properties": ["appsflyer.com"], + "resources": ["appsflyer.com"] + }, + "appssavvy": { + "properties": ["appssavvy.com"], + "resources": ["appssavvy.com"] + }, + "Arkwrights Homebrew": { + "properties": ["whiskyandwines.com"], + "resources": ["arkwrightshomebrew.com", "ctasnet.com", "whiskyandwines.com"] + }, + "AT Internet": { + "properties": ["atinternet.com", "xiti.com"], + "resources": ["at-o.net", "atinternet.com", "hit-parade.com", "xiti.com"] + }, + "ATN": { + "properties": ["affiliatetracking.com"], + "resources": ["affiliatetracking.com"] + }, + "Atoomic.com": { + "properties": ["atoomic.com"], + "resources": ["atoomic.com"] + }, + "Atrinsic": { + "properties": ["atrinsic.com"], + "resources": ["atrinsic.com"] + }, + "AT&T": { + "properties": ["att.com", "yp.com"], + "resources": ["att.com", "yp.com"] + }, + "Attracta": { + "properties": ["attracta.com"], + "resources": ["attracta.com"] + }, + "Audience2Media": { + "properties": ["audience2media.com"], + "resources": ["audience2media.com"] + }, + "Audience Ad Network": { + "properties": ["audienceadnetwork.com"], + "resources": ["audienceadnetwork.com"] + }, + "AudienceScience": { + "properties": ["audiencescience.com"], + "resources": [ + "audiencescience.com", + "revsci.net", + "targetingmarketplace.com", + "wunderloop.net" + ] + }, + "AuditedMedia": { + "properties": ["auditedmedia.com"], + "resources": ["aamapi.com", "aamsitecertifier.com", "auditedmedia.com"] + }, + "Augme": { + "properties": ["hipcricket.com"], + "resources": ["augme.com", "hipcricket.com"] + }, + "Augur": { + "properties": ["augur.io"], + "resources": ["augur.io"] + }, + "AUTOCENTRE.UA": { + "properties": ["am.ua", "autocentre.ua"], + "resources": ["am.ua", "autocentre.ua"] + }, + "Automattic": { + "properties": [ + "automattic.com", + "gravatar.com", + "intensedebate.com", + "polldaddy.com" + ], + "resources": [ + "automattic.com", + "gravatar.com", + "intensedebate.com", + "polldaddy.com", + "pubmine.com" + ] + }, + "Avalanchers": { + "properties": ["avalanchers.com"], + "resources": ["avalanchers.com"] + }, + "AvantLink": { + "properties": ["avantlink.com", "avantmetrics.com"], + "resources": ["avantlink.com", "avmws.com"] + }, + "Avocet": { + "properties": ["avocet.io"], + "resources": ["avocet.io"] + }, + "Avsads": { + "properties": ["avsads.com"], + "resources": ["avsads.com"] + }, + "AWeber": { + "properties": ["aweber.com"], + "resources": ["aweber.com"] + }, + "Awin": { + "properties": ["awin.com"], + "resources": [ + "awin.com", + "digitalwindow.com", + "dwin1.com", + "perfiliate.com" + ] + }, + "Awio": { + "properties": ["awio.com", "w3counter.com"], + "resources": ["awio.com", "w3counter.com", "w3roi.com"] + }, + "Azet": { + "properties": ["azet.sk", "mediaimpact.sk"], + "resources": ["azet.sk", "azetklik.sk", "mediaimpact.sk", "rsz.sk"] + }, + "BackBeat Media": { + "properties": ["backbeatmedia.com"], + "resources": ["backbeatmedia.com"] + }, + "Bannerconnect": { + "properties": ["bannerconnect.net"], + "resources": ["bannerconnect.net"] + }, + "Barilliance": { + "properties": ["barilliance.com"], + "resources": ["barilliance.com"] + }, + "BaronsNetworks": { + "properties": ["baronsoffers.com"], + "resources": ["baronsoffers.com"] + }, + "Batanga Network": { + "properties": ["batanga.com", "corp.vix.com", "vix.com"], + "resources": ["batanga.com", "batanganetwork.com", "vix.com"] + }, + "Baynote": { + "properties": ["baynote.com"], + "resources": ["baynote.com", "baynote.net"] + }, + "Bazaarvoice": { + "properties": ["bazaarvoice.com"], + "resources": ["bazaarvoice.com"] + }, + "BeachFront": { + "properties": ["beachfront.com"], + "resources": ["beachfront.com"] + }, + "Beanstock Media": { + "properties": ["beanstockmedia.com"], + "resources": ["beanstockmedia.com"] + }, + "beencounter": { + "properties": ["beencounter.com"], + "resources": ["beencounter.com"] + }, + "Begun": { + "properties": ["begun.ru"], + "resources": ["begun.ru"] + }, + "belboon": { + "properties": ["belboon.com"], + "resources": ["adbutler.de", "belboon.com"] + }, + "Belstat": { + "properties": [ + "belstat.be", + "belstat.com", + "belstat.de", + "belstat.fr", + "belstat.nl" + ], + "resources": [ + "belstat.be", + "belstat.com", + "belstat.de", + "belstat.fr", + "belstat.nl" + ] + }, + "Betgenius": { + "properties": ["betgenius.com", "connextra.com"], + "resources": ["betgenius.com", "connextra.com"] + }, + "BetssonPalantir": { + "properties": ["betssonpalantir.com"], + "resources": ["betssonpalantir.com"] + }, + "BetweenDigital": { + "properties": ["betweendigital.com"], + "resources": ["betweendigital.com"] + }, + "Bidfluence": { + "properties": ["bidfluence.com"], + "resources": ["bidfluence.com"] + }, + "Bidr": { + "properties": ["bidr.io"], + "resources": ["bidr.io"] + }, + "BidSwitch": { + "properties": ["bidswitch.com"], + "resources": ["bidswitch.net", "mfadsrvr.com"] + }, + "Bidtellect": { + "properties": ["bidtellect.com", "bttrack.com"], + "resources": ["bidtellect.com", "bttrack.com"] + }, + "BidVertiser": { + "properties": ["bidvertiser.com"], + "resources": ["bidvertiser.com"] + }, + "BigClick": { + "properties": ["bigclick.me"], + "resources": ["bgclck.me", "xcvgdf.party"] + }, + "BigDoor": { + "properties": ["bigdoor.com"], + "resources": ["bigdoor.com", "onetruefan.com"] + }, + "bigmirnet": { + "properties": ["bigmir.net"], + "resources": ["bigmir.net"] + }, + "BinLayer": { + "properties": ["binlayer.com"], + "resources": ["binlayer.com"] + }, + "Bitcoin Plus": { + "properties": ["bitcoinplus.com"], + "resources": ["bitcoinplus.com"] + }, + "BitMedia": { + "properties": ["bitmedia.io"], + "resources": ["bitmedia.io"] + }, + "BittAds": { + "properties": ["bittads.com"], + "resources": ["bittads.com"] + }, + "Bizo": { + "properties": ["bizo.com", "bizographics.com"], + "resources": ["bizo.com", "bizographics.com"] + }, + "Black Label Ads": { + "properties": ["blacklabelads.com"], + "resources": ["blacklabelads.com"] + }, + "BlogCatalog": { + "properties": ["blogcatalog.com"], + "resources": ["blogcatalog.com"] + }, + "BlogCounter.com": { + "properties": ["blogcounter.de"], + "resources": ["blogcounter.de"] + }, + "BlogFrog": { + "properties": ["theblogfrog.com"], + "resources": ["theblogfrog.com"] + }, + "BlogHer": { + "properties": ["blogher.com", "blogherads.com"], + "resources": ["blogher.com", "blogherads.com"] + }, + "BlogRollr": { + "properties": ["blogrollr.com"], + "resources": ["blogrollr.com"] + }, + "BLOOM Digital Platforms": { + "properties": ["adgear.com", "bloom-hq.com"], + "resources": ["adgear.com", "adgrx.com", "bloom-hq.com"] + }, + "BloomReach": { + "properties": ["bloomreach.com", "brcdn.com"], + "resources": ["bloomreach.com", "brcdn.com", "brsrvr.com"] + }, + "BlueCava": { + "properties": ["bluecava.com"], + "resources": ["bluecava.com"] + }, + "BlueKai": { + "properties": ["bluekai.com", "tracksimple.com"], + "resources": ["bkrtx.com", "bluekai.com", "tracksimple.com"] + }, + "Bluemetrix": { + "properties": ["bluemetrix.com", "bmmetrix.com"], + "resources": ["bluemetrix.com", "bmmetrix.com"] + }, + "Blu Trumpet": { + "properties": ["blutrumpet.com"], + "resources": ["blutrumpet.com"] + }, + "Bombora": { + "properties": ["bombora.com"], + "resources": ["ml314.com"] + }, + "Boo-Box": { + "properties": ["boo-box.com"], + "resources": ["boo-box.com"] + }, + "BoostBox": { + "properties": ["boostbox.com.br"], + "resources": ["boostbox.com.br"] + }, + "Bouncex": { + "properties": ["bouncex.com"], + "resources": ["bounceexchange.com", "bouncex.com", "bouncex.net"] + }, + "Brainient": { + "properties": ["brainient.com"], + "resources": ["brainient.com"] + }, + "Branch": { + "properties": ["branch.io"], + "resources": ["branch.io"] + }, + "Brand Affinity Technologies": { + "properties": ["brandaffinity.net"], + "resources": ["brandaffinity.net"] + }, + "Brandcrumb": { + "properties": ["brandcrumb.com"], + "resources": ["brandcrumb.com"] + }, + "Brand.net": { + "properties": ["brand.net"], + "resources": ["brand.net"] + }, + "Brandscreen": { + "properties": ["brandscreen.com", "rtbidder.net"], + "resources": ["brandscreen.com", "rtbidder.net"] + }, + "Branica": { + "properties": ["branica.com"], + "resources": ["branica.com"] + }, + "BreakTime": { + "properties": ["breaktime.com.tw"], + "resources": ["breaktime.com.tw"] + }, + "Brightcove": { + "properties": ["brightcove.com"], + "resources": ["brightcove.com"] + }, + "BrightEdge": { + "properties": ["brightedge.com"], + "resources": ["b0e8.com", "brightedge.com"] + }, + "BrightRoll": { + "properties": ["brightroll.com"], + "resources": ["brightroll.com", "btrll.com"] + }, + "BrightTag": { + "properties": ["brighttag.com", "btstatic.com", "thebrighttag.com"], + "resources": ["brighttag.com", "btstatic.com", "thebrighttag.com"] + }, + "Brilig": { + "properties": ["brilig.com"], + "resources": ["brilig.com"] + }, + "Browser-Update.org": { + "properties": ["browser-update.org"], + "resources": ["browser-update.org"] + }, + "BTBuckets": { + "properties": ["btbuckets.com"], + "resources": ["btbuckets.com"] + }, + "Bubblestat": { + "properties": ["bubblestat.com"], + "resources": ["bubblestat.com"] + }, + "BuckSense": { + "properties": ["bucksense.com"], + "resources": ["bucksense.com"] + }, + "Buffer": { + "properties": ["bufferapp.com"], + "resources": ["bufferapp.com"] + }, + "Bunchball": { + "properties": ["bunchball.com"], + "resources": ["bunchball.com"] + }, + "Burstly": { + "properties": ["burstly.com"], + "resources": ["burstly.com"] + }, + "Burst Media": { + "properties": [ + "burstbeacon.com", + "burstdirectads.com", + "burstmedia.com", + "burstnet.com", + "giantrealm.com" + ], + "resources": [ + "burstbeacon.com", + "burstdirectads.com", + "burstmedia.com", + "burstnet.com", + "giantrealm.com" + ] + }, + "BusinessOnline": { + "properties": ["businessol.com"], + "resources": ["businessol.com"] + }, + "Button": { + "properties": ["usebutton.com"], + "resources": ["usebutton.com"] + }, + "buySAFE": { + "properties": ["buysafe.com"], + "resources": ["buysafe.com"] + }, + "BuySellAds": { + "properties": ["beaconads.com", "buysellads.com"], + "resources": ["beaconads.com", "buysellads.com"] + }, + "Buysight": { + "properties": ["buysight.com", "permuto.com", "pulsemgr.com"], + "resources": ["buysight.com", "permuto.com", "pulsemgr.com"] + }, + "BuzzFeed": { + "properties": ["buzzfeed.com"], + "resources": ["buzzfed.com", "buzzfeed.com"] + }, + "BuzzParadise": { + "properties": ["buzzparadise.com"], + "resources": ["buzzparadise.com"] + }, + "BV! MEDIA": { + "properties": ["branchez-vous.com", "bvmedia.ca"], + "resources": [ + "branchez-vous.com", + "bvmedia.ca", + "networldmedia.com", + "networldmedia.net" + ] + }, + "c1exchange": { + "properties": ["c1exchange.com"], + "resources": ["c1exchange.com"] + }, + "C3 Metrics": { + "properties": ["attributionmodel.com", "c3metrics.com", "c3tag.com"], + "resources": ["attributionmodel.com", "c3metrics.com", "c3tag.com"] + }, + "Cadreon": { + "properties": ["cadreon.com"], + "resources": ["cadreon.com"] + }, + "CallSource": { + "properties": ["callsource.com"], + "resources": ["leadtrackingdata.com"] + }, + "CampaignGrid": { + "properties": ["campaigngrid.com"], + "resources": ["campaigngrid.com"] + }, + "CAPITALDATA": { + "properties": ["capitaldata.fr"], + "resources": ["capitaldata.fr"] + }, + "Carambola": { + "properties": ["carambola.com"], + "resources": ["carambo.la"] + }, + "Caraytech": { + "properties": [ + "caraytech.com.ar", + "e-planning.net", + "www.caraytech.com.ar" + ], + "resources": ["caraytech.com.ar", "e-planning.net", "www.caraytech.com.ar"] + }, + "Cardlytics": { + "properties": ["cardlytics.com"], + "resources": ["cardlytics.com"] + }, + "Cart.ro": { + "properties": ["cart.ro"], + "resources": ["cart.ro", "statistics.ro"] + }, + "CartsGuru": { + "properties": ["carts.guru"], + "resources": ["carts.guru"] + }, + "Casale Media": { + "properties": ["casalemedia.com", "medianet.com"], + "resources": ["casalemedia.com", "medianet.com"] + }, + "CashBeet": { + "properties": ["cashbeet.com"], + "resources": ["cashbeet.com", "serv1swork.com"] + }, + "Causes": { + "properties": ["causes.com"], + "resources": ["causes.com"] + }, + "Cbox": { + "properties": ["cbox.ws"], + "resources": ["cbox.ws"] + }, + "CBproADS": { + "properties": ["cbproads.com"], + "resources": ["cbproads.com"] + }, + "CBS Interactive": { + "properties": ["cbsinteractive.com", "com.com"], + "resources": ["cbsinteractive.com", "com.com"] + }, + "Cedato": { + "properties": ["cedato.com"], + "resources": ["cedato.com"] + }, + "Cedexis": { + "properties": ["cedexis.com"], + "resources": ["cedexis.com", "cedexis.net"] + }, + "Certona": { + "properties": ["certona.com", "res-x.com"], + "resources": ["certona.com", "res-x.com"] + }, + "Chango": { + "properties": ["chango.ca", "chango.com"], + "resources": ["chango.ca", "chango.com"] + }, + "ChannelAdvisor": { + "properties": ["channeladvisor.com", "searchmarketing.com"], + "resources": ["channeladvisor.com", "searchmarketing.com"] + }, + "Channel Intelligence": { + "properties": ["channelintelligence.com"], + "resources": ["channelintelligence.com"] + }, + "Chartbeat": { + "properties": ["chartbeat.com", "chartbeat.net"], + "resources": ["chartbeat.com", "chartbeat.net"] + }, + "Chartboost": { + "properties": ["chartboost.com"], + "resources": ["chartboost.com"] + }, + "CheckM8": { + "properties": ["checkm8.com"], + "resources": ["checkm8.com"] + }, + "Chitika": { + "properties": ["chitika.com"], + "resources": ["chitika.com", "chitika.net"] + }, + "ChoiceStream": { + "properties": ["choicestream.com"], + "resources": ["choicestream.com"] + }, + "ClearLink": { + "properties": ["clearlink.com"], + "resources": ["clearlink.com"] + }, + "ClearSaleing": { + "properties": ["clearsaleing.com"], + "resources": [ + "clearsaleing.com", + "csdata1.com", + "csdata2.com", + "csdata3.com" + ] + }, + "Clearsearch Media": { + "properties": ["pathinteractive.com"], + "resources": [ + "clearsearchmedia.com", + "csm-secure.com", + "pathinteractive.com" + ] + }, + "ClearSight Interactive": { + "properties": ["clearsightinteractive.com", "csi-tracking.com"], + "resources": ["clearsightinteractive.com", "csi-tracking.com"] + }, + "ClickAider": { + "properties": ["clickaider.com"], + "resources": ["clickaider.com"] + }, + "Clickayab": { + "properties": ["clickyab.com"], + "resources": ["clickyab.com"] + }, + "Clickbooth": { + "properties": ["clickbooth.com"], + "resources": ["adtoll.com", "clickbooth.com"] + }, + "Clickdensity": { + "properties": ["clickdensity.com"], + "resources": ["clickdensity.com"] + }, + "ClickDimensions": { + "properties": ["clickdimensions.com"], + "resources": ["clickdimensions.com"] + }, + "ClickDistrict": { + "properties": ["clickdistrict.com", "creative-serving.com"], + "resources": ["clickdistrict.com", "creative-serving.com"] + }, + "ClickFrog": { + "properties": ["clickfrog.ru"], + "resources": [ + "bashirian.biz", + "buckridge.link", + "clickfrog.ru", + "franecki.net", + "quitzon.net", + "reichelcormier.bid", + "wisokykulas.bid" + ] + }, + "ClickFuel": { + "properties": ["clickfuel.com", "myconversionlab.com"], + "resources": [ + "clickfuel.com", + "conversiondashboard.com", + "myconversionlab.com" + ] + }, + "ClickGuard": { + "properties": ["clickguard.com"], + "resources": ["clickguard.com"] + }, + "ClickInc": { + "properties": ["clickinc.com"], + "resources": ["clickinc.com"] + }, + "Clicksor": { + "properties": ["clicksor.com", "clicksor.net"], + "resources": ["clicksor.com", "clicksor.net"] + }, + "ClickTale": { + "properties": ["clicktale.com"], + "resources": ["clicktale.com", "clicktale.net", "pantherssl.com"] + }, + "Clickwinks": { + "properties": ["clickwinks.com"], + "resources": ["clickwinks.com"] + }, + "ClicManager": { + "properties": ["clicmanager.fr"], + "resources": ["clicmanager.fr"] + }, + "ClipSyndicate": { + "properties": ["clipsyndicate.com"], + "resources": ["clipsyndicate.com"] + }, + "ClixMetrix": { + "properties": ["clixmetrix.com"], + "resources": ["clixmetrix.com"] + }, + "Clixpy": { + "properties": ["clixpy.com"], + "resources": ["clixpy.com"] + }, + "Clixtell": { + "properties": ["clixtell.com"], + "resources": ["clixtell.com"] + }, + "Clove Network": { + "properties": ["clovenetwork.com"], + "resources": ["clovenetwork.com"] + }, + "ClustrMaps": { + "properties": ["clustrmaps.com"], + "resources": ["clustrmaps.com"] + }, + "CNZZ": { + "properties": ["cnzz.com"], + "resources": ["cnzz.com"] + }, + "Cognitive Match": { + "properties": [ + "cmads.com.tw", + "cmadsasia.com", + "cmadseu.com", + "cmmeglobal.com", + "cognitivematch.com" + ], + "resources": [ + "cmads.com.tw", + "cmadsasia.com", + "cmadseu.com", + "cmmeglobal.com", + "cognitivematch.com" + ] + }, + "CoinHive": { + "properties": ["authedmine.com", "coinhive.com"], + "resources": [ + "ad-miner.com", + "authedmine.com", + "bmst.pw", + "cnhv.co", + "coin-hive.com", + "coinhive.com", + "wsservices.org" + ] + }, + "CoinPot": { + "properties": ["coinpot.co"], + "resources": ["coinpot.co"] + }, + "Collarity": { + "properties": ["collarity.com"], + "resources": ["collarity.com"] + }, + "Collective": { + "properties": ["collective.com"], + "resources": [ + "collective-media.net", + "collective.com", + "oggifinogi.com", + "tumri.com", + "tumri.net", + "yt1187.net" + ] + }, + "Commission Junction": { + "properties": ["cj.com"], + "resources": [ + "apmebf.com", + "awltovhc.com", + "cj.com", + "ftjcfx.com", + "kcdwa.com", + "qksz.com", + "qksz.net", + "tqlkg.com", + "yceml.net" + ] + }, + "Communicator Corp": { + "properties": ["communicatorcorp.com"], + "resources": ["communicatorcorp.com"] + }, + "Compass Labs": { + "properties": ["compasslabs.com"], + "resources": ["compasslabs.com"] + }, + "Complex Media": { + "properties": [ + "collider.com", + "complex.com", + "complexmedianetwork.com", + "firstwefeast.com", + "pigeonsandplanes.com", + "solecollector.com", + "theridechannel.com" + ], + "resources": ["complex.com", "complexmedianetwork.com"] + }, + "Compuware": { + "properties": ["axf8.net", "compuware.com", "dynatrace.com"], + "resources": ["axf8.net", "compuware.com", "dynatrace.com", "gomez.com"] + }, + "comScore": { + "properties": [ + "adxpose.com", + "comscore.com", + "scorecardresearch.com", + "sitestat.com", + "voicefive.com" + ], + "resources": [ + "adxpose.com", + "certifica.com", + "comscore.com", + "mdotlabs.com", + "proxilinks.com", + "proximic.com", + "proximic.net", + "scorecardresearch.com", + "sitestat.com", + "voicefive.com" + ] + }, + "Conduit": { + "properties": ["conduit-banners.com", "conduit.com"], + "resources": [ + "conduit-banners.com", + "conduit-services.com", + "conduit.com", + "wibiya.com" + ] + }, + "Congoo": { + "properties": ["congoo.com"], + "resources": ["congoo.com"] + }, + "Connatix.com": { + "properties": ["connatix.com"], + "resources": ["connatix.com"] + }, + "Connexity": { + "properties": ["connexity.com", "pricegrabber.com"], + "resources": ["connexity.com", "connexity.net", "pricegrabber.com"] + }, + "Consilium Media": { + "properties": ["consiliummedia.com"], + "resources": ["consiliummedia.com"] + }, + "Consumable": { + "properties": ["consumable.com"], + "resources": ["consumable.com"] + }, + "Contact At Once!": { + "properties": ["contactatonce.com"], + "resources": ["contactatonce.com"] + }, + "CONTAXE": { + "properties": ["contaxe.com"], + "resources": ["contaxe.com"] + }, + "ContentABC": { + "properties": ["contentabc.com"], + "resources": ["contentabc.com"] + }, + "CONTEXTin": { + "properties": ["admailtiser.com", "contextin.com"], + "resources": ["admailtiser.com", "contextin.com"] + }, + "ContextuAds": { + "properties": ["agencytradingdesk.net", "contextuads.com"], + "resources": ["agencytradingdesk.net", "contextuads.com"] + }, + "CONTEXTWEB": { + "properties": ["contextweb.com"], + "resources": ["contextweb.com"] + }, + "ConvergeDirect": { + "properties": ["convergedirect.com", "convergetrack.com"], + "resources": ["convergedirect.com", "convergetrack.com"] + }, + "ConversantMedia": { + "properties": ["conversantmedia.com"], + "resources": [ + "adserver.com", + "conversantmedia.com", + "dotomi.com", + "dtmpub.com", + "emjcd.com", + "fastclick.com", + "fastclick.net", + "greystripe.com", + "lduhtrp.net", + "mediaplex.com", + "valueclick.com", + "valueclick.net", + "valueclickmedia.com" + ] + }, + "ConversionRuler": { + "properties": ["conversionruler.com"], + "resources": ["conversionruler.com"] + }, + "Conversive": { + "properties": ["conversive.nl"], + "resources": ["conversive.nl"] + }, + "Convert Insights": { + "properties": ["convert.com", "reedge.com"], + "resources": ["convert.com", "reedge.com"] + }, + "Convertro": { + "properties": ["convertro.com"], + "resources": ["convertro.com"] + }, + "Conviva": { + "properties": ["conviva.com"], + "resources": ["conviva.com"] + }, + "CoreMotives": { + "properties": ["coremotives.com"], + "resources": ["coremotives.com"] + }, + "Cox Digital Solutions": { + "properties": ["adify.com", "coxdigitalsolutions.com", "novomotus.com"], + "resources": [ + "adify.com", + "afy11.net", + "coxdigitalsolutions.com", + "novomotus.com" + ] + }, + "CPMStar": { + "properties": ["cpmstar.com"], + "resources": ["cpmstar.com"] + }, + "CPX Interactive": { + "properties": ["cpxadroit.com"], + "resources": ["adreadypixels.com", "cpxadroit.com", "cpxinteractive.com"] + }, + "Crazy Egg": { + "properties": ["cetrk.com", "crazyegg.com"], + "resources": ["cetrk.com", "crazyegg.com"] + }, + "Creafi": { + "properties": ["creafi.com"], + "resources": ["creafi.com"] + }, + "Crimtan": { + "properties": ["crimtan.com"], + "resources": ["crimtan.com"] + }, + "Crisp Media": { + "properties": ["crispmedia.com"], + "resources": ["crispmedia.com"] + }, + "Criteo": { + "properties": ["criteo.com", "criteo.net"], + "resources": [ + "criteo.com", + "criteo.net", + "hlserve.com", + "hooklogic.com", + "storetail.io" + ] + }, + "Cross Pixel": { + "properties": ["crosspixel.net"], + "resources": ["crosspixel.net", "crosspixelmedia.com", "crsspxl.com"] + }, + "Crowd Science": { + "properties": ["crowdscience.com"], + "resources": ["crowdscience.com"] + }, + "CryptoLoot": { + "properties": ["crypto-loot.com"], + "resources": [ + "cryptaloot.pro", + "crypto-loot.com", + "cryptolootminer.com", + "flashx.pw", + "gitgrub.pro", + "reauthenticator.com", + "statdynamic.com", + "webmine.pro" + ] + }, + "CryptoWebMiner": { + "properties": ["crypto-webminer.com"], + "resources": [ + "bitcoin-pay.eu", + "crypto-webminer.com", + "ethpocket.de", + "ethtrader.de" + ] + }, + "cXense": { + "properties": ["cxense.com"], + "resources": [ + "cxense.com", + "emediate.biz", + "emediate.com", + "emediate.dk", + "emediate.eu" + ] + }, + "Cya2": { + "properties": ["cya2.net"], + "resources": ["cya2.net"] + }, + "Cyberplex": { + "properties": ["cyberplex.com"], + "resources": ["cyberplex.com"] + }, + "Dada": { + "properties": ["dada.eu", "dada.pro", "simply.com"], + "resources": ["dada.eu", "dada.pro", "simply.com"] + }, + "DailyMe": { + "properties": ["dailyme.com", "newstogram.com"], + "resources": ["dailyme.com", "newstogram.com"] + }, + "Dataium": { + "properties": ["collserve.com", "ihs.com"], + "resources": ["collserve.com", "dataium.com", "ihs.com"] + }, + "Datalogix": { + "properties": ["datalogix.com", "nexac.com"], + "resources": ["datalogix.com", "nexac.com", "nextaction.net"] + }, + "DataSift": { + "properties": ["datasift.com", "tweetmeme.com"], + "resources": ["datasift.com", "tweetmeme.com"] + }, + "DataXu": { + "properties": ["dataxu.com", "mexad.com", "w55c.net"], + "resources": ["dataxu.com", "dataxu.net", "mexad.com", "w55c.net"] + }, + "Datonics": { + "properties": ["datonics.com"], + "resources": ["datonics.com", "pro-market.net"] + }, + "Datran Media": { + "properties": ["datranmedia.com", "displaymarketplace.com"], + "resources": ["datranmedia.com", "displaymarketplace.com"] + }, + "Datvantage": { + "properties": ["datvantage.com"], + "resources": ["datvantage.com"] + }, + "DC Storm": { + "properties": ["dc-storm.com", "stormiq.com"], + "resources": ["dc-storm.com", "stormiq.com"] + }, + "Dedicated Media": { + "properties": ["dedicatedmedia.com", "dedicatednetworks.com"], + "resources": ["dedicatedmedia.com", "dedicatednetworks.com"] + }, + "Deep Intent": { + "properties": ["deepintent.com"], + "resources": ["deepintent.com"] + }, + "Delivr": { + "properties": ["delivr.com"], + "resources": ["delivr.com", "percentmobile.com"] + }, + "Delta Projects": { + "properties": ["deltaprojects.com"], + "resources": [ + "adaction.se", + "de17a.com", + "deltaprojects.com", + "deltaprojects.se" + ] + }, + "Demandbase": { + "properties": ["demandbase.com"], + "resources": ["company-target.com", "demandbase.com"] + }, + "Demand Media": { + "properties": ["leafgroup.com"], + "resources": ["demandmedia.com", "indieclick.com"] + }, + "Deutsche Post DHL": { + "properties": ["dpdhl.com"], + "resources": ["adcloud.com", "adcloud.net", "dp-dhl.com", "dpdhl.com"] + }, + "Developer Media": { + "properties": ["developermedia.com"], + "resources": ["developermedia.com", "lqcdn.com"] + }, + "DG": { + "properties": ["dgit.com", "sizmek.com"], + "resources": [ + "dgit.com", + "eyeblaster.com", + "eyewonder.com", + "mdadx.com", + "serving-sys.com", + "unicast.com" + ] + }, + "dianomi": { + "properties": ["dianomi.com"], + "resources": ["dianomi.com"] + }, + "Didit": { + "properties": ["didit.com"], + "resources": ["did-it.com", "didit.com"] + }, + "Digg": { + "properties": ["digg.com"], + "resources": ["digg.com"] + }, + "DigitalAdConsortium": { + "properties": ["dac.co.jp"], + "resources": ["impact-ad.jp"] + }, + "Digital River": { + "properties": ["digitalriver.com", "keywordmax.com", "netflame.cc"], + "resources": ["digitalriver.com", "keywordmax.com", "netflame.cc"] + }, + "Digital Target": { + "properties": ["digitaltarget.ru"], + "resources": ["digitaltarget.ru"] + }, + "Digitize": { + "properties": ["digitize.ie"], + "resources": ["digitize.ie"] + }, + "DirectAdvert": { + "properties": ["directadvert.ru"], + "resources": ["directadvert.ru"] + }, + "DirectCORP": { + "properties": ["directcorp.de", "ipcounter.de"], + "resources": ["directcorp.de", "ipcounter.de"] + }, + "Direct Response Group": { + "properties": ["directresponsegroup.com"], + "resources": ["directresponsegroup.com", "ppctracking.net"] + }, + "Directtrack": { + "properties": ["directtrack.com"], + "resources": ["directtrack.com"] + }, + "Disqus": { + "properties": ["disqus.com", "disqusads.com"], + "resources": ["disqus.com", "disqusads.com"] + }, + "DistilNetworks": { + "properties": ["distilnetworks.com"], + "resources": ["distilnetworks.com", "distiltag.com"] + }, + "DistrictM": { + "properties": ["districtm.net"], + "resources": ["districtm.io"] + }, + "dmpxs": { + "properties": ["dmpxs.com"], + "resources": ["dmpxs.com"] + }, + "DoublePimp": { + "properties": ["doublepimp.com"], + "resources": ["doublepimp.com"] + }, + "DoublePositive": { + "properties": ["doublepositive.com"], + "resources": ["bid-tag.com", "doublepositive.com"] + }, + "DoubleVerify": { + "properties": ["doubleverify.com"], + "resources": ["doubleverify.com"] + }, + "Drawbridge": { + "properties": ["drawbridge.com"], + "resources": ["adsymptotic.com", "drawbrid.ge", "drawbridge.com"] + }, + "DS-IQ": { + "properties": ["ds-iq.com"], + "resources": ["ds-iq.com"] + }, + "DSNR Group": { + "properties": ["dsnrgroup.com", "dsnrmg.com", "traffiliate.com", "z5x.net"], + "resources": [ + "dsnrgroup.com", + "dsnrmg.com", + "traffiliate.com", + "z5x.com", + "z5x.net" + ] + }, + "dwstat.com": { + "properties": ["dwstat.cn"], + "resources": ["dwstat.cn"] + }, + "DynAdmic": { + "properties": ["dynadmic.com"], + "resources": ["dynadmic.com", "dyntrk.com"] + }, + "DynamicOxygen": { + "properties": ["dynamicoxygen.com", "exitjunction.com"], + "resources": ["dynamicoxygen.com", "exitjunction.com"] + }, + "DynamicYield": { + "properties": ["dynamicyield.com"], + "resources": ["dynamicyield.com"] + }, + "Earnify": { + "properties": ["earnify.com"], + "resources": ["earnify.com"] + }, + "eBay": { + "properties": [ + "ebay.at", + "ebay.ba", + "ebay.be", + "ebay.ca", + "ebay.ch", + "ebay.cn", + "ebay.co.jp", + "ebay.co.kr", + "ebay.co.uk", + "ebay.com", + "ebay.com.au", + "ebay.com.hk", + "ebay.com.my", + "ebay.com.ph", + "ebay.com.sg", + "ebay.com.tw", + "ebay.de", + "ebay.es", + "ebay.fr", + "ebay.ie", + "ebay.in", + "ebay.it", + "ebay.nl", + "ebay.pl" + ], + "resources": ["ebay.com"] + }, + "Echo": { + "properties": ["aboutecho.com", "haloscan.com", "js-kit.com"], + "resources": ["aboutecho.com", "haloscan.com", "js-kit.com"] + }, + "ECSAnalytics": { + "properties": ["ecsanalytics.com", "theecsinc.com"], + "resources": ["ecsanalytics.com"] + }, + "EFF": { + "properties": [ + "do-not-tracker.org", + "eff.org", + "eviltracker.net", + "trackersimulator.org" + ], + "resources": [ + "do-not-tracker.org", + "eff.org", + "eviltracker.net", + "trackersimulator.org" + ] + }, + "Effective Measure": { + "properties": ["effectivemeasure.com", "effectivemeasure.net"], + "resources": ["effectivemeasure.com", "effectivemeasure.net"] + }, + "ekolay": { + "properties": ["hurriyet.com.tr"], + "resources": ["e-kolay.net", "ekolay.net", "hurriyet.com.tr"] + }, + "Eleavers": { + "properties": ["eleavers.com"], + "resources": ["eleavers.com"] + }, + "Emego": { + "properties": ["usemax.de"], + "resources": ["usemax.de"] + }, + "Emerse": { + "properties": ["emerse.com"], + "resources": ["emerse.com"] + }, + "EMX": { + "properties": ["emxdigital.com"], + "resources": [ + "brealtime.com", + "clearstream.tv", + "emxdgt.com", + "emxdigital.com" + ] + }, + "Enecto": { + "properties": ["enecto.com"], + "resources": ["enecto.com"] + }, + "engage:BDR": { + "properties": ["engagebdr.com"], + "resources": ["bnmla.com", "engagebdr.com"] + }, + "Engago Technology": { + "properties": ["engago.com"], + "resources": ["appmetrx.com", "engago.com"] + }, + "Engine Network": { + "properties": ["enginenetwork.com"], + "resources": ["enginenetwork.com"] + }, + "Ensighten": { + "properties": ["ensighten.com"], + "resources": ["ensighten.com"] + }, + "Entireweb": { + "properties": ["entireweb.com"], + "resources": ["entireweb.com"] + }, + "Epic Media Group": { + "properties": [ + "epicadvertising.com", + "epicmarketplace.com", + "theepicmediagroup.com" + ], + "resources": [ + "epicadvertising.com", + "epicmarketplace.com", + "epicmobileads.com", + "theepicmediagroup.com", + "trafficmp.com" + ] + }, + "eProof.com": { + "properties": ["eproof.com"], + "resources": ["eproof.com"] + }, + "Epsilon": { + "properties": ["epsilon.com"], + "resources": ["epsilon.com"] + }, + "EQ Ads": { + "properties": ["eqads.com"], + "resources": ["eqads.com"] + }, + "EroAdvertising": { + "properties": ["ero-advertising.com"], + "resources": ["ero-advertising.com"] + }, + "Etarget": { + "properties": ["etarget.net", "etargetnet.com"], + "resources": ["etarget.net", "etargetnet.com"] + }, + "Etineria": { + "properties": ["adwitserver.com", "etineria.com"], + "resources": ["adwitserver.com", "etineria.com"] + }, + "etracker": { + "properties": ["etracker.com", "etracker.de"], + "resources": [ + "etracker.com", + "etracker.de", + "sedotracker.com", + "sedotracker.de" + ] + }, + "eTrigue": { + "properties": ["etrigue.com"], + "resources": ["etrigue.com"] + }, + "Eulerian Technologies": { + "properties": ["eulerian.com"], + "resources": ["eulerian.com", "eulerian.net"] + }, + "Evergage": { + "properties": ["evergage.com"], + "resources": ["mybuys.com", "veruta.com"] + }, + "Everyday Health": { + "properties": ["everydayhealth.com", "waterfrontmedia.com"], + "resources": ["everydayhealth.com", "waterfrontmedia.com"] + }, + "Evisions Marketing": { + "properties": ["engineseeker.com", "evisionsmarketing.com"], + "resources": ["engineseeker.com", "evisionsmarketing.com"] + }, + "Evolve": { + "properties": ["evolvemediacorp.com", "gorillanation.com"], + "resources": [ + "evolvemediacorp.com", + "evolvemediametrics.com", + "gorillanation.com" + ] + }, + "eWayDirect": { + "properties": ["ewaydirect.com"], + "resources": ["ewaydirect.com", "ixs1.net"] + }, + "ewebse": { + "properties": ["777seo.com", "ewebse.com"], + "resources": ["777seo.com", "ewebse.com"] + }, + "excitad": { + "properties": ["excitad.com"], + "resources": ["excitad.com"] + }, + "eXelate": { + "properties": ["exelate.com"], + "resources": ["exelate.com", "exelator.com"] + }, + "ExoClick": { + "properties": ["exoclick.com"], + "resources": ["exoclick.com"] + }, + "Exosrv": { + "properties": ["exosrv.com"], + "resources": ["exosrv.com"] + }, + "Experian": { + "properties": ["experian.com"], + "resources": ["audienceiq.com", "experian.com"] + }, + "expo-MAX": { + "properties": ["expo-max.com"], + "resources": ["expo-max.com"] + }, + "Exponential Interactive": { + "properties": ["exponential.com", "fulltango.com"], + "resources": [ + "adotube.com", + "exponential.com", + "fulltango.com", + "tribalfusion.com" + ] + }, + "Extension Factory": { + "properties": ["extensionfactory.com"], + "resources": ["extensionfactory.com"] + }, + "EXTENSIONS.RU": { + "properties": ["extensions.ru"], + "resources": ["extensions.ru"] + }, + "eXTReMe digital": { + "properties": ["extremetracking.com"], + "resources": ["extreme-dm.com", "extremetracking.com"] + }, + "Eyeconomy": { + "properties": ["eyeconomy.co.uk"], + "resources": [ + "eyeconomy.co.uk", + "eyeconomy.com", + "sublimemedia.net", + "www.eyeconomy.co.uk" + ] + }, + "EyeNewton": { + "properties": ["eyenewton.ru"], + "resources": ["eyenewton.ru"] + }, + "Eyeota": { + "properties": ["eyeota.net"], + "resources": ["eyeota.net"] + }, + "eyeReturn Marketing": { + "properties": ["eyereturnmarketing.com"], + "resources": ["eyereturn.com", "eyereturnmarketing.com"] + }, + "Eyeviewdigital": { + "properties": ["eyeviewdigital.com"], + "resources": ["eyeviewads.com", "eyeviewdigital.com"] + }, + "Facebook": { + "properties": [ + "atlassolutions.com", + "facebook.com", + "facebook.de", + "facebook.fr", + "facebook.net", + "fb.com", + "fb.me", + "fbcdn.net", + "friendfeed.com", + "instagram.com", + "internalfb.com", + "messenger.com", + "oculus.com", + "whatsapp.com", + "workplace.com" + ], + "resources": [ + "apps.fbsbx.com", + "atdmt.com", + "atlassolutions.com", + "facebook.com", + "facebook.de", + "facebook.fr", + "facebook.net", + "fb.com", + "fb.me", + "fbcdn.net", + "fbsbx.com", + "friendfeed.com", + "instagram.com", + "messenger.com" + ] + }, + "Facilitate Digital": { + "properties": [ + "adsfac.eu", + "adsfac.net", + "adsfac.us", + "facilitatedigital.com" + ], + "resources": [ + "adsfac.eu", + "adsfac.info", + "adsfac.net", + "adsfac.sg", + "adsfac.us", + "facilitatedigital.com" + ] + }, + "Fairfax Media": { + "properties": ["fairfax.com.au", "fxj.com.au", "www.fxj.com.au"], + "resources": ["fairfax.com.au", "fxj.com.au", "www.fxj.com.au"] + }, + "faithadnet": { + "properties": ["faithadnet.com"], + "resources": ["faithadnet.com"] + }, + "Fanplayr": { + "properties": ["fanplayr.com"], + "resources": ["fanplayr.com"] + }, + "Fathom": { + "properties": ["fathomdelivers.com", "fathomseo.com"], + "resources": ["fathomdelivers.com", "fathomseo.com"] + }, + "Federated Media": { + "properties": ["hyfn.com", "lijit.com"], + "resources": ["federatedmedia.net", "fmpub.net", "hyfn.com", "lijit.com"] + }, + "Feedjit": { + "properties": ["feedjit.com"], + "resources": ["feedjit.com"] + }, + "FetchBack": { + "properties": ["fetchback.com"], + "resources": ["fetchback.com"] + }, + "Fiksu": { + "properties": ["fiksu.com"], + "resources": ["fiksu.com"] + }, + "FinancialContent": { + "properties": ["financialcontent.com"], + "resources": ["financialcontent.com"] + }, + "Fizz-Buzz Media": { + "properties": ["fizzbuzzmedia.com", "fizzbuzzmedia.net"], + "resources": ["fizzbuzzmedia.com", "fizzbuzzmedia.net"] + }, + "Flashtalking": { + "properties": ["flashtalking.com"], + "resources": ["encoremetrics.com", "flashtalking.com", "sitecompass.com"] + }, + "Flattr": { + "properties": ["flattr.com"], + "resources": ["flattr.com"] + }, + "Flite": { + "properties": ["flite.com", "widgetserver.com"], + "resources": ["flite.com", "widgetserver.com"] + }, + "Fluct": { + "properties": ["adingo.jp", "fluct.jp"], + "resources": ["adingo.jp", "fluct.jp"] + }, + "Flytxt": { + "properties": ["flytxt.com"], + "resources": ["flytxt.com"] + }, + "Footprint": { + "properties": ["footprintlive.com"], + "resources": ["footprintlive.com"] + }, + "Forbes": { + "properties": ["brandsideplatform.com", "forbes.com"], + "resources": ["brandsideplatform.com", "forbes.com"] + }, + "Foresee": { + "properties": ["foresee.com"], + "resources": ["answerscloud.com"] + }, + "Fox One Stop Media": { + "properties": [ + "fimserve.com", + "foxnetworks.com", + "foxonestop.com", + "mobsmith.com", + "myads.com", + "othersonline.com" + ], + "resources": [ + "fimserve.com", + "foxnetworks.com", + "foxonestop.com", + "mobsmith.com", + "myads.com", + "othersonline.com" + ] + }, + "FreakOut": { + "properties": ["fout.jp"], + "resources": ["fout.jp"] + }, + "Freedom Communications": { + "properties": ["freedom.com"], + "resources": ["freedom.com"] + }, + "Free Online Users": { + "properties": ["freeonlineusers.com"], + "resources": ["freeonlineusers.com"] + }, + "Free-PageRank.com": { + "properties": ["free-pagerank.com"], + "resources": ["free-pagerank.com"] + }, + "FreeWheel": { + "properties": ["freewheel.tv", "fwmrm.net"], + "resources": ["freewheel.tv", "fwmrm.net", "stickyadstv.com"] + }, + "FriendFinder Networks": { + "properties": ["adultfriendfinder.com", "ffn.com", "pop6.com"], + "resources": ["adultfriendfinder.com", "ffn.com", "pop6.com"] + }, + "Friends2Follow": { + "properties": ["friends2follow.com"], + "resources": ["friends2follow.com"] + }, + "Frog Sex": { + "properties": ["double-check.com", "frogsex.com"], + "resources": ["double-check.com", "frogsex.com"] + }, + "FuelX": { + "properties": ["fuelx.com"], + "resources": ["fuel451.com"] + }, + "Fullstory": { + "properties": ["fullstory.com"], + "resources": ["fullstory.com"] + }, + "Future Ads": { + "properties": ["futureads.com", "resultlinks.com"], + "resources": ["futureads.com", "resultlinks.com"] + }, + "Fyber": { + "properties": ["fyber.com"], + "resources": ["fyber.com"] + }, + "Game Advertising Online": { + "properties": ["game-advertising-online.com"], + "resources": ["game-advertising-online.com"] + }, + "Games2win": { + "properties": ["games2win.com", "inviziads.com"], + "resources": ["games2win.com", "inviziads.com"] + }, + "Gamned": { + "properties": ["gamned.com"], + "resources": ["gamned.com"] + }, + "Gannett": { + "properties": ["gannett.com", "pointroll.com"], + "resources": ["gannett.com", "pointroll.com"] + }, + "GB-World": { + "properties": ["gb-world.net"], + "resources": ["gb-world.net"] + }, + "Gemius": { + "properties": ["gemius.com", "gemius.pl"], + "resources": ["gemius.com", "gemius.pl"] + }, + "Genesis Media": { + "properties": ["genesismedia.com"], + "resources": ["genesismedia.com", "genesismediaus.com"] + }, + "GENIEE": { + "properties": ["geniee.co.jp"], + "resources": ["geniee.co.jp", "gssprt.jp"] + }, + "GENIE GROUP": { + "properties": ["geniegroupltd.co.uk", "www.geniegroupltd.co.uk"], + "resources": ["geniegroupltd.co.uk", "www.geniegroupltd.co.uk"] + }, + "Genius.com": { + "properties": ["genius.com", "rsvpgenius.com"], + "resources": ["genius.com", "rsvpgenius.com"] + }, + "GeoAds": { + "properties": ["geoads.com"], + "resources": ["geoads.com"] + }, + "GetGlue": { + "properties": ["elfie.com", "smrtlnks.com"], + "resources": ["getglue.com", "smrtlnks.com"] + }, + "GetIntent": { + "properties": ["adhigh.net", "getintent.com"], + "resources": ["adhigh.net", "getintent.com"] + }, + "Get Satisfaction": { + "properties": ["getsatisfaction.com"], + "resources": ["getsatisfaction.com"] + }, + "GetSiteControl": { + "properties": ["getsitecontrol.com"], + "resources": ["getsitecontrol.com"] + }, + "GfK Group": { + "properties": ["gfk.com"], + "resources": ["daphnecm.com", "gfk.com", "gfkdaphne.com"] + }, + "Gigya": { + "properties": ["gigya.com"], + "resources": ["gigcount.com", "gigya.com"] + }, + "GISMAds": { + "properties": ["gismads.jp"], + "resources": ["gismads.jp"] + }, + "GitHub": { + "properties": ["gaug.es", "github.com"], + "resources": ["gaug.es", "github.com"] + }, + "Glam Media": { + "properties": ["glam.com", "glammedia.com"], + "resources": ["glam.com", "glammedia.com"] + }, + "Gleam": { + "properties": ["gleam.io"], + "resources": ["fraudjs.io", "gleam.io"] + }, + "Global Takeoff": { + "properties": ["globaltakeoff.com", "globaltakeoff.net"], + "resources": ["globaltakeoff.com", "globaltakeoff.net"] + }, + "Globe7": { + "properties": ["globe7.com"], + "resources": ["globe7.com"] + }, + "Go Daddy": { + "properties": ["godaddy.com", "trafficfacts.com"], + "resources": ["godaddy.com", "trafficfacts.com"] + }, + "GoDataFeed": { + "properties": ["godatafeed.com"], + "resources": ["godatafeed.com"] + }, + "GoGrid": { + "properties": ["datapipe.com", "formalyzer.com"], + "resources": ["datapipe.com", "formalyzer.com", "gogrid.com", "komli.net"] + }, + "Goldbach": { + "properties": ["goldbachgroup.com"], + "resources": ["goldbach.com", "goldbachgroup.com"] + }, + "GoldSpot Media": { + "properties": ["goldspotmedia.com"], + "resources": ["goldspotmedia.com"] + }, + "Google": { + "properties": [ + "abc.xyz", + "admeld.com", + "blogger.com", + "blogspot.com", + "crashlytics.com", + "google-melange.com", + "google.ac", + "google.ad", + "google.ae", + "google.al", + "google.am", + "google.as", + "google.at", + "google.az", + "google.ba", + "google.be", + "google.bf", + "google.bg", + "google.bi", + "google.bj", + "google.bs", + "google.bt", + "google.by", + "google.ca", + "google.cat", + "google.cd", + "google.cf", + "google.cg", + "google.ch", + "google.ci", + "google.cl", + "google.cm", + "google.cn", + "google.co.ao", + "google.co.bw", + "google.co.ck", + "google.co.cr", + "google.co.id", + "google.co.il", + "google.co.in", + "google.co.jp", + "google.co.ke", + "google.co.kr", + "google.co.ls", + "google.co.ma", + "google.co.mz", + "google.co.nz", + "google.co.th", + "google.co.tz", + "google.co.ug", + "google.co.uk", + "google.co.uz", + "google.co.ve", + "google.co.vi", + "google.co.za", + "google.co.zm", + "google.co.zw", + "google.com", + "google.com.af", + "google.com.ag", + "google.com.ai", + "google.com.ar", + "google.com.au", + "google.com.bd", + "google.com.bh", + "google.com.bn", + "google.com.bo", + "google.com.br", + "google.com.bz", + "google.com.co", + "google.com.cu", + "google.com.cy", + "google.com.do", + "google.com.ec", + "google.com.eg", + "google.com.et", + "google.com.fj", + "google.com.gh", + "google.com.gi", + "google.com.gt", + "google.com.hk", + "google.com.jm", + "google.com.kh", + "google.com.kw", + "google.com.lb", + "google.com.ly", + "google.com.mm", + "google.com.mt", + "google.com.mx", + "google.com.my", + "google.com.na", + "google.com.nf", + "google.com.ng", + "google.com.ni", + "google.com.np", + "google.com.om", + "google.com.pa", + "google.com.pe", + "google.com.pg", + "google.com.ph", + "google.com.pk", + "google.com.pr", + "google.com.py", + "google.com.qa", + "google.com.sa", + "google.com.sb", + "google.com.sg", + "google.com.sl", + "google.com.sv", + "google.com.tj", + "google.com.tr", + "google.com.tw", + "google.com.ua", + "google.com.uy", + "google.com.vc", + "google.com.vn", + "google.cv", + "google.cz", + "google.de", + "google.dj", + "google.dk", + "google.dm", + "google.dz", + "google.ee", + "google.es", + "google.fi", + "google.fm", + "google.fr", + "google.ga", + "google.ge", + "google.gg", + "google.gl", + "google.gm", + "google.gp", + "google.gr", + "google.gy", + "google.hn", + "google.hr", + "google.ht", + "google.hu", + "google.ie", + "google.im", + "google.iq", + "google.is", + "google.it", + "google.je", + "google.jo", + "google.kg", + "google.ki", + "google.kz", + "google.la", + "google.li", + "google.lk", + "google.lt", + "google.lu", + "google.lv", + "google.md", + "google.me", + "google.mg", + "google.mk", + "google.ml", + "google.mn", + "google.ms", + "google.mu", + "google.mv", + "google.mw", + "google.ne", + "google.nl", + "google.no", + "google.nr", + "google.nu", + "google.pl", + "google.pn", + "google.ps", + "google.pt", + "google.ro", + "google.rs", + "google.ru", + "google.rw", + "google.sc", + "google.se", + "google.sh", + "google.si", + "google.sk", + "google.sm", + "google.sn", + "google.so", + "google.st", + "google.td", + "google.tg", + "google.tk", + "google.tl", + "google.tm", + "google.tn", + "google.to", + "google.tt", + "google.vg", + "google.vu", + "google.ws", + "googlesource.com", + "ingress.com", + "nest.com", + "panoramio.com", + "pinpoint-dot-chromeperf.appspot.com", + "youtube.com" + ], + "resources": [ + "2mdn.net", + "admeld.com", + "admob.com", + "apture.com", + "blogger.com", + "cc-dt.com", + "crashlytics.com", + "destinationurl.com", + "doubleclick.net", + "ggpht.com", + "gmail.com", + "gmodules.com", + "google-analytics.com", + "google.ac", + "google.ad", + "google.ae", + "google.al", + "google.am", + "google.as", + "google.at", + "google.az", + "google.ba", + "google.be", + "google.bf", + "google.bg", + "google.bi", + "google.bj", + "google.bs", + "google.bt", + "google.by", + "google.ca", + "google.cat", + "google.cc", + "google.cd", + "google.cf", + "google.cg", + "google.ch", + "google.ci", + "google.cl", + "google.cm", + "google.cn", + "google.co.ao", + "google.co.bw", + "google.co.ck", + "google.co.cr", + "google.co.id", + "google.co.il", + "google.co.in", + "google.co.jp", + "google.co.ke", + "google.co.kr", + "google.co.ls", + "google.co.ma", + "google.co.mz", + "google.co.nz", + "google.co.th", + "google.co.tz", + "google.co.ug", + "google.co.uk", + "google.co.uz", + "google.co.ve", + "google.co.vi", + "google.co.za", + "google.co.zm", + "google.co.zw", + "google.com", + "google.com.af", + "google.com.ag", + "google.com.ai", + "google.com.ar", + "google.com.au", + "google.com.bd", + "google.com.bh", + "google.com.bn", + "google.com.bo", + "google.com.br", + "google.com.bz", + "google.com.co", + "google.com.cu", + "google.com.cy", + "google.com.do", + "google.com.ec", + "google.com.eg", + "google.com.et", + "google.com.fj", + "google.com.gh", + "google.com.gi", + "google.com.gt", + "google.com.hk", + "google.com.jm", + "google.com.kh", + "google.com.kw", + "google.com.lb", + "google.com.lc", + "google.com.ly", + "google.com.mm", + "google.com.mt", + "google.com.mx", + "google.com.my", + "google.com.na", + "google.com.nf", + "google.com.ng", + "google.com.ni", + "google.com.np", + "google.com.om", + "google.com.pa", + "google.com.pe", + "google.com.pg", + "google.com.ph", + "google.com.pk", + "google.com.pr", + "google.com.py", + "google.com.qa", + "google.com.sa", + "google.com.sb", + "google.com.sg", + "google.com.sl", + "google.com.sv", + "google.com.tj", + "google.com.tn", + "google.com.tr", + "google.com.tw", + "google.com.ua", + "google.com.uy", + "google.com.vc", + "google.com.vn", + "google.cv", + "google.cz", + "google.de", + "google.dj", + "google.dk", + "google.dm", + "google.dz", + "google.ee", + "google.es", + "google.fi", + "google.fm", + "google.fr", + "google.ga", + "google.ge", + "google.gf", + "google.gg", + "google.gl", + "google.gm", + "google.gp", + "google.gr", + "google.gy", + "google.hn", + "google.hr", + "google.ht", + "google.hu", + "google.ie", + "google.im", + "google.io", + "google.iq", + "google.is", + "google.it", + "google.je", + "google.jo", + "google.kg", + "google.ki", + "google.kz", + "google.la", + "google.li", + "google.lk", + "google.lt", + "google.lu", + "google.lv", + "google.md", + "google.me", + "google.mg", + "google.mk", + "google.ml", + "google.mn", + "google.ms", + "google.mu", + "google.mv", + "google.mw", + "google.ne", + "google.nl", + "google.no", + "google.nr", + "google.nu", + "google.pl", + "google.pn", + "google.ps", + "google.pt", + "google.ro", + "google.rs", + "google.ru", + "google.rw", + "google.sc", + "google.se", + "google.sh", + "google.si", + "google.sk", + "google.sm", + "google.sn", + "google.so", + "google.st", + "google.td", + "google.tg", + "google.tk", + "google.tl", + "google.tm", + "google.tn", + "google.to", + "google.tt", + "google.vg", + "google.vu", + "google.ws", + "googleadservices.com", + "googleapis.com", + "googlemail.com", + "googlesyndication.com", + "googletagservices.com", + "googleusercontent.com", + "googlevideo.com", + "gstatic.com", + "invitemedia.com", + "postrank.com", + "recaptcha.net", + "smtad.net", + "youtube.com" + ] + }, + "GoSquared": { + "properties": ["gosquared.com"], + "resources": ["gosquared.com"] + }, + "GoStats": { + "properties": ["gostats.com"], + "resources": ["gostats.com"] + }, + "Grapeshot": { + "properties": ["grapeshot.co.uk", "www.grapeshot.co.uk"], + "resources": ["grapeshot.co.uk", "www.grapeshot.co.uk"] + }, + "GrapheneMedia": { + "properties": ["graphenemedia.in"], + "resources": ["graphenedigitalanalytics.in"] + }, + "Graphnium": { + "properties": ["graphinium.com"], + "resources": ["crm4d.com"] + }, + "Gravity": { + "properties": ["gravity.com", "grvcdn.com"], + "resources": ["gravity.com", "grvcdn.com"] + }, + "Gridcash": { + "properties": ["adless.io", "gridcash.net"], + "resources": ["adless.io", "gridcash.net"] + }, + "Grocery Shopping Network": { + "properties": ["groceryshopping.net"], + "resources": ["groceryshopping.net"] + }, + "GroovinAds": { + "properties": ["groovinads.com"], + "resources": ["groovinads.com"] + }, + "Gruner + Jahr": { + "properties": ["guj.de", "ligatus.com"], + "resources": ["guj.de", "ligatus.com"] + }, + "GTop": { + "properties": ["arenaweb.ro"], + "resources": ["arenaweb.ro", "gtop.ro", "gtopstats.com"] + }, + "GumGum": { + "properties": ["gumgum.com"], + "resources": ["gumgum.com"] + }, + "Gunggo": { + "properties": ["gunggo.com"], + "resources": ["gunggo.com"] + }, + "Hands Mobile": { + "properties": ["hands.com.br", "www.hands.com.br"], + "resources": ["hands.com.br", "www.hands.com.br"] + }, + "Harrenmedia": { + "properties": ["harrenmedia.com", "harrenmedianetwork.com"], + "resources": ["harrenmedia.com", "harrenmedianetwork.com"] + }, + "HealthPricer": { + "properties": ["adacado.com", "healthpricer.com"], + "resources": ["adacado.com", "healthpricer.com"] + }, + "Hearst": { + "properties": [ + "hearst.com", + "ic-live.com", + "iclive.com", + "icrossing.com", + "raasnet.com" + ], + "resources": [ + "hearst.com", + "ic-live.com", + "iclive.com", + "icrossing.com", + "raasnet.com", + "redaril.com", + "sptag.com", + "sptag1.com", + "sptag2.com", + "sptag3.com" + ] + }, + "Heyzap": { + "properties": ["heyzap.com"], + "resources": ["heyzap.com"] + }, + "HilltopAds": { + "properties": ["hilltopads.com"], + "resources": ["hilltopads.com", "hilltopads.net", "shoporielder.pro"] + }, + "Hi-media": { + "properties": ["himediagroup.com"], + "resources": ["comclick.com", "hi-media.com", "himediagroup.com"] + }, + "Histats": { + "properties": ["histats.com"], + "resources": ["histats.com"] + }, + "HitsLink": { + "properties": ["hitslink.com"], + "resources": ["hitslink.com"] + }, + "Hit Sniffer": { + "properties": ["hitsniffer.com"], + "resources": ["hitsniffer.com"] + }, + "Horyzon Media": { + "properties": ["horyzon-media.com"], + "resources": ["horyzon-media.com"] + }, + "HotelChamp": { + "properties": ["hotelchamp.com"], + "resources": ["hotelchamp.com"] + }, + "Hotjar": { + "properties": ["hotjar.com"], + "resources": ["hotjar.com"] + }, + "HotMart": { + "properties": ["hotmart.com"], + "resources": ["hotmart.com"] + }, + "HOTWords": { + "properties": ["hotwords.com", "hotwords.es"], + "resources": ["hotwords.com", "hotwords.es"] + }, + "HP": { + "properties": ["hp.com", "opentext.com", "optimost.com"], + "resources": ["hp.com", "optimost.com"] + }, + "Httpool": { + "properties": ["httpool.com"], + "resources": ["httpool.com"] + }, + "HubSpot": { + "properties": ["hubspot.com"], + "resources": ["hs-analytics.net", "hubspot.com"] + }, + "HUNT Mobile Ads": { + "properties": ["huntmads.com"], + "resources": ["huntmads.com"] + }, + "Hurra.com": { + "properties": ["hurra.com"], + "resources": ["hurra.com"] + }, + "IAB": { + "properties": ["digitru.st", "iabtechlab.com"], + "resources": ["digitru.st"] + }, + "IAC": { + "properties": ["iac.com", "iacadvertising.com"], + "resources": ["iac.com", "iacadvertising.com"] + }, + "iBehavior": { + "properties": ["i-behavior.com", "ib-ibi.com"], + "resources": ["i-behavior.com", "ib-ibi.com"] + }, + "IBM": { + "properties": ["ibm.com", "multicloud-ibm.com"], + "resources": [ + "cmcore.com", + "coremetrics.com", + "ibm.com", + "unica.com", + "xtify.com" + ] + }, + "ID5": { + "properties": ["id5.io"], + "resources": ["id5-sync.com"] + }, + "IDG": { + "properties": ["idg.com", "idgtechnetwork.com"], + "resources": ["idg.com", "idgtechnetwork.com"] + }, + "iEntry": { + "properties": ["600z.com", "ientry.com"], + "resources": ["600z.com", "ientry.com"] + }, + "IgnitAd": { + "properties": ["ignitad.com"], + "resources": ["ignitad.com"] + }, + "IgnitionOne": { + "properties": ["ignitionone.com", "ignitionone.net", "searchignite.com"], + "resources": ["ignitionone.com", "ignitionone.net", "searchignite.com"] + }, + "iMedia": { + "properties": ["imedia.cz"], + "resources": ["imedia.cz"] + }, + "Improve Digital": { + "properties": ["360yield.com", "improvedigital.com"], + "resources": ["360yield.com", "improvedigital.com"] + }, + "Inadco": { + "properties": ["inadco.com"], + "resources": ["anadcoads.com", "inadco.com", "inadcoads.com"] + }, + "InboundWriter": { + "properties": ["enquisite.com", "inboundwriter.com"], + "resources": ["enquisite.com", "inboundwriter.com"] + }, + "IndexExchange": { + "properties": ["indexexchange.com"], + "resources": ["indexexchange.com"] + }, + "Infectious Media": { + "properties": ["infectiousmedia.com"], + "resources": ["impressiondesk.com", "infectiousmedia.com"] + }, + "Infernotions": { + "properties": ["infernotions.com"], + "resources": ["infernotions.com"] + }, + "Inflection Point Media": { + "properties": ["inflectionpointmedia.com"], + "resources": ["inflectionpointmedia.com"] + }, + "Infogroup": { + "properties": ["infogroup.com"], + "resources": ["infogroup.com"] + }, + "Infolinks": { + "properties": ["infolinks.com"], + "resources": ["infolinks.com"] + }, + "INFOnline": { + "properties": ["infonline.de"], + "resources": ["infonline.de", "ioam.de", "ivwbox.de"] + }, + "InfoStars": { + "properties": ["hotlog.ru", "infostars.ru"], + "resources": ["hotlog.ru", "infostars.ru"] + }, + "Infra-Ad": { + "properties": ["infra-ad.com"], + "resources": ["infra-ad.com"] + }, + "InMobi": { + "properties": ["aerserv.com", "inmobi.com", "sproutinc.com"], + "resources": ["aerserv.com", "inmobi.com", "sproutinc.com"] + }, + "inneractive": { + "properties": ["inner-active.com"], + "resources": ["inner-active.com"] + }, + "Innity": { + "properties": ["innity.com"], + "resources": ["innity.com"] + }, + "InsightExpress": { + "properties": ["insightexpress.com"], + "resources": ["insightexpress.com", "insightexpressai.com"] + }, + "InSkin Media": { + "properties": ["inskinmedia.com"], + "resources": ["inskinmedia.com"] + }, + "Inspectlet": { + "properties": ["inspectlet.com"], + "resources": ["inspectlet.com"] + }, + "Instinctive": { + "properties": ["instinctive.io"], + "resources": ["instinctive.io", "instinctiveads.com"] + }, + "Integral Ad Science": { + "properties": ["integralads.com"], + "resources": [ + "adsafemedia.com", + "adsafeprotected.com", + "iasds01.com", + "integralads.com" + ] + }, + "IntelligenceFocus": { + "properties": ["intelligencefocus.com", "leadchampion.com"], + "resources": ["domodomain.com", "intelligencefocus.com", "leadchampion.com"] + }, + "Intent Media": { + "properties": ["intentmedia.com"], + "resources": ["intentmedia.com", "intentmedia.net"] + }, + "Intergi": { + "properties": ["intergi.com"], + "resources": ["intergi.com"] + }, + "Intermarkets": { + "properties": ["intermarkets.net"], + "resources": ["intermarkets.net"] + }, + "Intermundo Media": { + "properties": ["intermundomedia.com"], + "resources": ["intermundomedia.com"] + }, + "Internet Brands": { + "properties": ["ibpxl.com", "internetbrands.com"], + "resources": ["ibpxl.com", "internetbrands.com"] + }, + "Interpolls": { + "properties": ["interpolls.com"], + "resources": ["interpolls.com"] + }, + "Inuvo": { + "properties": ["inuvo.com"], + "resources": ["inuvo.com"] + }, + "InvestingChannel": { + "properties": ["investingchannel.com"], + "resources": ["investingchannel.com"] + }, + "iovation": { + "properties": ["iovation.com"], + "resources": ["iesnare.com", "iovation.com"] + }, + "iPerceptions": { + "properties": ["iperceptions.com"], + "resources": ["iperceptions.com"] + }, + "IponWeb": { + "properties": ["iponweb.com"], + "resources": ["iponweb.com", "iponweb.net"] + }, + "iPROM": { + "properties": [ + "centraliprom.com", + "iprom.net", + "iprom.si", + "mediaiprom.com" + ], + "resources": ["centraliprom.com", "iprom.net", "iprom.si", "mediaiprom.com"] + }, + "iPromote": { + "properties": ["ipromote.com"], + "resources": ["ipromote.com"] + }, + "iProspect": { + "properties": ["iprospect.com"], + "resources": ["clickmanage.com", "iprospect.com"] + }, + "ISI Technologies": { + "properties": ["adversalservers.com", "digbro.com"], + "resources": ["adversalservers.com", "digbro.com"] + }, + "IslayTech": { + "properties": ["islay.tech"], + "resources": ["islay.tech"] + }, + "ismatlab.com": { + "properties": ["ismatlab.com"], + "resources": ["ismatlab.com"] + }, + "Itch": { + "properties": ["itch.io"], + "resources": ["itch.io"] + }, + "ItIsATracker": { + "properties": ["itisatracker.com"], + "resources": ["itisatracker.com"] + }, + "I.UA": { + "properties": ["i.ua"], + "resources": ["i.ua"] + }, + "Jaroop": { + "properties": ["jaroop.com"], + "resources": ["jaroop.com"] + }, + "JasperLabs": { + "properties": ["jasperlabs.com"], + "resources": ["jasperlabs.com"] + }, + "Jemm": { + "properties": ["jemmgroup.com"], + "resources": ["jemmgroup.com"] + }, + "Jink": { + "properties": ["jink.de", "jinkads.com"], + "resources": ["jink.de", "jinkads.com"] + }, + "Jirbo": { + "properties": ["adcolony.com"], + "resources": ["adcolony.com", "jirbo.com"] + }, + "Jivox": { + "properties": ["jivox.com"], + "resources": ["jivox.com"] + }, + "JobThread": { + "properties": ["jobthread.com"], + "resources": ["jobthread.com"] + }, + "JSE": { + "properties": ["jsecoin.com"], + "resources": [ + "freecontent.bid", + "freecontent.date", + "freecontent.stream", + "hashing.win", + "hostingcloud.racing", + "hostingcloud.science", + "jsecoin.com" + ] + }, + "JuicyAds": { + "properties": ["juicyads.com"], + "resources": ["juicyads.com"] + }, + "Jumptap": { + "properties": ["jumptap.com"], + "resources": ["jumptap.com"] + }, + "justuno": { + "properties": ["justuno.com"], + "resources": ["justuno.com"] + }, + "Kaltura": { + "properties": ["kaltura.com"], + "resources": ["kaltura.com"] + }, + "Kargo": { + "properties": ["kargo.com"], + "resources": ["kargo.com"] + }, + "Kenshoo": { + "properties": ["kenshoo.com", "xg4ken.com"], + "resources": ["kenshoo.com", "xg4ken.com"] + }, + "Keyade": { + "properties": ["keyade.com"], + "resources": ["keyade.com"] + }, + "KeyMetric": { + "properties": ["keymetric.net"], + "resources": ["keymetric.net"] + }, + "Keywee": { + "properties": ["keywee.co"], + "resources": ["keywee.co"] + }, + "kikin": { + "properties": ["kikin.com"], + "resources": ["kikin.com"] + }, + "KISSmetrics": { + "properties": ["kissmetrics.com"], + "resources": ["kissmetrics.com"] + }, + "KissMyAds": { + "properties": ["kissmyads.com"], + "resources": ["kissmyads.com"] + }, + "Kitara Media": { + "properties": ["103092804.com", "kitaramedia.com"], + "resources": ["103092804.com", "kitaramedia.com"] + }, + "Kitcode": { + "properties": ["kitcode.net"], + "resources": ["kitcode.net"] + }, + "KIT digital": { + "properties": ["kitd.com"], + "resources": ["keewurd.com", "kitd.com", "peerset.com"] + }, + "Kokteyl": { + "properties": ["admost.com", "kokteyl.com"], + "resources": ["admost.com", "kokteyl.com"] + }, + "Komli": { + "properties": ["komli.com"], + "resources": ["komli.com"] + }, + "Konduto": { + "properties": ["konduto.com"], + "resources": ["k-analytix.com", "konduto.com"] + }, + "Kontera": { + "properties": ["kontera.com"], + "resources": ["kontera.com"] + }, + "Korrelate": { + "properties": ["korrelate.com"], + "resources": ["adsummos.com", "adsummos.net", "korrelate.com"] + }, + "Krux": { + "properties": ["krux.com", "kruxdigital.com"], + "resources": ["krux.com", "kruxdigital.com", "krxd.net"] + }, + "Lakana": { + "properties": ["lakana.com"], + "resources": ["ibsys.com", "lakana.com"] + }, + "Layer-Ad.org": { + "properties": ["layer-ad.org"], + "resources": ["layer-ad.org"] + }, + "Layer Ads": { + "properties": ["layer-ads.net"], + "resources": ["layer-ads.net"] + }, + "LeadBolt": { + "properties": ["leadbolt.com"], + "resources": ["leadbolt.com"] + }, + "LeadForensics": { + "properties": ["leadforensics.com"], + "resources": ["leadforensics.com"] + }, + "LeadFormix": { + "properties": ["calliduscloud.com", "leadforce1.com", "leadformix.com"], + "resources": ["calliduscloud.com", "leadforce1.com", "leadformix.com"] + }, + "LeadsHub": { + "properties": ["ztsrv.com"], + "resources": ["ztsrv.com"] + }, + "LeanPlum": { + "properties": ["leanplum.com"], + "resources": ["leanplum.com"] + }, + "Legolas Media": { + "properties": ["legolas-media.com"], + "resources": ["legolas-media.com"] + }, + "Levexis": { + "properties": ["levexis.com"], + "resources": ["levexis.com"] + }, + "Lexos Media": { + "properties": ["adbull.com", "lexosmedia.com"], + "resources": ["adbull.com", "lexosmedia.com"] + }, + "LifeStreet": { + "properties": ["lfstmedia.com", "lifestreetmedia.com"], + "resources": ["lfstmedia.com", "lifestreetmedia.com"] + }, + "Limelight Networks": { + "properties": ["limelight.com"], + "resources": ["clickability.com", "limelight.com", "llnwd.net"] + }, + "LineZing": { + "properties": ["linezing.com"], + "resources": ["linezing.com"] + }, + "LinkConnector": { + "properties": ["linkconnector.com"], + "resources": ["linkconnector.com"] + }, + "LinkedIn": { + "properties": ["linkedin.com"], + "resources": ["licdn.com", "linkedin.com"] + }, + "LinkShare": { + "properties": ["rakutenmarketing.com"], + "resources": ["linkshare.com", "linksynergy.com", "rakutenmarketing.com"] + }, + "Linkz": { + "properties": ["linkz.net"], + "resources": ["linkz.net"] + }, + "Listrak": { + "properties": ["listrak.com", "listrakbi.com"], + "resources": ["listrak.com", "listrakbi.com"] + }, + "LiveIntent": { + "properties": ["liveintent.com"], + "resources": ["liadm.com", "liveintent.com"] + }, + "LiveInternet": { + "properties": ["liveinternet.ru", "yadro.ru"], + "resources": ["liveinternet.ru", "yadro.ru"] + }, + "LivePerson": { + "properties": ["liveperson.com"], + "resources": ["liveperson.com", "liveperson.net", "nuconomy.com"] + }, + "LiveRail": { + "properties": ["liverail.com"], + "resources": ["liverail.com"] + }, + "LiveRamp": { + "properties": ["liveramp.com"], + "resources": ["liveramp.com", "tvpixel.com"] + }, + "LKQD": { + "properties": ["lkqd.com", "lkqd.net"], + "resources": ["lkqd.com", "lkqd.net"] + }, + "Local Yokel Media": { + "properties": ["localyokelmedia.com"], + "resources": ["localyokelmedia.com"] + }, + "Localytics": { + "properties": ["localytics.com"], + "resources": ["localytics.com"] + }, + "LockerDome": { + "properties": ["lockerdome.com"], + "resources": ["lockerdome.com"] + }, + "Lockerz": { + "properties": ["lockerz.com"], + "resources": ["lockerz.com"] + }, + "Logdy": { + "properties": ["logdy.com"], + "resources": ["logdy.com"] + }, + "Longboard Media": { + "properties": ["longboardmedia.com"], + "resources": ["longboardmedia.com"] + }, + "LongTail Video": { + "properties": ["jwplayer.com"], + "resources": ["longtailvideo.com", "ltassrv.com"] + }, + "Loomia": { + "properties": ["loomia.com"], + "resources": ["loomia.com"] + }, + "LoopFuse": { + "properties": ["lfov.net", "loopfuse.net"], + "resources": ["lfov.net", "loopfuse.net"] + }, + "LoopMe": { + "properties": ["loopme.com"], + "resources": ["loopme.com"] + }, + "Lotame": { + "properties": ["crwdcntrl.net", "lotame.com"], + "resources": ["crwdcntrl.net", "lotame.com"] + }, + "LotLinx": { + "properties": ["lotlinx.com"], + "resources": ["lotlinx.com"] + }, + "Lower My Bills": { + "properties": ["lowermybills.com"], + "resources": ["lowermybills.com"] + }, + "lptracker": { + "properties": ["lptracker.io"], + "resources": ["lptracker.io"] + }, + "LucidMedia": { + "properties": ["lucidmedia.com"], + "resources": ["lucidmedia.com"] + }, + "LuckyOrange": { + "properties": ["luckyorange.com"], + "resources": ["luckyorange.com", "luckyorange.net"] + }, + "Lynchpin": { + "properties": ["lynchpin.com"], + "resources": ["lynchpin.com", "lypn.com"] + }, + "Lyris": { + "properties": ["aurea.com"], + "resources": ["aurea.com", "clicktracks.com", "lyris.com"] + }, + "Lytiks": { + "properties": ["lytiks.com"], + "resources": ["lytiks.com"] + }, + "m6d": { + "properties": ["dstillery.com"], + "resources": ["dstillery.com", "m6d.com", "media6degrees.com"] + }, + "Madhouse": { + "properties": ["madhouse.cn"], + "resources": ["madhouse.cn"] + }, + "Madison Logic": { + "properties": ["dinclinx.com", "madisonlogic.com"], + "resources": ["dinclinx.com", "madisonlogic.com"] + }, + "madvertise": { + "properties": ["madvertise.com"], + "resources": ["madvertise.com"] + }, + "Magnetic": { + "properties": ["domdex.net", "magnetic.com"], + "resources": ["domdex.com", "domdex.net", "magnetic.com", "qjex.net"] + }, + "Magnify360": { + "properties": ["dialogmgr.com", "magnify360.com"], + "resources": ["dialogmgr.com", "magnify360.com"] + }, + "MailChimp": { + "properties": ["campaign-archive1.com", "mailchi.mp", "mailchimp.com"], + "resources": [ + "campaign-archive1.com", + "list-manage.com", + "mailchi.mp", + "mailchimp.com" + ] + }, + "Mail.Ru": { + "properties": ["list.ru", "mail.ru"], + "resources": ["list.ru", "mail.ru"] + }, + "Manifest": { + "properties": ["bannerbank.ru", "manifest.ru"], + "resources": ["bannerbank.ru", "manifest.ru"] + }, + "Marchex": { + "properties": ["industrybrains.com", "marchex.com"], + "resources": ["industrybrains.com", "marchex.com"] + }, + "Marimedia": { + "properties": ["marimedia.net"], + "resources": ["marimedia.net"] + }, + "MarketGid": { + "properties": ["dt00.net", "dt07.net", "marketgid.com"], + "resources": ["dt00.net", "dt07.net", "marketgid.com"] + }, + "Marketo": { + "properties": ["marketo.com"], + "resources": ["marketo.com", "marketo.net"] + }, + "Markit": { + "properties": ["markit.com", "wsod.com"], + "resources": ["markit.com", "wsod.com"] + }, + "MarkMonitor": { + "properties": ["9c9media.ca", "markmonitor.com"], + "resources": ["9c9media.ca", "markmonitor.com"] + }, + "Marktest": { + "properties": ["marktest.com", "marktest.pt"], + "resources": ["marktest.com", "marktest.pt"] + }, + "Martini Media": { + "properties": ["martiniadnetwork.com"], + "resources": ["martiniadnetwork.com", "martinimedianetwork.com"] + }, + "mashero": { + "properties": ["mashero.com"], + "resources": ["mashero.com"] + }, + "MashLogic": { + "properties": ["mashlogic.com"], + "resources": ["mashlogic.com"] + }, + "Match.com": { + "properties": ["chemistry.com", "match.com"], + "resources": ["chemistry.com", "match.com", "meetic-partners.com"] + }, + "Matomy": { + "properties": ["matomy.com"], + "resources": [ + "adnetinteractive.com", + "adsmarket.com", + "matomy.com", + "matomymarket.com", + "matomymedia.com", + "mediawhiz.com", + "optimatic.com", + "xtendmedia.com" + ] + }, + "MaxBounty": { + "properties": ["maxbounty.com", "mb01.com"], + "resources": ["maxbounty.com", "mb01.com"] + }, + "MaxMind": { + "properties": ["maxmind.com"], + "resources": ["maxmind.com", "mmapiws.com"] + }, + "MaxPoint": { + "properties": ["maxpointinteractive.com", "maxusglobal.com", "mxptint.net"], + "resources": ["maxpointinteractive.com", "maxusglobal.com", "mxptint.net"] + }, + "McAfee": { + "properties": ["mcafee.com", "mcafeesecure.com"], + "resources": ["mcafee.com", "mcafeesecure.com", "scanalert.com"] + }, + "MdotM": { + "properties": ["mdotm.com"], + "resources": ["mdotm.com"] + }, + "MediaBrix": { + "properties": ["mediabrix.com"], + "resources": ["mediabrix.com"] + }, + "MediaCom": { + "properties": ["mediacom.com"], + "resources": ["mediacom.com"] + }, + "mediaFORGE": { + "properties": ["mediaforge.com"], + "resources": ["mediaforge.com"] + }, + "Medialets": { + "properties": ["medialets.com"], + "resources": ["medialets.com"] + }, + "MediaMath": { + "properties": ["mediamath.com"], + "resources": [ + "adroitinteractive.com", + "designbloxlive.com", + "mathtag.com", + "mediamath.com" + ] + }, + "Médiamétrie-eStat": { + "properties": ["mediametrie-estat.com"], + "resources": ["estat.com", "mediametrie-estat.com"] + }, + "media.net": { + "properties": ["media.net"], + "resources": ["media.net"] + }, + "Mediaocean": { + "properties": ["adbuyer.com", "mediaocean.com"], + "resources": ["adbuyer.com", "mediaocean.com"] + }, + "MediaShakers": { + "properties": ["media-servers.net", "mediashakers.com"], + "resources": ["media-servers.net", "mediashakers.com"] + }, + "MediaTrust": { + "properties": ["mediatrust.com"], + "resources": ["mediatrust.com"] + }, + "Medicx Media Solutions": { + "properties": ["medicxmedia.com"], + "resources": ["medicxmedia.com"] + }, + "Meebo": { + "properties": ["meebo.com"], + "resources": ["meebo.com", "meebocdn.net"] + }, + "MegaIndex": { + "properties": ["megaindex.ru"], + "resources": ["megaindex.ru"] + }, + "Mercadopago": { + "properties": [ + "mercadolibre.cl", + "mercadolibre.co.cr", + "mercadolibre.com", + "mercadolibre.com.ar", + "mercadolibre.com.bo", + "mercadolibre.com.co", + "mercadolibre.com.do", + "mercadolibre.com.ec", + "mercadolibre.com.gt", + "mercadolibre.com.hn", + "mercadolibre.com.mx", + "mercadolibre.com.ni", + "mercadolibre.com.pa", + "mercadolibre.com.pe", + "mercadolibre.com.py", + "mercadolibre.com.sv", + "mercadolibre.com.uy", + "mercadolibre.com.ve", + "mercadolivre.com.br", + "mercadopago.com" + ], + "resources": ["mercadopago.com"] + }, + "Mercent": { + "properties": ["mercent.com"], + "resources": ["mercent.com"] + }, + "MerchantAdvantage": { + "properties": ["merchantadvantage.com"], + "resources": ["merchantadvantage.com"] + }, + "Merchenta": { + "properties": ["merchenta.com"], + "resources": ["merchenta.com"] + }, + "Merkle": { + "properties": ["merkleinc.com", "rkdms.com"], + "resources": ["merkleinc.com", "rimmkaufman.com", "rkdms.com"] + }, + "Meta Network": { + "properties": ["metanetwork.com"], + "resources": ["metanetwork.com"] + }, + "Meteor": { + "properties": ["meteorsolutions.com"], + "resources": ["meteorsolutions.com"] + }, + "MetrixLab": { + "properties": [ + "crm-metrix.com", + "customerconversio.com", + "metrixlab.com", + "opinionbar.com" + ], + "resources": [ + "adoftheyear.com", + "crm-metrix.com", + "customerconversio.com", + "metrixlab.com", + "opinionbar.com" + ] + }, + "MicroAd": { + "properties": ["microad.jp", "www.microad.jp"], + "resources": ["microad.jp", "www.microad.jp"] + }, + "Microsoft": { + "properties": [ + "acompli.net", + "aka.ms", + "azure.com", + "azure.net", + "azurerms.com", + "bing.com", + "cloudappsecurity.com", + "gamesforwindows.com", + "getgamesmart.com", + "gfx.ms", + "healthvault.com", + "hockeyapp.net", + "ieaddons.com", + "iegallery.com", + "live.com", + "microsoft.com", + "microsoftalumni.com", + "microsoftalumni.org", + "microsoftazuread-sso.com", + "microsoftedgeinsiders.com", + "microsoftonline-p.com", + "microsoftonline-p.net", + "microsoftonline.com", + "microsoftstore.com", + "microsoftstream.com", + "msappproxy.net", + "msft.net", + "msftidentity.com", + "msidentity.com", + "msn.com", + "o365weve.com", + "oaspapps.com", + "office.com", + "office365.com", + "officelive.com", + "onedrive.com", + "onenote.com", + "outlook.com", + "outlookmobile.com", + "phonefactor.net", + "s-msn.com", + "sfx.ms", + "sharepoint.com", + "skype.com", + "skypeforbusiness.com", + "staffhub.ms", + "sway-extensions.com", + "sway.com", + "trafficmanager.net", + "virtualearth.net", + "visualstudio.com", + "windows.net", + "windowsazure.com", + "windowsphone.com", + "worldwidetelescope.org", + "wunderlist.com", + "xbox.com", + "yammer.com" + ], + "resources": [ + "aadrm.com", + "adbureau.net", + "adecn.com", + "aquantive.com", + "aspnetcdn.com", + "assets-yammer.com", + "azure.com", + "azureedge.net", + "bing.com", + "cloudapp.net", + "gamesforwindows.com", + "getgamesmart.com", + "gfx.ms", + "healthvault.com", + "live.com", + "microsoft.com", + "microsoftazuread-sso.com", + "microsoftonline-p.com", + "microsoftonline-p.net", + "microsoftonline.com", + "microsoftstore.com", + "msads.net", + "msauthimages.net", + "msecnd.net", + "msedge.net", + "msndirect.com", + "msocdn.com", + "netconversions.com", + "oaspapps.com", + "office.com", + "office.net", + "officelive.com", + "onenote.net", + "onestore.ms", + "onmicrosoft.com", + "outlook.com", + "roiservice.com", + "s-msn.com", + "sfbassets.com", + "sharepoint.com", + "skype.com", + "skypeassets.com", + "sway-cdn.com", + "sway-extensions.com", + "windows.net", + "windowsazure.com", + "yammerusercontent.com" + ] + }, + "Millennial Media": { + "properties": ["decktrade.com", "millennialmedia.com", "mydas.mobi"], + "resources": ["decktrade.com", "millennialmedia.com", "mydas.mobi"] + }, + "Mindset Media": { + "properties": ["mindset-media.com"], + "resources": ["mindset-media.com", "mmismm.com"] + }, + "MinerAlt": { + "properties": ["mineralt.io", "vidzi.nu", "vidzi.tv"], + "resources": [ + "1q2w3.website", + "analytics.blue", + "aster18cdn.nl", + "belicimo.pw", + "besstahete.info", + "dinorslick.icu", + "feesocrald.com", + "gramombird.com", + "istlandoll.com", + "mepirtedic.com", + "mineralt.io", + "pampopholf.com", + "tercabilis.info", + "tulip18.com", + "vidzi.tv", + "yololike.space" + ] + }, + "Minescripts": { + "properties": ["minescripts.info"], + "resources": ["minescripts.info", "sslverify.info"] + }, + "MineXMR": { + "properties": ["minexmr.stream"], + "resources": ["minexmr.stream"] + }, + "Mirando": { + "properties": ["mirando.de"], + "resources": ["mirando.de"] + }, + "Mixpanel": { + "properties": ["mixpanel.com"], + "resources": ["mixpanel.com", "mxpnl.com"] + }, + "Mixpo": { + "properties": ["mixpo.com"], + "resources": ["mixpo.com"] + }, + "Moat": { + "properties": ["moat.com", "moatads.com"], + "resources": ["moat.com", "moatads.com"] + }, + "MobFox": { + "properties": ["mobfox.com"], + "resources": ["mobfox.com"] + }, + "Mobials": { + "properties": ["mobials.com"], + "resources": ["mobials.com"] + }, + "MobileAdTrading": { + "properties": ["mobileadtrading.com"], + "resources": ["mobileadtrading.com"] + }, + "Mobile Meteor": { + "properties": ["mobilemeteor.com"], + "resources": ["mobilemeteor.com", "showmeinn.com"] + }, + "Mobile Storm": { + "properties": ["mobilestorm.com"], + "resources": ["mobilestorm.com"] + }, + "MobVision": { + "properties": ["admoda.com"], + "resources": ["admoda.com", "mobvision.com"] + }, + "Mocean Mobile": { + "properties": ["moceanmobile.com"], + "resources": ["moceanmobile.com"] + }, + "Mochila": { + "properties": ["mochila.com"], + "resources": ["mochila.com"] + }, + "Mojiva": { + "properties": ["mojiva.com"], + "resources": ["mojiva.com"] + }, + "Monetate": { + "properties": ["monetate.com", "monetate.net"], + "resources": ["monetate.com", "monetate.net"] + }, + "MONETIZEdigital": { + "properties": ["cpalead.com"], + "resources": ["cpalead.com"] + }, + "Monetize More": { + "properties": ["monetizemore.com"], + "resources": ["monetizemore.com"] + }, + "Mongoose Metrics": { + "properties": ["mongoosemetrics.com"], + "resources": ["mongoosemetrics.com"] + }, + "Monitus": { + "properties": ["monitus.net"], + "resources": ["monitus.net"] + }, + "Monoloop": { + "properties": ["monoloop.com"], + "resources": ["monoloop.com"] + }, + "Monster": { + "properties": ["monster.com"], + "resources": ["monster.com"] + }, + "Moolah Media": { + "properties": ["moolah-media.com", "moolahmedia.com"], + "resources": ["moolah-media.com", "moolahmedia.com"] + }, + "MoPub": { + "properties": ["mopub.com"], + "resources": ["mopub.com"] + }, + "motigo": { + "properties": ["motigo.com"], + "resources": ["motigo.com", "nedstatbasic.net"] + }, + "Mouseflow": { + "properties": ["mouseflow.com"], + "resources": ["mouseflow.com"] + }, + "MovieLush.com": { + "properties": ["affbuzzads.com", "movielush.com"], + "resources": ["affbuzzads.com", "movielush.com"] + }, + "Multiple Stream Media": { + "properties": ["adclickmedia.com", "multiplestreammktg.com"], + "resources": ["adclickmedia.com", "multiplestreammktg.com"] + }, + "MUNDO Media": { + "properties": ["mundomedia.com", "silver-path.com"], + "resources": ["mundomedia.com", "silver-path.com"] + }, + "MyCounter": { + "properties": ["mycounter.com.ua"], + "resources": ["mycounter.com.ua"] + }, + "MyPagerank.Net": { + "properties": ["mypagerank.net"], + "resources": ["mypagerank.net"] + }, + "MyPressPlus": { + "properties": ["mypressplus.com", "ppjol.net"], + "resources": ["mypressplus.com", "ppjol.net"] + }, + "Mystighty": { + "properties": ["mystighty.info"], + "resources": ["mystighty.info", "sweeterge.info"] + }, + "myThings": { + "properties": ["mythings.com", "mythingsmedia.com"], + "resources": ["mythings.com", "mythingsmedia.com"] + }, + "MyWebGrocer": { + "properties": ["mywebgrocer.com"], + "resources": ["mywebgrocer.com"] + }, + "Nanigans": { + "properties": ["nanigans.com"], + "resources": ["nanigans.com"] + }, + "Narrative": { + "properties": ["narrative.io"], + "resources": ["narrative.io"] + }, + "NativeAds": { + "properties": ["nativeads.com"], + "resources": ["nativeads.com"] + }, + "Nativo": { + "properties": ["nativo.com", "postrelease.com"], + "resources": ["nativo.com", "postrelease.com"] + }, + "Navegg": { + "properties": ["navdmp.com", "navegg.com"], + "resources": ["navdmp.com", "navegg.com"] + }, + "NDN": { + "properties": ["newsinc.com"], + "resources": ["newsinc.com"] + }, + "Negishim": { + "properties": ["negishim.org"], + "resources": ["negishim.org"] + }, + "NeroHut": { + "properties": ["nerohut.com"], + "resources": ["nerohut.com", "nhsrv.cf"] + }, + "NetAffiliation": { + "properties": ["netaffiliation.com"], + "resources": ["netaffiliation.com"] + }, + "Net Applications": { + "properties": ["netapplications.com"], + "resources": ["hitsprocessor.com", "netapplications.com"] + }, + "NetBina": { + "properties": ["netbina.com"], + "resources": ["netbina.com"] + }, + "NetElixir": { + "properties": ["adelixir.com", "netelixir.com"], + "resources": ["adelixir.com", "netelixir.com"] + }, + "Netmining": { + "properties": ["netmining.com", "netmng.com"], + "resources": ["netmining.com", "netmng.com"] + }, + "Net-Results": { + "properties": ["net-results.com", "nr7.us"], + "resources": ["cdnma.com", "net-results.com", "nr7.us"] + }, + "NetSeer": { + "properties": ["netseer.com"], + "resources": ["netseer.com"] + }, + "NetShelter": { + "properties": ["ziffdavistech.com"], + "resources": ["netshelter.com", "netshelter.net", "ziffdavistech.com"] + }, + "Neustar": { + "properties": ["adadvisor.net", "home.neustar", "neustar.biz"], + "resources": ["adadvisor.net", "neustar.biz"] + }, + "New Relic": { + "properties": ["newrelic.com"], + "resources": ["newrelic.com", "nr-data.net"] + }, + "NewsRight": { + "properties": ["apnewsregistry.com", "newsright.com"], + "resources": ["apnewsregistry.com", "newsright.com"] + }, + "newtention": { + "properties": ["newtention.de", "newtention.net", "newtentionassets.net"], + "resources": ["newtention.de", "newtention.net", "newtentionassets.net"] + }, + "Nexage": { + "properties": ["nexage.com"], + "resources": ["nexage.com"] + }, + "Nextag": { + "properties": ["nextag.com"], + "resources": ["nextag.com"] + }, + "NextPerformance": { + "properties": ["nextperf.com", "nextperformance.com", "nxtck.com"], + "resources": ["nextperf.com", "nextperformance.com", "nxtck.com"] + }, + "NextSTAT": { + "properties": ["nextstat.com"], + "resources": ["nextstat.com"] + }, + "Nielsen": { + "properties": [ + "glanceguide.com", + "imrworldwide.com", + "imrworldwide.net", + "nielsen.com" + ], + "resources": [ + "glanceguide.com", + "imrworldwide.com", + "imrworldwide.net", + "nielsen.com" + ] + }, + "Ninua": { + "properties": ["networkedblogs.com", "ninua.com"], + "resources": ["networkedblogs.com", "ninua.com"] + }, + "Nokta": { + "properties": ["noktamedya.com", "virgul.com"], + "resources": ["noktamedya.com", "virgul.com"] + }, + "NowSpots": { + "properties": ["nowspots.com"], + "resources": ["nowspots.com"] + }, + "nrelate": { + "properties": ["nrelate.com"], + "resources": ["nrelate.com"] + }, + "NuDataSecurity": { + "properties": ["nudatasecurity.com"], + "resources": ["nudatasecurity.com"] + }, + "Nuffnang": { + "properties": ["nuffnang.com", "nuffnang.com.my", "www.nuffnang.com.my"], + "resources": ["nuffnang.com", "nuffnang.com.my", "www.nuffnang.com.my"] + }, + "nugg.ad": { + "properties": ["nugg.ad"], + "resources": ["nugg.ad", "nuggad.net"] + }, + "nurago": { + "properties": ["sensic.net"], + "resources": ["nurago.com", "nurago.de", "sensic.net"] + }, + "Oberon Media": { + "properties": ["iwin.com"], + "resources": ["blaze.com", "iwin.com", "oberon-media.com"] + }, + "Observer": { + "properties": ["observerapp.com"], + "resources": ["observerapp.com"] + }, + "Ohana Media": { + "properties": ["adohana.com", "ohana-media.com", "ohanaqb.com"], + "resources": ["adohana.com", "ohana-media.com", "ohanaqb.com"] + }, + "Omnicom Group": { + "properties": ["accuenmedia.com", "omnicomgroup.com"], + "resources": ["accuenmedia.com", "omnicomgroup.com", "p-td.com"] + }, + "onAd": { + "properties": ["onad.eu"], + "resources": ["onad.eu"] + }, + "OnAudience": { + "properties": ["behavioralengine.com", "onaudience.com"], + "resources": ["behavioralengine.com", "onaudience.com"] + }, + "Onclusive": { + "properties": ["onclusive.com"], + "resources": ["airpr.com"] + }, + "OneAd": { + "properties": ["onead.com.tw"], + "resources": ["guoshipartners.com", "onevision.com.tw"] + }, + "One iota": { + "properties": ["itsoneiota.com", "oneiota.co.uk"], + "resources": ["itsoneiota.com", "oneiota.co.uk"] + }, + "OneStat": { + "properties": ["onestat.com"], + "resources": ["onestat.com"] + }, + "Oneupweb": { + "properties": ["oneupweb.com", "sodoit.com"], + "resources": ["oneupweb.com", "sodoit.com"] + }, + "OnlineMetrix": { + "properties": ["online-metrix.net"], + "resources": ["online-metrix.net"] + }, + "Ooyala": { + "properties": ["ooyala.com"], + "resources": ["oo4.com", "ooyala.com"] + }, + "Open New Media": { + "properties": ["onm.de"], + "resources": ["onm.de"] + }, + "Openstat": { + "properties": ["openstat.com"], + "resources": ["openstat.com", "openstat.ru", "spylog.com"] + }, + "Opentracker": { + "properties": ["opentracker.net"], + "resources": ["opentracker.net"] + }, + "OpenX": { + "properties": ["openx.com", "openx.net"], + "resources": [ + "liftdna.com", + "openx.com", + "openx.net", + "openx.org", + "openxenterprise.com", + "servedbyopenx.com" + ] + }, + "Opera": { + "properties": ["opera.com"], + "resources": ["mobiletheory.com", "opera.com"] + }, + "Opolen": { + "properties": ["opolen.com.br"], + "resources": ["opolen.com.br"] + }, + "OPT": { + "properties": ["www.opt.ne.jp"], + "resources": ["advg.jp", "opt.ne.jp", "p-advg.com", "www.opt.ne.jp"] + }, + "Optify": { + "properties": ["optify.net"], + "resources": ["optify.net"] + }, + "Optimal": { + "properties": ["bn.co"], + "resources": [ + "cpmadvisors.com", + "cpmatic.com", + "nprove.com", + "optim.al", + "orbengine.com", + "xa.net" + ] + }, + "Optimizely": { + "properties": ["optimizely.com"], + "resources": ["optimizely.com"] + }, + "OptimumResponse": { + "properties": ["optimumresponse.com"], + "resources": ["optimumresponse.com"] + }, + "OptinMonster": { + "properties": ["optinmonster.com", "optnmstr.com"], + "resources": ["optinmonster.com", "optnmstr.com"] + }, + "OptMD": { + "properties": ["optmd.com"], + "resources": ["optmd.com"] + }, + "Oracle": { + "properties": ["oracle.com"], + "resources": [ + "atgsvcs.com", + "eloqua.com", + "estara.com", + "instantservice.com", + "istrack.com", + "maxymiser.com", + "oracle.com" + ] + }, + "OrangeSoda": { + "properties": ["orangesoda.com", "otracking.com"], + "resources": ["orangesoda.com", "otracking.com"] + }, + "Outbrain": { + "properties": ["outbrain.com", "sphere.com"], + "resources": ["outbrain.com", "sphere.com", "visualrevenue.com"] + }, + "Out There Media": { + "properties": ["out-there-media.com"], + "resources": ["out-there-media.com"] + }, + "Oversee.net": { + "properties": ["dsnextgen.com", "oversee.net"], + "resources": ["dsnextgen.com", "oversee.net"] + }, + "ÖWA": { + "properties": ["oewa.at"], + "resources": ["oewa.at", "oewabox.at"] + }, + "OwnerIQ": { + "properties": ["owneriq.com", "owneriq.net"], + "resources": ["owneriq.com", "owneriq.net"] + }, + "OxaMedia": { + "properties": ["oxamedia.com"], + "resources": ["adconnexa.com", "adsbwm.com", "oxamedia.com"] + }, + "PageFair": { + "properties": ["pagefair.com", "pagefair.net"], + "resources": ["pagefair.com", "pagefair.net"] + }, + "Paid-To-Promote.net": { + "properties": ["paid-to-promote.net"], + "resources": ["paid-to-promote.net"] + }, + "Papaya": { + "properties": ["papayamobile.com"], + "resources": ["papayamobile.com"] + }, + "Pardot": { + "properties": ["pardot.com"], + "resources": ["pardot.com"] + }, + "Parse.ly": { + "properties": ["parsely.com"], + "resources": ["parsely.com"] + }, + "PayHit": { + "properties": ["payhit.com"], + "resources": ["payhit.com"] + }, + "PaymentsMB": { + "properties": ["paymentsmb.com"], + "resources": ["paymentsmb.com"] + }, + "Paypal": { + "properties": ["paypal.com", "simility.com"], + "resources": ["paypal.com", "simility.com"] + }, + "Paypopup.com": { + "properties": ["paypopup.com"], + "resources": ["lzjl.com", "paypopup.com"] + }, + "PebblePost": { + "properties": ["pebblepost.com"], + "resources": ["pbbl.co"] + }, + "Peer39": { + "properties": ["peer39.com", "peer39.net"], + "resources": ["peer39.com", "peer39.net"] + }, + "PeerFly": { + "properties": ["peerfly.com"], + "resources": ["peerfly.com"] + }, + "Peerius": { + "properties": ["peerius.com"], + "resources": ["peerius.com"] + }, + "Performancing": { + "properties": ["performancing.com"], + "resources": ["performancing.com"] + }, + "PerimeterX": { + "properties": ["perimeterx.com"], + "resources": ["perimeterx.com"] + }, + "PersianStat.com": { + "properties": ["persianstat.com"], + "resources": ["persianstat.com"] + }, + "Pheedo": { + "properties": ["pheedo.com"], + "resources": ["pheedo.com"] + }, + "Phonalytics": { + "properties": ["phonalytics.com"], + "resources": ["phonalytics.com"] + }, + "phpMyVisites": { + "properties": ["phpmyvisites.us"], + "resources": ["phpmyvisites.us"] + }, + "Pictela": { + "properties": ["pictela.com", "pictela.net"], + "resources": ["pictela.com", "pictela.net"] + }, + "PinPoll": { + "properties": ["pinpoll.com"], + "resources": ["pinpoll.com"] + }, + "Pinterest": { + "properties": [ + "pinterest.at", + "pinterest.ca", + "pinterest.ch", + "pinterest.cl", + "pinterest.co.kr", + "pinterest.co.uk", + "pinterest.com", + "pinterest.com.au", + "pinterest.com.mx", + "pinterest.de", + "pinterest.dk", + "pinterest.es", + "pinterest.fr", + "pinterest.ie", + "pinterest.jp", + "pinterest.nz", + "pinterest.pt", + "pinterest.se" + ], + "resources": ["pinimg.com", "pinterest.com"] + }, + "Piwik": { + "properties": ["piwik.org"], + "resources": ["piwik.org"] + }, + "PixAnalytics": { + "properties": ["pixanalytics.com"], + "resources": ["pixanalytics.com"] + }, + "Pixel.sg": { + "properties": ["pixel.sg"], + "resources": ["pixel.sg"] + }, + "Piximedia": { + "properties": ["piximedia.com"], + "resources": ["piximedia.com"] + }, + "Pixlee": { + "properties": ["pixlee.com"], + "resources": ["pixlee.com"] + }, + "PLATFORM ONE": { + "properties": ["platform-one.co.jp", "www.platform-one.co.jp"], + "resources": ["platform-one.co.jp", "www.platform-one.co.jp"] + }, + "plista": { + "properties": ["plista.com"], + "resources": ["plista.com"] + }, + "PocketCents": { + "properties": ["pocketcents.com"], + "resources": ["pocketcents.com"] + }, + "Polar Mobile": { + "properties": ["mediavoice.com"], + "resources": ["mediavoice.com", "polarmobile.com"] + }, + "Politads": { + "properties": ["politads.com"], + "resources": ["politads.com"] + }, + "Polymorph": { + "properties": ["getpolymorph.com"], + "resources": ["adsnative.com", "getpolymorph.com"] + }, + "Pontiflex": { + "properties": ["pontiflex.com"], + "resources": ["pontiflex.com"] + }, + "Poool": { + "properties": ["poool.fr"], + "resources": ["poool.fr"] + }, + "PopAds": { + "properties": ["popads.net"], + "resources": ["popads.net", "popadscdn.net"] + }, + "PopRule": { + "properties": ["gocampaignlive.com", "poprule.com"], + "resources": ["gocampaignlive.com", "poprule.com"] + }, + "Popunder.ru": { + "properties": ["popunder.ru"], + "resources": ["popunder.ru"] + }, + "Po.st": { + "properties": ["po.st"], + "resources": ["po.st"] + }, + "Powerlinks": { + "properties": ["powerlinks.com"], + "resources": ["powerlinks.com"] + }, + "PPCProtect": { + "properties": ["ppcprotect.com"], + "resources": ["ppcprotect.com"] + }, + "PrecisionClick": { + "properties": ["precisionclick.com"], + "resources": ["precisionclick.com"] + }, + "PredictAd": { + "properties": ["predictad.com"], + "resources": ["predictad.com"] + }, + "Pressflex": { + "properties": ["blogads.com", "pressflex.com"], + "resources": ["blogads.com", "pressflex.com"] + }, + "Prime Visibility": { + "properties": ["primevisibility.com"], + "resources": [ + "adcde.com", + "addlvr.com", + "adonnetwork.com", + "adonnetwork.net", + "adtrgt.com", + "bannertgt.com", + "cptgt.com", + "cpvfeed.com", + "cpvtgt.com", + "dashboardad.net", + "popcde.com", + "primevisibility.com", + "sdfje.com", + "urtbk.com" + ] + }, + "Primis": { + "properties": ["primis.tech"], + "resources": ["sekindo.com"] + }, + "PrismApp": { + "properties": ["prismapp.io"], + "resources": ["prismapp.io"] + }, + "Proclivity": { + "properties": ["proclivitysystems.com", "pswec.com"], + "resources": ["proclivitymedia.com", "proclivitysystems.com", "pswec.com"] + }, + "Project Wonderful": { + "properties": ["projectwonderful.com"], + "resources": ["projectwonderful.com"] + }, + "PrometheusIntelligenceTechnology": { + "properties": ["prometheusintelligencetechnology.com"], + "resources": ["prometheusintelligencetechnology.com"] + }, + "Pronunciator": { + "properties": ["pronunciator.com", "visitorville.com"], + "resources": ["pronunciator.com", "visitorville.com"] + }, + "Propeller Ads": { + "properties": ["propellerads.com"], + "resources": ["propellerads.com"] + }, + "Prosperent": { + "properties": ["prosperent.com"], + "resources": ["prosperent.com"] + }, + "Protected Media": { + "properties": ["ad-score.com", "protected.media"], + "resources": ["ad-score.com", "protected.media"] + }, + "Provers": { + "properties": ["provers.pro"], + "resources": ["provers.pro"] + }, + "Psonstrentie": { + "properties": ["psonstrentie.info"], + "resources": ["psonstrentie.info"] + }, + "Public-Idées": { + "properties": ["publicidees.com"], + "resources": ["publicidees.com"] + }, + "Publishers Clearing House": { + "properties": ["pch.com"], + "resources": ["pch.com"] + }, + "PubMatic": { + "properties": ["pubmatic.com"], + "resources": ["pubmatic.com", "revinet.com"] + }, + "PulsePoint": { + "properties": ["pulsepoint.com"], + "resources": ["pulsepoint.com"] + }, + "PunchTab": { + "properties": ["punchtab.com"], + "resources": ["punchtab.com"] + }, + "quadrantOne": { + "properties": ["quadrantone.com"], + "resources": ["quadrantone.com"] + }, + "Quake Marketing": { + "properties": ["quakemarketing.com"], + "resources": ["quakemarketing.com"] + }, + "Qualaroo": { + "properties": ["qualaroo.com"], + "resources": ["kissinsights.com", "qualaroo.com"] + }, + "Quantcast": { + "properties": ["quantcast.com", "quantserve.com"], + "resources": ["quantcast.com", "quantserve.com"] + }, + "QuantumAdvertising": { + "properties": ["quantum-advertising.com"], + "resources": ["quantum-advertising.com"] + }, + "QuinStreet": { + "properties": ["quinstreet.com", "thecounter.com"], + "resources": ["qnsr.com", "qsstats.com", "quinstreet.com", "thecounter.com"] + }, + "Quintelligence": { + "properties": ["quintelligence.com"], + "resources": ["quintelligence.com"] + }, + "QUISMA": { + "properties": ["quisma.com"], + "resources": [ + "iaded.com", + "quisma.com", + "quismatch.com", + "xaded.com", + "xmladed.com" + ] + }, + "RadarURL": { + "properties": ["radarurl.com"], + "resources": ["radarurl.com"] + }, + "Radial": { + "properties": ["radial.com"], + "resources": ["gsicommerce.com", "gsimedia.net"] + }, + "Radiate Media": { + "properties": ["gtnetwork.com.au", "solesolution.com"], + "resources": [ + "gtnetwork.com.au", + "matchbin.com", + "radiatemedia.com", + "solesolution.com" + ] + }, + "RadiumOne": { + "properties": ["radiumone.com"], + "resources": ["gwallet.com", "radiumone.com"] + }, + "Radius Marketing": { + "properties": ["radiusmarketing.com"], + "resources": ["radiusmarketing.com"] + }, + "Rambler": { + "properties": ["rambler.ru"], + "resources": ["rambler.ru"] + }, + "Rapleaf": { + "properties": ["rapleaf.com", "rlcdn.com"], + "resources": ["rapleaf.com", "rlcdn.com"] + }, + "ReachLocal": { + "properties": ["reachlocal.com", "rlcdn.net"], + "resources": ["reachlocal.com", "rlcdn.net"] + }, + "React2Media": { + "properties": ["react2media.com"], + "resources": ["react2media.com"] + }, + "reddit": { + "properties": ["reddit.com"], + "resources": ["reddit.com"] + }, + "Redux Media": { + "properties": ["reduxmedia.com"], + "resources": ["reduxmedia.com"] + }, + "Rekko": { + "properties": ["convertglobal.com", "rekko.com"], + "resources": ["convertglobal.com", "rekko.com"] + }, + "Reklamport": { + "properties": ["reklamport.com"], + "resources": ["reklamport.com"] + }, + "Reklam Store": { + "properties": ["reklamstore.com"], + "resources": ["reklamstore.com"] + }, + "Reklamz": { + "properties": ["reklamz.com"], + "resources": ["reklamz.com"] + }, + "Relevad": { + "properties": ["relestar.com", "relevad.com"], + "resources": ["relestar.com", "relevad.com"] + }, + "Renegade Internet": { + "properties": ["advertserve.com", "renegadeinternet.com"], + "resources": ["advertserve.com", "renegadeinternet.com"] + }, + "Reporo": { + "properties": ["reporo.com"], + "resources": ["buzzcity.com"] + }, + "Research Now": { + "properties": ["researchnow.com", "valuedopinions.co.uk"], + "resources": ["researchnow.com", "valuedopinions.co.uk"] + }, + "ResolutionMedia": { + "properties": ["nonstoppartner.net"], + "resources": ["nonstoppartner.net"] + }, + "Resolution Media": { + "properties": ["resolutionmedia.com"], + "resources": ["resolutionmedia.com"] + }, + "Resonate": { + "properties": ["resonateinsights.com", "resonatenetworks.com"], + "resources": ["reson8.com", "resonateinsights.com", "resonatenetworks.com"] + }, + "Responsys": { + "properties": ["responsys.com"], + "resources": ["responsys.com"] + }, + "Retail Automata": { + "properties": ["retailautomata.com"], + "resources": ["retailautomata.com"] + }, + "ReTargeter": { + "properties": ["retargeter.com"], + "resources": ["retargeter.com"] + }, + "Retirement Living": { + "properties": ["blvdstatus.com", "retirement-living.com"], + "resources": ["blvdstatus.com", "retirement-living.com"] + }, + "RevContent": { + "properties": ["revcontent.com"], + "resources": ["revcontent.com"] + }, + "RevenueMax": { + "properties": ["revenuemax.de"], + "resources": ["revenuemax.de"] + }, + "Revtracks": { + "properties": ["revtrax.com"], + "resources": ["revtrax.com"] + }, + "Rhythm": { + "properties": ["rhythmone.com"], + "resources": [ + "1rx.io", + "rhythmnewmedia.com", + "rhythmone.com", + "rhythmxchange.com", + "rnmd.net" + ] + }, + "RichAudience": { + "properties": ["richaudience.com"], + "resources": ["richaudience.com"] + }, + "RichRelevance": { + "properties": ["richrelevance.com"], + "resources": ["richrelevance.com"] + }, + "RightAction": { + "properties": ["rightaction.com"], + "resources": ["rightaction.com"] + }, + "RIM": { + "properties": ["global.blackberry.com", "laptopverge.com"], + "resources": [ + "global.blackberry.com", + "laptopverge.com", + "rim.com", + "scoreloop.com" + ] + }, + "Ringier": { + "properties": ["ringier.cz"], + "resources": ["ringier.cz"] + }, + "RMBN": { + "properties": ["traforet.com"], + "resources": ["rmbn.net", "rmbn.ru", "traforet.com"] + }, + "RMM": { + "properties": ["rmmonline.com"], + "resources": ["rmmonline.com"] + }, + "Rocket Fuel": { + "properties": ["rfihub.com", "rfihub.net", "rocketfuel.com"], + "resources": [ + "rfihub.com", + "rfihub.net", + "rocketfuel.com", + "ru4.com", + "xplusone.com" + ] + }, + "Rollick": { + "properties": ["gorollick.com"], + "resources": ["rollick.io"] + }, + "Rovion": { + "properties": ["rovion.com"], + "resources": ["rovion.com"] + }, + "Roxr": { + "properties": ["clicky.com", "roxr.net"], + "resources": ["clicky.com", "getclicky.com", "roxr.net", "staticstuff.net"] + }, + "rtk": { + "properties": ["rtk.io"], + "resources": ["rtk.io"] + }, + "RubiconProject": { + "properties": ["rubiconproject.com"], + "resources": ["adsbyisocket.com", "isocket.com", "rubiconproject.com"] + }, + "RunAds": { + "properties": ["runads.com"], + "resources": ["runads.com", "rundsp.com"] + }, + "RuTarget": { + "properties": ["rutarget.ru"], + "resources": ["rutarget.ru"] + }, + "Sabavision": { + "properties": ["sabavision.com"], + "resources": ["sabavision.com"] + }, + "Sabre": { + "properties": ["reztrack.com", "sabre.com", "sabrehospitality.com"], + "resources": ["reztrack.com", "sabre.com", "sabrehospitality.com"] + }, + "Safecount": { + "properties": ["safecount.net"], + "resources": [ + "dl-rms.com", + "dlqm.net", + "questionmarket.com", + "safecount.net" + ] + }, + "SageMetrics": { + "properties": ["sagemetrics.com"], + "resources": ["sageanalyst.net", "sagemetrics.com"] + }, + "Salesforce.com": { + "properties": ["force.com", "salesforce.com", "trailblazer.me"], + "resources": [ + "documentforce.com", + "force.com", + "forcesslreports.com", + "forceusercontent.com", + "lightning.com", + "salesforce-communities.com", + "salesforce-hub.com", + "salesforce.com", + "salesforceliveagent.com", + "trailblazer.me", + "visualforce.com" + ] + }, + "Salesintelligence": { + "properties": ["salesintelligence.pl"], + "resources": ["plugin.management"] + }, + "Samurai Factory": { + "properties": ["samurai-factory.jp", "shinobi.jp"], + "resources": ["samurai-factory.jp", "shinobi.jp"] + }, + "SAP": { + "properties": ["sap.com"], + "resources": ["sap.com", "seewhy.com"] + }, + "Sapient": { + "properties": ["bridgetrack.com", "sapient.com"], + "resources": ["bridgetrack.com", "sapient.com"] + }, + "SAS": { + "properties": ["aimatch.com", "sas.com"], + "resources": ["aimatch.com", "sas.com"] + }, + "SAY": { + "properties": ["saymedia.com", "typepad.com", "videoegg.com"], + "resources": ["saymedia.com", "typepad.com", "videoegg.com"] + }, + "Scandinavian AdNetworks": { + "properties": ["scandinavianadnetworks.com"], + "resources": ["scandinavianadnetworks.com"] + }, + "ScribeFire": { + "properties": ["scribefire.com"], + "resources": ["scribefire.com"] + }, + "Scribol": { + "properties": ["scribol.com"], + "resources": ["scribol.com"] + }, + "SearchForce": { + "properties": ["searchforce.com", "searchforce.net"], + "resources": ["searchforce.com", "searchforce.net"] + }, + "Seevast": { + "properties": ["kanoodle.com"], + "resources": [ + "kanoodle.com", + "pulse360.com", + "seevast.com", + "syndigonetworks.com" + ] + }, + "SeeVolution": { + "properties": ["seevolution.com", "svlu.net"], + "resources": ["seevolution.com", "svlu.net"] + }, + "Segment.io": { + "properties": ["segment.io"], + "resources": ["segment.io"] + }, + "Selectable Media": { + "properties": ["selectablemedia.com"], + "resources": ["nabbr.com", "selectablemedia.com"] + }, + "Semantiqo": { + "properties": ["semantiqo.com"], + "resources": ["semantiqo.com"] + }, + "Semasio": { + "properties": ["semasio.com"], + "resources": ["semasio.com", "semasio.net"] + }, + "SendPulse": { + "properties": ["sendpulse.com"], + "resources": ["sendpulse.com"] + }, + "Service4refresh": { + "properties": ["service4refresh.info"], + "resources": ["service4refresh.info"] + }, + "SessionCam": { + "properties": ["sessioncam.com"], + "resources": ["sessioncam.com"] + }, + "SevenAds": { + "properties": ["sevenads.net"], + "resources": ["sevenads.net"] + }, + "SexInYourCity": { + "properties": ["sexinyourcity.com"], + "resources": ["sexinyourcity.com"] + }, + "ShaftTraffic": { + "properties": ["shafttraffic.com"], + "resources": ["libertystmedia.com", "shafttraffic.com"] + }, + "Shareaholic": { + "properties": ["shareaholic.com"], + "resources": ["shareaholic.com"] + }, + "ShareASale": { + "properties": ["shareasale.com"], + "resources": ["shareasale.com"] + }, + "ShareThis": { + "properties": ["sharethis.com"], + "resources": ["sharethis.com"] + }, + "Sharethrough": { + "properties": ["sharethrough.com"], + "resources": ["sharethrough.com"] + }, + "ShinyStat": { + "properties": ["shinystat.com"], + "resources": ["shinystat.com"] + }, + "Shopzilla": { + "properties": ["shopzilla.com"], + "resources": ["shopzilla.com"] + }, + "Shortest": { + "properties": ["shorte.st"], + "resources": ["shorte.st"] + }, + "SiftScience": { + "properties": ["sift.com"], + "resources": ["siftscience.com"] + }, + "Signifyd": { + "properties": ["signifyd.com"], + "resources": ["signifyd.com"] + }, + "Silverpop": { + "properties": ["mkt51.net", "silverpop.com"], + "resources": ["mkt51.net", "pages05.net", "silverpop.com", "vtrenz.net"] + }, + "Simpli.fi": { + "properties": ["simpli.fi"], + "resources": ["simpli.fi"] + }, + "SiteScout": { + "properties": ["sitescout.com"], + "resources": ["sitescout.com"] + }, + "Six Apart": { + "properties": ["movabletype.com", "sixapart.com"], + "resources": ["movabletype.com", "sixapart.com"] + }, + "Skimlinks": { + "properties": ["skimlinks.com", "skimresources.com"], + "resources": ["skimlinks.com", "skimresources.com"] + }, + "Skribit": { + "properties": ["paulstamatiou.com"], + "resources": ["paulstamatiou.com", "skribit.com"] + }, + "Skupe Net": { + "properties": ["adcentriconline.com", "skupenet.com"], + "resources": ["adcentriconline.com", "skupenet.com"] + }, + "Smaato": { + "properties": ["smaato.com"], + "resources": ["smaato.com"] + }, + "SmartAdServer": { + "properties": ["smartadserver.com"], + "resources": ["smartadserver.com"] + }, + "Smartlook": { + "properties": ["smartlook.com"], + "resources": ["smartlook.com"] + }, + "SmartyAds": { + "properties": ["smartyads.com"], + "resources": ["smartyads.com"] + }, + "Smi": { + "properties": ["24smi.net"], + "resources": ["24smi.net"] + }, + "Smiley Media": { + "properties": ["smileymedia.com"], + "resources": ["smileymedia.com"] + }, + "Smowtion": { + "properties": ["smowtion.com"], + "resources": ["smowtion.com"] + }, + "Snap": { + "properties": ["snap.com"], + "resources": ["snap.com"] + }, + "SnapEngage": { + "properties": ["snapengage.com"], + "resources": ["snapengage.com"] + }, + "Snoobi": { + "properties": ["snoobi.fi"], + "resources": ["snoobi.com", "snoobi.fi"] + }, + "SocialChorus": { + "properties": ["socialchorus.com"], + "resources": [ + "halogenmediagroup.com", + "halogennetwork.com", + "socialchorus.com" + ] + }, + "SocialInterface": { + "properties": ["socialinterface.com"], + "resources": ["ratevoice.com", "socialinterface.com"] + }, + "SocialTwist": { + "properties": ["socialtwist.com"], + "resources": ["socialtwist.com"] + }, + "sociomantic labs": { + "properties": ["sociomantic.com"], + "resources": ["sociomantic.com"] + }, + "Socital": { + "properties": ["socital.com"], + "resources": ["socital.com"] + }, + "Sojern": { + "properties": ["sojern.com"], + "resources": ["sojern.com"] + }, + "SomoAudience": { + "properties": ["somoaudience.com"], + "resources": ["somoaudience.com"] + }, + "Sonobi": { + "properties": ["sonobi.com"], + "resources": ["sonobi.com"] + }, + "sophus3": { + "properties": ["sophus3.com"], + "resources": ["sophus3.co.uk", "sophus3.com"] + }, + "Sortable": { + "properties": ["sortable.com"], + "resources": ["deployads.com"] + }, + "Sourcepoint": { + "properties": ["sourcepoint.com"], + "resources": ["summerhamster.com"] + }, + "Sovrn": { + "properties": ["sovrn.com"], + "resources": ["sovrn.com"] + }, + "Space Chimp Media": { + "properties": ["spacechimpmedia.com"], + "resources": ["spacechimpmedia.com"] + }, + "SpareChange": { + "properties": ["sparechange.io"], + "resources": ["sparechange.io"] + }, + "Sparklit": { + "properties": ["adbutler.com", "sparklit.com"], + "resources": ["adbutler.com", "sparklit.com"] + }, + "Spark Studios": { + "properties": ["sparkstudios.com"], + "resources": ["sparkstudios.com"] + }, + "Specific Media": { + "properties": ["sitemeter.com", "specificmedia.com"], + "resources": [ + "adviva.co.uk", + "adviva.net", + "sitemeter.com", + "specificclick.net", + "specificmedia.com" + ] + }, + "Spectate": { + "properties": ["spectate.com"], + "resources": ["spectate.com"] + }, + "Sponge": { + "properties": ["spongegroup.com"], + "resources": ["spongegroup.com"] + }, + "Spongecell": { + "properties": ["spongecell.com"], + "resources": ["spongecell.com"] + }, + "SponsorAds": { + "properties": ["sponsorads.de"], + "resources": ["sponsorads.de"] + }, + "Spot200": { + "properties": ["spot200.com"], + "resources": ["spot200.com"] + }, + "SpotX": { + "properties": ["spotx.tv"], + "resources": ["spotx.tv"] + }, + "SpotXchange": { + "properties": ["spotxchange.com"], + "resources": ["spotxcdn.com", "spotxchange.com"] + }, + "Spring Metrics": { + "properties": ["springmetrics.com"], + "resources": ["springmetrics.com"] + }, + "SpringServe": { + "properties": ["springserve.com"], + "resources": ["springserve.com"] + }, + "Sputnik.ru": { + "properties": ["sputnik.ru"], + "resources": ["sputnik.ru"] + }, + "StackAdapt": { + "properties": ["stackadapt.com"], + "resources": ["stackadapt.com"] + }, + "StackTrack": { + "properties": ["stat-track.com"], + "resources": ["stat-track.com"] + }, + "StarGames": { + "properties": ["stargames.net", "stargamesaffiliate.com"], + "resources": ["stargames.net", "stargamesaffiliate.com"] + }, + "stat4u": { + "properties": ["4u.pl"], + "resources": ["4u.pl"] + }, + "StatCounter": { + "properties": ["statcounter.com"], + "resources": ["statcounter.com"] + }, + "Statisfy": { + "properties": ["statisfy.net"], + "resources": ["statisfy.net"] + }, + "STATSIT": { + "properties": ["statsit.com"], + "resources": ["statsit.com"] + }, + "SteelHouse": { + "properties": ["steelhouse.com", "steelhousemedia.com"], + "resources": ["steelhouse.com", "steelhousemedia.com"] + }, + "Storeland": { + "properties": ["storeland.ru"], + "resources": ["storeland.ru"] + }, + "Storygize": { + "properties": ["storygize.com"], + "resources": ["storygize.com", "storygize.net"] + }, + "Stratigent": { + "properties": ["stratigent.com"], + "resources": ["stratigent.com"] + }, + "Streamray": { + "properties": ["cams.com", "streamray.com"], + "resources": ["cams.com", "streamray.com"] + }, + "StrikeAd": { + "properties": ["strikead.com"], + "resources": ["strikead.com"] + }, + "Stripe": { + "properties": ["stripe.com"], + "resources": ["stripe.network"] + }, + "StrongMail": { + "properties": ["strongmail.com"], + "resources": ["popularmedia.com", "strongmail.com"] + }, + "Struq": { + "properties": ["struq.com"], + "resources": ["struq.com"] + }, + "StumbleUpon": { + "properties": ["stumbleupon.com"], + "resources": ["stumble-upon.com", "stumbleupon.com"] + }, + "Sublime Skinz": { + "properties": ["sublime.xyz"], + "resources": ["ayads.co", "sublime.xyz"] + }, + "Suite 66": { + "properties": ["suite66.com"], + "resources": ["suite66.com"] + }, + "Summit": { + "properties": ["summitmedia.co.uk", "www.summit.co.uk"], + "resources": ["summitmedia.co.uk", "www.summit.co.uk"] + }, + "Superfish": { + "properties": ["superfish.com"], + "resources": ["superfish.com"] + }, + "SupersonicAds": { + "properties": ["supersonicads.com"], + "resources": ["supersonicads.com"] + }, + "Survata": { + "properties": ["survata.com"], + "resources": ["survata.com"] + }, + "SwiftMining": { + "properties": ["swiftmining.win"], + "resources": ["swiftmining.win"] + }, + "Switch": { + "properties": ["switchadhub.com", "switchconcepts.com"], + "resources": [ + "switchadhub.com", + "switchads.com", + "switchconcepts.co.uk", + "switchconcepts.com" + ] + }, + "Swoop": { + "properties": ["swoop.com"], + "resources": ["swoop.com"] + }, + "SymphonyAM": { + "properties": ["factortg.com"], + "resources": ["factortg.com"] + }, + "Synacor": { + "properties": ["synacor.com"], + "resources": ["synacor.com"] + }, + "Syncapse": { + "properties": ["clickable.net", "syncapse.com"], + "resources": ["clickable.net", "syncapse.com"] + }, + "Syrup Ad": { + "properties": ["adotsolution.com"], + "resources": ["adotsolution.com"] + }, + "Taboola": { + "properties": ["taboola.com"], + "resources": ["perfectmarket.com", "taboola.com"] + }, + "Tailsweep": { + "properties": ["tailsweep.com"], + "resources": ["tailsweep.com"] + }, + "Taleria": { + "properties": ["telaria.com"], + "resources": ["freeskreen.com"] + }, + "Tapad": { + "properties": ["tapad.com"], + "resources": ["tapad.com"] + }, + "Tapgage": { + "properties": ["bizmey.com", "tapgage.com"], + "resources": ["bizmey.com", "tapgage.com"] + }, + "TapIt!": { + "properties": ["tapit.com"], + "resources": ["tapit.com"] + }, + "Tap.me": { + "properties": ["tap.me"], + "resources": ["tap.me"] + }, + "Targetix": { + "properties": ["targetix.net"], + "resources": ["targetix.net"] + }, + "Tatto Media": { + "properties": ["tattomedia.com"], + "resources": ["quicknoodles.com", "tattomedia.com"] + }, + "Teadma": { + "properties": ["teadma.com"], + "resources": ["teadma.com"] + }, + "Teads.tv": { + "properties": ["teads.tv"], + "resources": ["teads.tv"] + }, + "Tealium": { + "properties": ["tealium.com"], + "resources": ["tealiumiq.com"] + }, + "Technorati": { + "properties": ["technorati.com"], + "resources": ["technorati.com", "technoratimedia.com"] + }, + "TechSolutions": { + "properties": ["techsolutions.com.tw"], + "resources": ["techsolutions.com.tw"] + }, + "TellApart": { + "properties": ["tellapart.com", "tellapt.com"], + "resources": ["tellapart.com", "tellapt.com"] + }, + "Telstra": { + "properties": ["sensis.com.au", "sensisdata.com.au", "telstra.com.au"], + "resources": [ + "sensis.com.au", + "sensisdata.com.au", + "sensisdigitalmedia.com.au", + "telstra.com.au" + ] + }, + "TENSQUARE": { + "properties": ["tensquare.com"], + "resources": ["tensquare.com"] + }, + "Terra": { + "properties": ["eztargetmedia.com", "terra.com.br", "www.terra.com.br"], + "resources": ["eztargetmedia.com", "terra.com.br", "www.terra.com.br"] + }, + "The Heron Partnership": { + "properties": ["marinsm.com"], + "resources": ["heronpartners.com.au", "marinsm.com", "marinsoftware.com"] + }, + "The Numa Group": { + "properties": ["hittail.com", "thenumagroup.com"], + "resources": ["hittail.com", "thenumagroup.com"] + }, + "The Search Agency": { + "properties": ["thesearchagency.com"], + "resources": ["thesearchagency.com", "thesearchagency.net"] + }, + "The Trade Desk": { + "properties": ["thetradedesk.com"], + "resources": ["adsrvr.org", "thetradedesk.com"] + }, + "ThingLink": { + "properties": ["thinglink.com"], + "resources": ["thinglink.com"] + }, + "Think Realtime": { + "properties": ["echosearch.com", "thinkrealtime.com"], + "resources": ["echosearch.com", "esm1.net", "thinkrealtime.com"] + }, + "Thismoment": { + "properties": ["thismoment.com"], + "resources": ["thismoment.com"] + }, + "Thummit": { + "properties": ["thummit.com"], + "resources": ["thummit.com"] + }, + "Tinder": { + "properties": ["carbonads.com", "tinder.com"], + "resources": ["carbonads.com", "tinder.com"] + }, + "TiqIQ": { + "properties": ["tiqiq.com"], + "resources": ["tiqiq.com"] + }, + "Tisoomi": { + "properties": ["adternal.com", "tisoomi.com"], + "resources": ["adternal.com", "tisoomi.com"] + }, + "TLVMedia": { + "properties": ["tlvmedia.com"], + "resources": ["tlvmedia.com"] + }, + "TNS": { + "properties": [ + "statistik-gallup.net", + "tns-counter.ru", + "tns-cs.net", + "tnsglobal.com" + ], + "resources": [ + "sesamestats.com", + "statistik-gallup.net", + "tns-counter.ru", + "tns-cs.net", + "tnsglobal.com" + ] + }, + "Todacell": { + "properties": ["todacell.com"], + "resources": ["todacell.com"] + }, + "ToneFuse": { + "properties": ["tonefuse.com"], + "resources": ["tonefuse.com"] + }, + "ToneMedia": { + "properties": ["clickfuse.com"], + "resources": ["clickfuse.com", "tonemedia.com"] + }, + "tongdun.cn": { + "properties": ["tongdun.cn"], + "resources": ["fraudmetrix.cn", "tongdun.net"] + }, + "Topsy": { + "properties": ["topsy.com"], + "resources": ["topsy.com"] + }, + "TouchCommerce": { + "properties": ["nuance.com"], + "resources": ["inq.com", "nuance.com", "touchcommerce.com"] + }, + "TraceMyIP.org": { + "properties": ["tracemyip.org"], + "resources": ["tracemyip.org"] + }, + "TrackingSoft": { + "properties": ["roia.biz", "trackingsoft.com"], + "resources": ["roia.biz", "trackingsoft.com"] + }, + "Trackset": { + "properties": ["trackset.com"], + "resources": ["trackset.com"] + }, + "Tradedoubler": { + "properties": ["tradedoubler.com"], + "resources": ["tradedoubler.com"] + }, + "TradeTracker": { + "properties": ["tradetracker.com"], + "resources": ["tradetracker.com", "tradetracker.net"] + }, + "TrafficHaus": { + "properties": ["traffichaus.com", "traffichouse.com"], + "resources": ["traffichaus.com", "traffichouse.com"] + }, + "TrafficRevenue": { + "properties": ["trafficrevenue.net"], + "resources": ["trafficrevenue.net"] + }, + "TrafficScore": { + "properties": ["trafficscore.com"], + "resources": ["trafficscore.com"] + }, + "Traffiq": { + "properties": ["traffiq.com"], + "resources": ["traffiq.com"] + }, + "Trafmag": { + "properties": ["trafmag.com"], + "resources": ["trafmag.com"] + }, + "Traverse": { + "properties": ["traversedata.com"], + "resources": ["traversedlp.com"] + }, + "Travora Media": { + "properties": ["travoramedia.com"], + "resources": [ + "traveladnetwork.com", + "traveladvertising.com", + "travoramedia.com" + ] + }, + "Tremor Video": { + "properties": ["tremorvideo.com"], + "resources": [ + "scanscout.com", + "tmnetads.com", + "tremorhub.com", + "tremormedia.com", + "tremorvideo.com" + ] + }, + "Triggit": { + "properties": ["triggit.com"], + "resources": ["triggit.com"] + }, + "TripleLift": { + "properties": ["triplelift.com"], + "resources": ["3lift.com", "triplelift.com"] + }, + "Trovus": { + "properties": ["trovus.co.uk", "www.trovus.co.uk"], + "resources": ["trovus.co.uk", "www.trovus.co.uk"] + }, + "TruEffect": { + "properties": ["adlegend.com", "trueffect.com"], + "resources": ["adlegend.com", "trueffect.com"] + }, + "Trumba": { + "properties": ["trumba.com"], + "resources": ["trumba.com"] + }, + "TRUSTe": { + "properties": ["truste.com"], + "resources": ["truste.com"] + }, + "TrustX": { + "properties": ["trustx.org"], + "resources": ["trustx.org"] + }, + "TubeMogul": { + "properties": ["tmogul.com", "tubemogul.com"], + "resources": ["tmogul.com", "tubemogul.com"] + }, + "TurnTo": { + "properties": ["turntonetworks.com"], + "resources": ["turnto.com", "turntonetworks.com"] + }, + "Tweetboard": { + "properties": ["tweetboard.com"], + "resources": ["tweetboard.com"] + }, + "Twelvefold": { + "properties": ["buzzlogic.com", "twelvefold.com"], + "resources": ["buzzlogic.com", "twelvefold.com"] + }, + "Twitter": { + "properties": [ + "digits.com", + "fabric.io", + "tweetdeck.com", + "twitter.com", + "twitter.jp" + ], + "resources": [ + "ads-twitter.com", + "fabric.io", + "tweetdeck.com", + "twimg.com", + "twitter.com", + "twitter.jp" + ] + }, + "Twitter Counter": { + "properties": ["twittercounter.com"], + "resources": ["twittercounter.com"] + }, + "Twyn Group": { + "properties": ["twyn-group.com", "twyn.com"], + "resources": ["twyn-group.com", "twyn.com"] + }, + "Tyroo": { + "properties": ["tyroo.com"], + "resources": ["tyroo.com"] + }, + "UberMedia": { + "properties": ["tweetup.com", "ubermedia.com"], + "resources": ["tweetup.com", "ubermedia.com"] + }, + "UberTags": { + "properties": ["ubertags.com"], + "resources": ["ubertags.com"] + }, + "ucfunnel": { + "properties": ["ucfunnel.com"], + "resources": ["aralego.com", "ucfunnel.com"] + }, + "uCoz": { + "properties": ["ucoz.ae", "ucoz.com", "ucoz.fr", "ucoz.net", "ucoz.ru"], + "resources": [ + "ucoz.ae", + "ucoz.br", + "ucoz.com", + "ucoz.du", + "ucoz.fr", + "ucoz.net", + "ucoz.ru" + ] + }, + "Umbel": { + "properties": ["umbel.com"], + "resources": ["umbel.com"] + }, + "Unanimis": { + "properties": ["unanimis.co.uk", "www.unanimis.co.uk"], + "resources": ["unanimis.co.uk", "www.unanimis.co.uk"] + }, + "Unbounce": { + "properties": ["unbounce.com"], + "resources": ["unbounce.com"] + }, + "Underdog Media": { + "properties": ["udmserve.net", "underdogmedia.com"], + "resources": ["udmserve.net", "underdogmedia.com"] + }, + "Undertone": { + "properties": ["undertone.com", "undertonevideo.com"], + "resources": [ + "undertone.com", + "undertonenetworks.com", + "undertonevideo.com" + ] + }, + "UniQlick": { + "properties": ["51network.com", "uniqlick.com", "wanmo.com"], + "resources": ["51network.com", "uniqlick.com", "wanmo.com"] + }, + "Unruly": { + "properties": ["unruly.co"], + "resources": ["unrulymedia.com"] + }, + "Upland": { + "properties": ["uplandsoftware.com"], + "resources": [ + "leadlander.com", + "sf14g.com", + "trackalyzer.com", + "uplandsoftware.com" + ] + }, + "Uptrends": { + "properties": ["uptrends.com"], + "resources": ["uptrends.com"] + }, + "up-value": { + "properties": ["up-value.de"], + "resources": ["up-value.de"] + }, + "Usability Sciences": { + "properties": ["usabilitysciences.com"], + "resources": ["usabilitysciences.com", "webiqonline.com"] + }, + "User Local": { + "properties": ["nakanohito.jp"], + "resources": ["nakanohito.jp"] + }, + "UserVoice": { + "properties": ["uservoice.com"], + "resources": ["uservoice.com"] + }, + "V12 Data": { + "properties": ["v12group.com"], + "resources": ["v12data.com", "v12group.com"] + }, + "Value Ad": { + "properties": ["valuead.com"], + "resources": ["valuead.com"] + }, + "Various": { + "properties": [ + "amigos.com", + "getiton.com", + "medley.com", + "nostringsattached.com", + "various.com" + ], + "resources": [ + "amigos.com", + "getiton.com", + "medley.com", + "nostringsattached.com", + "various.com" + ] + }, + "Vdopia": { + "properties": ["ivdopia.com", "vdopia.com"], + "resources": ["ivdopia.com", "vdopia.com"] + }, + "Veeseo": { + "properties": ["veeseo.com"], + "resources": ["veeseo.com"] + }, + "Velocity Media": { + "properties": ["adsvelocity.com"], + "resources": ["adsvelocity.com"] + }, + "Velti": { + "properties": ["mobclix.com", "velti.com"], + "resources": ["mobclix.com", "velti.com"] + }, + "Vemba": { + "properties": ["vemba.com"], + "resources": ["vemba.com"] + }, + "Venatus Media": { + "properties": ["venatusmedia.com"], + "resources": ["venatusmedia.com"] + }, + "Vendemore": { + "properties": ["vendemore.com"], + "resources": ["vendemore.com"] + }, + "Vendio": { + "properties": ["singlefeed.com", "vendio.com"], + "resources": ["singlefeed.com", "vendio.com"] + }, + "Veoxa": { + "properties": ["veoxa.com"], + "resources": ["veoxa.com"] + }, + "Veremedia": { + "properties": ["veremedia.com"], + "resources": ["veremedia.com"] + }, + "Vertical Acuity": { + "properties": ["verticalacuity.com"], + "resources": ["verticalacuity.com"] + }, + "VerticalHealth": { + "properties": ["verticalhealth.com"], + "resources": ["verticalhealth.net"] + }, + "VerticalResponse": { + "properties": ["verticalresponse.com", "vresp.com"], + "resources": ["verticalresponse.com", "vresp.com"] + }, + "Vertster": { + "properties": ["vertster.com"], + "resources": ["vertster.com"] + }, + "VG WORT": { + "properties": ["vgwort.de"], + "resources": ["vgwort.de"] + }, + "Vibrant Media": { + "properties": ["vibrantmedia.com"], + "resources": ["intellitxt.com", "picadmedia.com", "vibrantmedia.com"] + }, + "VideoIntelligence": { + "properties": ["vi.ai"], + "resources": ["vi.ai"] + }, + "Videology": { + "properties": ["tidaltv.com", "videologygroup.com"], + "resources": ["tidaltv.com", "videologygroup.com"] + }, + "Viewbix": { + "properties": ["qoof.com", "viewbix.com"], + "resources": ["qoof.com", "viewbix.com"] + }, + "VigLink": { + "properties": ["viglink.com"], + "resources": ["viglink.com"] + }, + "Vimeo": { + "properties": ["vimeo.com", "vimeocdn.com"], + "resources": ["vimeo.com", "vimeocdn.com"] + }, + "VINDICO": { + "properties": ["vindicogroup.com", "vindicosuite.com"], + "resources": ["vindicogroup.com", "vindicosuite.com"] + }, + "VisibleBrands": { + "properties": ["visbrands.com"], + "resources": ["visbrands.com"] + }, + "Visible Measures": { + "properties": ["visiblemeasures.com"], + "resources": ["viewablemedia.net", "visiblemeasures.com"] + }, + "VisiStat": { + "properties": ["id.kickfire.com", "sa-as.com"], + "resources": ["d.kickfire.com", "sa-as.com", "visistat.com"] + }, + "Visit Streamer": { + "properties": ["visitstreamer.com"], + "resources": ["visitstreamer.com"] + }, + "vistrac": { + "properties": ["vistrac.com"], + "resources": ["vistrac.com"] + }, + "VisualDNA": { + "properties": ["vdna-assets.com", "visualdna-stats.com", "visualdna.com"], + "resources": ["vdna-assets.com", "visualdna-stats.com", "visualdna.com"] + }, + "ViziSense": { + "properties": ["vizisense.com", "vizisense.net"], + "resources": ["vizisense.com", "vizisense.net"] + }, + "Vizu": { + "properties": ["vizu.com"], + "resources": ["vizu.com"] + }, + "Vizury": { + "properties": ["vizury.com"], + "resources": ["vizury.com"] + }, + "VKontakte": { + "properties": ["vk.com"], + "resources": ["userapi.com", "vk.com", "vkontakte.ru"] + }, + "Voice2Page": { + "properties": ["voice2page.com"], + "resources": ["voice2page.com"] + }, + "Vserv": { + "properties": ["vserv.com", "vserv.mobi"], + "resources": ["vserv.com", "vserv.mobi"] + }, + "Vuble": { + "properties": ["vuble.tv"], + "resources": ["mediabong.com"] + }, + "Wahoha": { + "properties": ["contentwidgets.net", "wahoha.com"], + "resources": ["contentwidgets.net", "wahoha.com"] + }, + "Wayfair": { + "properties": ["wayfair.com"], + "resources": ["wayfair.com"] + }, + "WebAds": { + "properties": ["webads.co.uk", "www.webads.co.uk"], + "resources": ["webads.co.uk", "www.webads.co.uk"] + }, + "Webclicktracker": { + "properties": ["webclicktracker.com"], + "resources": ["webclicktracker.com"] + }, + "Web.com": { + "properties": ["feedperfect.com", "web.com"], + "resources": ["feedperfect.com", "web.com"] + }, + "WebGozar.com": { + "properties": ["webgozar.com", "webgozar.ir"], + "resources": ["webgozar.com", "webgozar.ir"] + }, + "Webmecanik": { + "properties": ["webmecanik.com"], + "resources": ["webmecanik.com"] + }, + "WebMetro": { + "properties": ["dsmmadvantage.com", "revanadigital.com"], + "resources": ["dsmmadvantage.com", "revanadigital.com", "webmetro.com"] + }, + "Webmine": { + "properties": ["webmine.cz"], + "resources": ["authedwebmine.cz", "webmine.cz"] + }, + "WebminePool": { + "properties": ["webminepool.com"], + "resources": ["webminepool.com"] + }, + "Webmining": { + "properties": ["webmining.co"], + "resources": ["webmining.co"] + }, + "Weborama": { + "properties": ["weborama.com"], + "resources": ["weborama.com", "weborama.fr"] + }, + "WebsiteAlive": { + "properties": [ + "websitealive.com", + "websitealive0.com", + "websitealive1.com", + "websitealive2.com", + "websitealive3.com", + "websitealive4.com", + "websitealive5.com", + "websitealive6.com", + "websitealive7.com", + "websitealive8.com", + "websitealive9.com" + ], + "resources": ["websitealive.com"] + }, + "Web Stats": { + "properties": ["onlinewebstats.com"], + "resources": ["onlinewebstats.com"] + }, + "Web Tracking Services": { + "properties": ["web-stat.com", "webtrackingservices.com"], + "resources": ["web-stat.com", "webtrackingservices.com"] + }, + "Webtraffic": { + "properties": ["webtraffic.no", "webtraffic.se"], + "resources": ["webtraffic.no", "webtraffic.se"] + }, + "Web Traxs": { + "properties": ["webtraxs.com"], + "resources": ["webtraxs.com"] + }, + "Webtrekk": { + "properties": ["webtrekk.com", "webtrekk.net"], + "resources": ["webtrekk.com", "webtrekk.net"] + }, + "Webtrends": { + "properties": ["webtrends.com"], + "resources": ["reinvigorate.net", "webtrends.com", "webtrendslive.com"] + }, + "White Ops": { + "properties": ["adzmath.com", "whiteops.com"], + "resources": ["adzmath.com", "whiteops.com"] + }, + "whos.amung.us": { + "properties": ["amung.us"], + "resources": ["amung.us"] + }, + "WideOrbit": { + "properties": ["wideorbit.com"], + "resources": ["dep-x.com"] + }, + "Wingify": { + "properties": ["vwo.com", "wingify.com"], + "resources": ["visualwebsiteoptimizer.com", "vwo.com", "wingify.com"] + }, + "WiredMinds": { + "properties": ["wiredminds.de"], + "resources": ["wiredminds.com", "wiredminds.de"] + }, + "Wishabi": { + "properties": ["wishabi.com", "wishabi.net"], + "resources": ["flipp.com", "wishabi.com", "wishabi.net"] + }, + "Woopra": { + "properties": ["woopra-ns.com", "woopra.com"], + "resources": ["woopra-ns.com", "woopra.com"] + }, + "WordStream": { + "properties": ["wordstream.com"], + "resources": ["wordstream.com"] + }, + "WOW Analytics": { + "properties": ["wowanalytics.co.uk"], + "resources": ["wowanalytics.co.uk"] + }, + "WPP": { + "properties": [ + "compete.com", + "decdna.net", + "groupm.com", + "kantarmedia.com", + "mecglobal.com", + "mindshareworld.com", + "themig.com", + "wpp.com", + "xaxis.com" + ], + "resources": [ + "247realmedia.com", + "accelerator-media.com", + "acceleratorusa.com", + "compete.com", + "decdna.net", + "decideinteractive.com", + "gmads.net", + "groupm.com", + "kantarmedia.com", + "mecglobal.com", + "mindshare.nl", + "mindshareworld.com", + "mookie1.com", + "pm14.com", + "realmedia.com", + "targ.ad", + "themig.com", + "wpp.com", + "xaxis.com" + ] + }, + "Wysistat": { + "properties": ["wysistat.net"], + "resources": ["wysistat.com", "wysistat.net"] + }, + "xAd": { + "properties": ["xad.com"], + "resources": ["xad.com"] + }, + "Xertive Media": { + "properties": ["xertivemedia.com"], + "resources": ["admanager-xertive.com", "xertivemedia.com"] + }, + "xplosion interactive": { + "properties": ["xplosion.de"], + "resources": ["xplosion.de"] + }, + "Xrost DS": { + "properties": ["adplan-ds.com"], + "resources": ["adplan-ds.com"] + }, + "Yabuka": { + "properties": ["yabuka.com"], + "resources": ["yabuka.com"] + }, + "Yahoo!": { + "properties": [ + "flickr.com", + "flurry.com", + "tumblr.com", + "yahoo.co.jp", + "yahoo.com", + "yahoostudios.com", + "yuilibrary.com" + ], + "resources": [ + "adinterax.com", + "adrevolver.com", + "bluelithium.com", + "dapper.net", + "flickr.com", + "flurry.com", + "interclick.com", + "luminate.com", + "mybloglog.com", + "overture.com", + "pixazza.com", + "rightmedia.com", + "rmxads.com", + "rocketmail.com", + "secure-adserver.com", + "staticflickr.com", + "tumblr.com", + "yahoo.co.jp", + "yahoo.com", + "yahooapis.com", + "yahooapis.jp", + "yahoofs.com", + "yieldmanager.com", + "yieldmanager.net", + "yimg.com", + "yimg.jp", + "yldmgrimg.net", + "ymail.com", + "yuilibrary.com", + "zenfs.com" + ] + }, + "Yandex": { + "properties": [ + "kinopoisk.ru", + "moikrug.ru", + "yadi.sk", + "yandex.by", + "yandex.com", + "yandex.com.tr", + "yandex.ru", + "yandex.st", + "yandex.ua" + ], + "resources": [ + "api-maps.yandex.ru", + "moikrug.ru", + "web-visor.com", + "yandex.by", + "yandex.com", + "yandex.com.tr", + "yandex.ru", + "yandex.st", + "yandex.ua" + ] + }, + "Ybrant Digital": { + "properties": ["addynamix.com", "brightcom.com", "luj.sdsjweb.com"], + "resources": [ + "addynamix.com", + "adserverplus.com", + "brightcom.com", + "oridian.com", + "ybrantdigital.com" + ] + }, + "YD": { + "properties": ["ydworld.com", "yieldivision.com"], + "resources": ["ydworld.com", "yieldivision.com"] + }, + "YellowHammer": { + "properties": ["yhmg.com"], + "resources": [ + "attracto.com", + "clickhype.com", + "yellowhammermg.com", + "yhmg.com" + ] + }, + "YellowTracker": { + "properties": ["yellowtracker.com"], + "resources": ["yellowtracker.com"] + }, + "Yes Ads": { + "properties": ["yesads.com"], + "resources": ["yesads.com"] + }, + "YieldAds": { + "properties": ["yieldads.com"], + "resources": ["yieldads.com"] + }, + "YieldBids": { + "properties": ["ybx.io"], + "resources": ["ybx.io"] + }, + "YieldBot": { + "properties": ["yieldbot.com"], + "resources": ["yldbt.com"] + }, + "YieldBuild": { + "properties": ["yieldbuild.com"], + "resources": ["yieldbuild.com"] + }, + "Yieldify": { + "properties": ["yieldify.com"], + "resources": ["yieldify.com"] + }, + "Yieldlab": { + "properties": ["yieldlab.de", "yieldlab.net"], + "resources": ["yieldlab.de", "yieldlab.net"] + }, + "Yieldmo": { + "properties": ["yieldmo.com"], + "resources": ["yieldmo.com"] + }, + "YieldNexus": { + "properties": ["ynxs.io"], + "resources": ["ynxs.io"] + }, + "YOC": { + "properties": ["yoc.com"], + "resources": ["yoc.com"] + }, + "Yoggrt": { + "properties": ["yoggrt.com"], + "resources": ["yoggrt.com"] + }, + "youknowbest": { + "properties": ["youknowbest.com"], + "resources": ["youknowbest.com"] + }, + "YSance": { + "properties": ["ysance.com"], + "resources": ["y-track.com"] + }, + "YuMe": { + "properties": ["yume.com", "yumenetworks.com"], + "resources": ["yume.com", "yumenetworks.com"] + }, + "ZafulAffiliate": { + "properties": ["zaful.com"], + "resources": ["zaful.com"] + }, + "Zango": { + "properties": ["metricsdirect.com", "zango.com"], + "resources": ["metricsdirect.com", "zango.com"] + }, + "zanox": { + "properties": ["buy.at", "zanox-affiliate.de", "zanox.com"], + "resources": ["buy.at", "zanox-affiliate.de", "zanox.com"] + }, + "zapunited": { + "properties": ["zaparena.com", "zapunited.com"], + "resources": ["zaparena.com", "zapunited.com"] + }, + "ZEDO": { + "properties": ["zedo.com", "zincx.com"], + "resources": ["zedo.com", "zincx.com"] + }, + "Zefir": { + "properties": ["ze-fir.com"], + "resources": ["ze-fir.com"] + }, + "Zemanta": { + "properties": ["zemanta.com"], + "resources": ["zemanta.com"] + }, + "Zendesk": { + "properties": ["zendesk.com"], + "resources": ["zendesk.com"] + }, + "ZestAd": { + "properties": ["zestad.com"], + "resources": ["zestad.com"] + }, + "Zeta Email Solutions": { + "properties": ["insightgrit.com", "zetaemailsolutions.com"], + "resources": ["insightgrit.com", "zetaemailsolutions.com"] + }, + "Zopim": { + "properties": ["zopim.com"], + "resources": ["zopim.com"] + }, + "Zumobi": { + "properties": ["zumobi.com"], + "resources": ["zumobi.com"] + }, + "ZypMedia": { + "properties": ["zypmedia.com"], + "resources": ["extend.tv", "zypmedia.com"] + } } diff --git a/mobile/android/android-components/components/browser/errorpages/src/main/assets/errorPageScripts.js b/mobile/android/android-components/components/browser/errorpages/src/main/assets/errorPageScripts.js index 7836e30ac0..09804908f7 100644 --- a/mobile/android/android-components/components/browser/errorpages/src/main/assets/errorPageScripts.js +++ b/mobile/android/android-components/components/browser/errorpages/src/main/assets/errorPageScripts.js @@ -6,50 +6,54 @@ * Handles the parsing of the ErrorPages URI and then passes them to injectValues */ function parseQuery(queryString) { - if (queryString[0] === '?') { - queryString = queryString.substr(1); - } - const query = Object.fromEntries(new URLSearchParams(queryString).entries()); - injectValues(query) - updateShowSSL(query) - updateShowHSTS(query) -}; + if (queryString[0] === "?") { + queryString = queryString.substr(1); + } + const query = Object.fromEntries(new URLSearchParams(queryString).entries()); + injectValues(query); + updateShowSSL(query); + updateShowHSTS(query); +} /** * Updates the HTML elements based on the queryMap */ function injectValues(queryMap) { - const tryAgainButton = document.getElementById('errorTryAgain') - const continueHttpButton = document.getElementById("continueHttp") - + const tryAgainButton = document.getElementById("errorTryAgain"); + const continueHttpButton = document.getElementById("continueHttp"); - // Go through each element and inject the values - document.title = queryMap.title - tryAgainButton.innerHTML = queryMap.button - continueHttpButton.innerHTML = queryMap.continueHttpButton - document.getElementById('errorTitleText').innerHTML = queryMap.title - document.getElementById('errorShortDesc').innerHTML = queryMap.description - document.getElementById('advancedButton').innerHTML = queryMap.badCertAdvanced - document.getElementById('badCertTechnicalInfo').innerHTML = queryMap.badCertTechInfo - document.getElementById('advancedPanelBackButton').innerHTML = queryMap.badCertGoBack - document.getElementById('advancedPanelAcceptButton').innerHTML = queryMap.badCertAcceptTemporary - document.getElementById('advancedPanelAcceptButton').s = queryMap.badCertAcceptTemporary + // Go through each element and inject the values + document.title = queryMap.title; + tryAgainButton.innerHTML = queryMap.button; + continueHttpButton.innerHTML = queryMap.continueHttpButton; + document.getElementById("errorTitleText").innerHTML = queryMap.title; + document.getElementById("errorShortDesc").innerHTML = queryMap.description; + document.getElementById("advancedButton").innerHTML = + queryMap.badCertAdvanced; + document.getElementById("badCertTechnicalInfo").innerHTML = + queryMap.badCertTechInfo; + document.getElementById("advancedPanelBackButton").innerHTML = + queryMap.badCertGoBack; + document.getElementById("advancedPanelAcceptButton").innerHTML = + queryMap.badCertAcceptTemporary; + document.getElementById("advancedPanelAcceptButton").s = + queryMap.badCertAcceptTemporary; - // If no image is passed in, remove the element so as not to leave an empty iframe - const errorImage = document.getElementById('errorImage'); - if (!queryMap.image) { - errorImage.remove(); - } else { - errorImage.src = "resource://android/assets/" + queryMap.image; - } + // If no image is passed in, remove the element so as not to leave an empty iframe + const errorImage = document.getElementById("errorImage"); + if (!queryMap.image) { + errorImage.remove(); + } else { + errorImage.src = "resource://android/assets/" + queryMap.image; + } - if (queryMap.showContinueHttp === "true") { - // On the "HTTPS-Only" error page "Try again" doesn't make sense since reloading the page - // will just show an error page again. - tryAgainButton.style.display = 'none'; - } else { - continueHttpButton.style.display = 'none'; - } + if (queryMap.showContinueHttp === "true") { + // On the "HTTPS-Only" error page "Try again" doesn't make sense since reloading the page + // will just show an error page again. + tryAgainButton.style.display = "none"; + } else { + continueHttpButton.style.display = "none"; + } } var advancedVisible = false; @@ -58,65 +62,75 @@ var advancedVisible = false; * Used to show or hide the "advanced" button based on the validity of the SSL certificate */ function updateShowSSL(queryMap) { - /** @type {'true' | 'false'} */ - const showSSL = queryMap.showSSL; - if (typeof document.addCertException === "undefined") { - document.getElementById('advancedButton').style.display='none'; + /** @type {'true' | 'false'} */ + const showSSL = queryMap.showSSL; + if (typeof document.addCertException === "undefined") { + document.getElementById("advancedButton").style.display = "none"; + } else { + if (showSSL === "true") { + document.getElementById("advancedButton").style.display = "block"; } else { - if (showSSL === 'true') { - document.getElementById('advancedButton').style.display='block'; - } else { - document.getElementById('advancedButton').style.display='none'; - } + document.getElementById("advancedButton").style.display = "none"; } + } } /** * Used to show or hide the "accept" button based for the HSTS error page */ function updateShowHSTS(queryMap) { - const showHSTS = queryMap.showHSTS; - if (showHSTS === 'true') { - document.getElementById('advancedButton').style.display='block'; - document.getElementById('advancedPanelAcceptButton').style.display='none'; - } + const showHSTS = queryMap.showHSTS; + if (showHSTS === "true") { + document.getElementById("advancedButton").style.display = "block"; + document.getElementById("advancedPanelAcceptButton").style.display = "none"; + } } /** * Used to display information about the SSL certificate in `error_pages.html` */ function toggleAdvanced() { - if (advancedVisible) { - document.getElementById('badCertAdvancedPanel').style.display='none'; - } else { - document.getElementById('badCertAdvancedPanel').style.display='block'; - } - advancedVisible = !advancedVisible; + if (advancedVisible) { + document.getElementById("badCertAdvancedPanel").style.display = "none"; + } else { + document.getElementById("badCertAdvancedPanel").style.display = "block"; + } + advancedVisible = !advancedVisible; } /** * Used to bypass an SSL pages in `error_pages.html` */ async function acceptAndContinue(temporary) { - try { - await document.addCertException(temporary); - location.reload(); - } catch (error) { - console.error("Unexpected error: " + error) - } + try { + await document.addCertException(temporary); + location.reload(); + } catch (error) { + console.error("Unexpected error: " + error); + } } -document.addEventListener('DOMContentLoaded', function () { - if (window.history.length == 1) { - document.getElementById('advancedPanelBackButton').style.display = 'none'; - } else { - document.getElementById('advancedPanelBackButton').addEventListener('click', () => window.history.back()); - } +document.addEventListener("DOMContentLoaded", function () { + if (window.history.length == 1) { + document.getElementById("advancedPanelBackButton").style.display = "none"; + } else { + document + .getElementById("advancedPanelBackButton") + .addEventListener("click", () => window.history.back()); + } - document.getElementById('errorTryAgain').addEventListener('click', () => window.location.reload()); - document.getElementById('advancedButton').addEventListener('click', toggleAdvanced); - document.getElementById('advancedPanelAcceptButton').addEventListener('click', () => acceptAndContinue(true)); - document.getElementById('continueHttp').addEventListener('click', () => document.reloadWithHttpsOnlyException()); + document + .getElementById("errorTryAgain") + .addEventListener("click", () => window.location.reload()); + document + .getElementById("advancedButton") + .addEventListener("click", toggleAdvanced); + document + .getElementById("advancedPanelAcceptButton") + .addEventListener("click", () => acceptAndContinue(true)); + document + .getElementById("continueHttp") + .addEventListener("click", () => document.reloadWithHttpsOnlyException()); }); parseQuery(document.documentURI); diff --git a/mobile/android/android-components/components/browser/errorpages/src/main/assets/error_page_js.html b/mobile/android/android-components/components/browser/errorpages/src/main/assets/error_page_js.html index 397e237303..a6ae19df7c 100644 --- a/mobile/android/android-components/components/browser/errorpages/src/main/assets/error_page_js.html +++ b/mobile/android/android-components/components/browser/errorpages/src/main/assets/error_page_js.html @@ -5,54 +5,64 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html xmlns="http://www.w3.org/1999/xhtml"> - <head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width; user-scalable=false;" /> - <meta http-equiv="Content-Security-Policy" content="default-src resource:; object-src 'none'" /> - <link rel="stylesheet" type="text/css" href="error_style.css"> - </head> - - <body id="errorPage" dir="auto"> - <!-- PAGE CONTAINER (for styling purposes only) --> - <div id="errorPageContainer"> - - <!-- Error Image --> - <iframe id="errorImage" src="" frameborder="0"></iframe> - - <!-- Error Title --> - <div id="errorTitle"> - <h1 id="errorTitleText"></h1> - </div> - - <!-- LONG CONTENT (the section most likely to require scrolling) --> - <div id="errorLongContent"> - <div id="errorShortDesc"></div> - </div> - - <!-- Retry Button --> - <button id="errorTryAgain"></button> - - <!-- Advanced Button --> - <button id="advancedButton" class="buttonSecondary"></button> - - <!-- "Continue to HTTP site" Button (For HTTPS-Only error page only) --> - <button id="continueHttp" class="buttonSecondary"></button> - - <div id="advancedPanelContainer"> - <div id="badCertAdvancedPanel" class="advanced-panel"> - <p id="badCertTechnicalInfo"></p> - <div id="advancedPanelBackButtonContainer" class="advancedPanelButtonContainer"> - <button id="advancedPanelBackButton"></button> - </div> - <div id="advancedPanelAcceptButtonContainer" class="advancedPanelButtonContainer"> - <button id="advancedPanelAcceptButton" class="buttonSecondary"></button> - </div> - </div> - </div> - </div> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width; user-scalable=false;" /> + <meta + http-equiv="Content-Security-Policy" + content="default-src resource:; object-src 'none'" + /> + <link rel="stylesheet" type="text/css" href="error_style.css" /> + </head> + + <body id="errorPage" dir="auto"> + <!-- PAGE CONTAINER (for styling purposes only) --> + <div id="errorPageContainer"> + <!-- Error Image --> + <iframe id="errorImage" src="" frameborder="0"></iframe> + + <!-- Error Title --> + <div id="errorTitle"> + <h1 id="errorTitleText"></h1> + </div> + + <!-- LONG CONTENT (the section most likely to require scrolling) --> + <div id="errorLongContent"> + <div id="errorShortDesc"></div> + </div> - </body> + <!-- Retry Button --> + <button id="errorTryAgain"></button> + + <!-- Advanced Button --> + <button id="advancedButton" class="buttonSecondary"></button> + + <!-- "Continue to HTTP site" Button (For HTTPS-Only error page only) --> + <button id="continueHttp" class="buttonSecondary"></button> + + <div id="advancedPanelContainer"> + <div id="badCertAdvancedPanel" class="advanced-panel"> + <p id="badCertTechnicalInfo"></p> + <div + id="advancedPanelBackButtonContainer" + class="advancedPanelButtonContainer" + > + <button id="advancedPanelBackButton"></button> + </div> + <div + id="advancedPanelAcceptButtonContainer" + class="advancedPanelButtonContainer" + > + <button + id="advancedPanelAcceptButton" + class="buttonSecondary" + ></button> + </div> + </div> + </div> + </div> + </body> - <!-- Each consumer that uses a unique HTML error page must implement a parsing script--> - <script src="./errorPageScripts.js"></script> + <!-- Each consumer that uses a unique HTML error page must implement a parsing script--> + <script src="./errorPageScripts.js"></script> </html> diff --git a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-azb/strings.xml b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-azb/strings.xml index 158dbeb60f..b9ca4c9688 100644 --- a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-azb/strings.xml +++ b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-azb/strings.xml @@ -83,6 +83,21 @@ <string name="mozac_browser_errorpages_unknown_protocol_title">تانینمایان پروتکل</string> <!-- The document title and heading of an error page. --> + <string name="mozac_browser_errorpages_file_not_found_title">فایل تاپیلمادی</string> + + <!-- The document title and heading of an error page. --> + <string name="mozac_browser_errorpages_file_access_denied_title">فایلؽن ایشلدیلمهسینه ایجازه وئریلمهدی</string> + + <!-- The document title and heading of an error page. --> + <string name="mozac_browser_errorpages_proxy_connection_refused_title">پروکسی سرور باغلانتینی رد ائتدی</string> + + <!-- The document title and heading of an error page. --> + <string name="mozac_browser_errorpages_unknown_proxy_host_title">پروکسی سرور تاپیلمادی</string> + + <!-- The document title and heading of an error page. --> + <string name="mozac_browser_errorpages_safe_browsing_malware_uri_title">ضرر وئریجی سایت سورونو</string> + + <!-- The document title and heading of an error page. --> <string name="mozac_browser_errorpages_safe_browsing_unwanted_uri_title">ایستنمیهن سایت سورونو</string> <!-- The document title and heading of an error page. --> diff --git a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-su/strings.xml b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-su/strings.xml index 2620051760..cc7efa64eb 100644 --- a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-su/strings.xml +++ b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-su/strings.xml @@ -115,7 +115,7 @@ <string name="mozac_browser_errorpages_offline_title">Mode Oplén</string> <!-- The error message shown when a website cannot be loaded because the browser is in offline mode. --> - <string name="mozac_browser_errorpages_offline_message"><![CDATA[<p>Panyungsi keur leumpang dina mode luring na jeung teu tiasa nyambung ka barang anu dipénta.</p> + <string name="mozac_browser_errorpages_offline_message"><![CDATA[<p>Panyungsi keur leumpang dina modeu luring na jeung teu tiasa nyambung ka barang anu dipénta.</p> <ul> <li>Ieu parangkat nyambung ka jaringan aktip heunteu?</li> <li>Pencét "Cobi deui" pikeun ngalih ka modeu daring sareng ngamuat deui ieu kaca.</li> @@ -125,7 +125,7 @@ <string name="mozac_browser_errorpages_port_blocked_title">Port diwates pikeun kaamanan</string> <!-- The error message shown when the browser prevents loading a website on a restricted port. --> - <string name="mozac_browser_errorpages_port_blocked_message"><![CDATA[<p>Alamat anu dipénta nyebutkeun port (contona <q>mozilla.org:80</q> pikeun port 80 di mozilla.org) galibna dipaké <em>lain</em> pikeun nyungsi Raramat. Panyungsi geus ngabolaykeun paménta pikeun kaamanan anjeun.</p>]]></string> + <string name="mozac_browser_errorpages_port_blocked_message"><![CDATA[<p>Alamat anu dipénta nyebutkeun port (contona <q>mozilla.org:80</q> pikeun port 80 di mozilla.org) umumna dipaké <em>lain</em> pikeun nyungsi Raramat. Panyungsi geus ngabolaykeun paménta pikeun kaamanan anjeun.</p>]]></string> <!-- The document title and heading of the error page shown when the Internet connection is disrupted while loading a website. --> <string name="mozac_browser_errorpages_net_reset_title">Sambunganana dirését</string> @@ -206,7 +206,7 @@ </ul>]]></string> <!-- The document title and heading of an error page. --> - <string name="mozac_browser_errorpages_unknown_protocol_title">Protokol Teu Dipikawanoh</string> + <string name="mozac_browser_errorpages_unknown_protocol_title">Protokol Teu Dipiwanoh</string> <string name="mozac_browser_errorpages_unknown_protocol_message"><![CDATA[<p>Alamatna méré protocol (e.g., <q>wxyz://</q>) anu teu dipikawanoh ku pamaluruh, ku kituna pamaluruhna teu bisa nyambung kalawan bener ka lokana.</p> <ul> @@ -273,7 +273,7 @@ <!-- The title of the error page for websites that do not support HTTPS when HTTPS-Only is turned on --> <string name="mozac_browser_errorpages_httpsonly_title">Situs Aman Teu Sayaga</string> <!-- The text of the error page for websites that do not support HTTPS when HTTPS-Only is turned on. %1$s will be replaced with the URL of the website. --> - <string name="mozac_browser_errorpages_httpsonly_message"><![CDATA[Anjeun ngahurungkeun Mode Ukur-HTTPS pikeun kaamanan lanjutan, anapon pérsi HTTPS <em>%1$s</em> teu sayaga.]]></string> + <string name="mozac_browser_errorpages_httpsonly_message"><![CDATA[Anjeun ngahurungkeun Mode Ukur-HTTPS pikeun kaamanan terusan, anapon pérsi HTTPS <em>%1$s</em> teu sayaga.]]></string> <!-- Button on error page for websites that do not support HTTPS when HTTPS-Only is turned on. Clicking the button allows the user to nevertheless load the website using HTTP. --> <string name="mozac_browser_errorpages_httpsonly_button">Teruskeun ka Situs HTTP</string> </resources> diff --git a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-sv-rSE/strings.xml b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-sv-rSE/strings.xml index 9a0bf69388..4f22ac030e 100644 --- a/mobile/android/android-components/components/browser/errorpages/src/main/res/values-sv-rSE/strings.xml +++ b/mobile/android/android-components/components/browser/errorpages/src/main/res/values-sv-rSE/strings.xml @@ -241,7 +241,7 @@ <ul> <li>Kan objektet ha bytt namn, tagits bort eller flyttat?</li> <li>Finns det stavfel, stor bokstav eller annat typografiskt fel i adressen?</li> - <li>Har du tillräckliga åtkomstbehörigheter till den begärda objektet?</li> + <li>Har du tillräckliga åtkomstbehörigheter till det begärda objektet?</li> </ul> ]]></string> diff --git a/mobile/android/android-components/components/browser/icons/src/main/assets/extensions/browser-icons/icons.js b/mobile/android/android-components/components/browser/icons/src/main/assets/extensions/browser-icons/icons.js index 20eada9a19..bc2c6ee35e 100644 --- a/mobile/android/android-components/components/browser/icons/src/main/assets/extensions/browser-icons/icons.js +++ b/mobile/android/android-components/components/browser/icons/src/main/assets/extensions/browser-icons/icons.js @@ -2,80 +2,81 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - /* - * This web extension looks for known icon tags, collects URLs and available - * meta data (e.g. sizes) and passes that to the app code. - */ +/* + * This web extension looks for known icon tags, collects URLs and available + * meta data (e.g. sizes) and passes that to the app code. + */ /** * Takes a DOMTokenList and returns a String array. */ function sizesToList(sizes) { - if (sizes == null) { - return [] - } + if (sizes == null) { + return []; + } - if (!(sizes instanceof DOMTokenList)) { - return [] - } + if (!(sizes instanceof DOMTokenList)) { + return []; + } - return Array.from(sizes) + return Array.from(sizes); } function collect_link_icons(icons, rel) { - document.querySelectorAll('link[rel="' + rel + '"]').forEach( - function(currentValue, currentIndex, listObj) { - icons.push({ - 'type': rel, - 'href': currentValue.href, - 'sizes': sizesToList(currentValue.sizes), - 'mimeType': currentValue.type - }); - }) + document + .querySelectorAll('link[rel="' + rel + '"]') + .forEach(function (currentValue, currentIndex, listObj) { + icons.push({ + type: rel, + href: currentValue.href, + sizes: sizesToList(currentValue.sizes), + mimeType: currentValue.type, + }); + }); } function collect_meta_property_icons(icons, property) { - document.querySelectorAll('meta[property="' + property + '"]').forEach( - function(currentValue, currentIndex, listObj) { - icons.push({ - 'type': property, - 'href': currentValue.content - }) - } - ) + document + .querySelectorAll('meta[property="' + property + '"]') + .forEach(function (currentValue, currentIndex, listObj) { + icons.push({ + type: property, + href: currentValue.content, + }); + }); } function collect_meta_name_icons(icons, name) { - document.querySelectorAll('meta[name="' + name + '"]').forEach( - function(currentValue, currentIndex, listObj) { - icons.push({ - 'type': name, - 'href': currentValue.content - }) - } - ) + document + .querySelectorAll('meta[name="' + name + '"]') + .forEach(function (currentValue, currentIndex, listObj) { + icons.push({ + type: name, + href: currentValue.content, + }); + }); } let icons = []; -collect_link_icons(icons, 'icon'); -collect_link_icons(icons, 'shortcut icon'); -collect_link_icons(icons, 'fluid-icon') -collect_link_icons(icons, 'apple-touch-icon') -collect_link_icons(icons, 'image_src') -collect_link_icons(icons, 'apple-touch-icon image_src') -collect_link_icons(icons, 'apple-touch-icon-precomposed') +collect_link_icons(icons, "icon"); +collect_link_icons(icons, "shortcut icon"); +collect_link_icons(icons, "fluid-icon"); +collect_link_icons(icons, "apple-touch-icon"); +collect_link_icons(icons, "image_src"); +collect_link_icons(icons, "apple-touch-icon image_src"); +collect_link_icons(icons, "apple-touch-icon-precomposed"); -collect_meta_property_icons(icons, 'og:image') -collect_meta_property_icons(icons, 'og:image:url') -collect_meta_property_icons(icons, 'og:image:secure_url') +collect_meta_property_icons(icons, "og:image"); +collect_meta_property_icons(icons, "og:image:url"); +collect_meta_property_icons(icons, "og:image:secure_url"); -collect_meta_name_icons(icons, 'twitter:image') -collect_meta_name_icons(icons, 'msapplication-TileImage') +collect_meta_name_icons(icons, "twitter:image"); +collect_meta_name_icons(icons, "msapplication-TileImage"); let message = { - 'url': document.location.href, - 'icons': icons -} + url: document.location.href, + icons: icons, +}; browser.runtime.sendNativeMessage("MozacBrowserIcons", message); diff --git a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/BrowserIcons.kt b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/BrowserIcons.kt index 3bf5c2b2ff..fe44cfc6be 100644 --- a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/BrowserIcons.kt +++ b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/BrowserIcons.kt @@ -38,10 +38,12 @@ import mozilla.components.browser.icons.extension.IconMessageHandler import mozilla.components.browser.icons.generator.DefaultIconGenerator import mozilla.components.browser.icons.generator.IconGenerator import mozilla.components.browser.icons.loader.DataUriIconLoader +import mozilla.components.browser.icons.loader.DefaultMemoryInfoProvider import mozilla.components.browser.icons.loader.DiskIconLoader import mozilla.components.browser.icons.loader.HttpIconLoader import mozilla.components.browser.icons.loader.IconLoader import mozilla.components.browser.icons.loader.MemoryIconLoader +import mozilla.components.browser.icons.loader.MemoryInfoProvider import mozilla.components.browser.icons.loader.NonBlockingHttpIconLoader import mozilla.components.browser.icons.pipeline.IconResourceComparator import mozilla.components.browser.icons.preparer.DiskIconPreparer @@ -91,6 +93,7 @@ class BrowserIcons constructor( private val context: Context, httpClient: Client, private val generator: IconGenerator = DefaultIconGenerator(), + private val memoryInfoProvider: MemoryInfoProvider = DefaultMemoryInfoProvider(context), private val preparers: List<IconPreprarer> = listOf( TippyTopIconPreparer(context.assets), MemoryIconPreparer(sharedMemoryCache), @@ -99,7 +102,10 @@ class BrowserIcons constructor( internal var loaders: List<IconLoader> = listOf( MemoryIconLoader(sharedMemoryCache), DiskIconLoader(sharedDiskCache), - HttpIconLoader(httpClient), + HttpIconLoader( + httpClient = httpClient, + memoryInfoProvider = memoryInfoProvider, + ), DataUriIconLoader(), ), private val decoders: List<ImageDecoder> = listOf( @@ -120,7 +126,10 @@ class BrowserIcons constructor( private val maximumSize = context.resources.getDimensionPixelSize(R.dimen.mozac_browser_icons_maximum_size) private val minimumSize = context.resources.getDimensionPixelSize(R.dimen.mozac_browser_icons_minimum_size) private val scope = CoroutineScope(jobDispatcher) - private val backgroundHttpIconLoader = NonBlockingHttpIconLoader(httpClient) { request, resource, result -> + private val backgroundHttpIconLoader = NonBlockingHttpIconLoader( + httpClient = httpClient, + memoryInfoProvider = DefaultMemoryInfoProvider(context), + ) { request, resource, result -> val desiredSize = request.getDesiredSize(context, minimumSize, maximumSize) val icon = decodeIconLoaderResult(result, decoders, desiredSize) diff --git a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/HttpIconLoader.kt b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/HttpIconLoader.kt index 430f46f3ec..d3217bc4b2 100644 --- a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/HttpIconLoader.kt +++ b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/HttpIconLoader.kt @@ -12,26 +12,30 @@ import androidx.core.net.toUri import mozilla.components.browser.icons.Icon import mozilla.components.browser.icons.IconRequest import mozilla.components.concept.fetch.Client +import mozilla.components.concept.fetch.Headers import mozilla.components.concept.fetch.Request import mozilla.components.concept.fetch.Response import mozilla.components.concept.fetch.isSuccess import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.android.net.isHttpOrHttps import mozilla.components.support.ktx.kotlin.sanitizeURL +import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.TimeUnit private const val CONNECT_TIMEOUT = 2L // Seconds private const val READ_TIMEOUT = 10L // Seconds +private const val MAX_DOWNLOAD_BYTES = 1048576 // 1MB /** * [IconLoader] implementation that will try to download the icon for resources that point to an http(s) URL. */ open class HttpIconLoader( private val httpClient: Client, + private val memoryInfoProvider: MemoryInfoProvider, ) : IconLoader { - private val logger = Logger("HttpIconLoader") private val failureCache = FailureCache() + private val logger = Logger("HttpIconLoader") override fun load(context: Context, request: IconRequest, resource: IconRequest.Resource): IconLoader.Result { if (!shouldDownload(resource)) { @@ -78,10 +82,45 @@ open class HttpIconLoader( protected fun shouldDownload(resource: IconRequest.Resource): Boolean { return resource.url.sanitizeURL().toUri().isHttpOrHttps && !failureCache.hasFailedRecently(resource.url) } -} -private fun Response.toIconLoaderResult() = body.useStream { - IconLoader.Result.BytesResult(it.readBytes(), Icon.Source.DOWNLOAD) + private fun Response.toIconLoaderResult(): IconLoader.Result { + // Compare the Response Content-Length header with the available memory on device + val contentLengthHeader = headers[Headers.Names.CONTENT_LENGTH] + if (!contentLengthHeader.isNullOrEmpty()) { + val contentLength = contentLengthHeader.toLong() + return if (contentLength > MAX_DOWNLOAD_BYTES || contentLength > memoryInfoProvider.getAvailMem()) { + IconLoader.Result.NoResult + } else { + // Load the icon without reading to buffers since the checks above passed + body.useStream { + IconLoader.Result.BytesResult(it.readBytes(), Icon.Source.DOWNLOAD) + } + } + } else { + // Read the response body in chunks and check with available memory to prevent exceeding it + val buffer = ByteArray(DEFAULT_BUFFER_SIZE) + return ByteArrayOutputStream().use { outStream -> + body.useStream { inputStream -> + var bytesRead = 0 + var bytesInChunk: Int + + while (inputStream.read(buffer).also { bytesInChunk = it } != -1) { + outStream.write(buffer, 0, bytesInChunk) + bytesRead += bytesInChunk + + if (bytesRead > MAX_DOWNLOAD_BYTES || bytesRead > memoryInfoProvider.getAvailMem()) { + return@useStream IconLoader.Result.NoResult + } + + if (bytesInChunk < DEFAULT_BUFFER_SIZE) { + break + } + } + IconLoader.Result.BytesResult(outStream.toByteArray(), Icon.Source.DOWNLOAD) + } + } + } + } } private const val MAX_FAILURE_URLS = 25 diff --git a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/MemoryInfoProvider.kt b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/MemoryInfoProvider.kt new file mode 100644 index 0000000000..52f8bcbb28 --- /dev/null +++ b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/MemoryInfoProvider.kt @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.icons.loader + +import android.app.ActivityManager +import android.content.Context +import androidx.core.content.ContextCompat + +/** + * This class provides information about the device memory info without exposing the android + * framework APIs directly, making it easier to test the code that depends on it. + */ +interface MemoryInfoProvider { + /** + * Returns the device's available memory + */ + fun getAvailMem(): Long +} + +/** + * This class retrieves the available memory on device using activity manager. + */ +class DefaultMemoryInfoProvider(private val context: Context) : MemoryInfoProvider { + override fun getAvailMem(): Long { + val activityManager = ContextCompat.getSystemService(context, ActivityManager::class.java) + val memoryInfo = ActivityManager.MemoryInfo() + activityManager?.getMemoryInfo(memoryInfo) + return memoryInfo.availMem + } +} diff --git a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoader.kt b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoader.kt index c3203dc13f..fcd64662d6 100644 --- a/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoader.kt +++ b/mobile/android/android-components/components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoader.kt @@ -24,9 +24,10 @@ import mozilla.components.concept.fetch.Client */ class NonBlockingHttpIconLoader( httpClient: Client, + memoryInfoProvider: MemoryInfoProvider, private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO), private val loadCallback: (IconRequest, IconRequest.Resource, IconLoader.Result) -> Unit, -) : HttpIconLoader(httpClient) { +) : HttpIconLoader(httpClient, memoryInfoProvider) { override fun load(context: Context, request: IconRequest, resource: IconRequest.Resource): IconLoader.Result { if (!shouldDownload(resource)) { return IconLoader.Result.NoResult diff --git a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/BrowserIconsTest.kt b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/BrowserIconsTest.kt index 67a392d0a2..b14b5a30b3 100644 --- a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/BrowserIconsTest.kt +++ b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/BrowserIconsTest.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import mozilla.components.browser.icons.generator.IconGenerator +import mozilla.components.browser.icons.loader.MemoryInfoProvider import mozilla.components.concept.engine.manifest.Size import mozilla.components.lib.fetch.httpurlconnection.HttpURLConnectionClient import mozilla.components.support.test.any @@ -46,6 +47,11 @@ import java.io.OutputStream @ExperimentalCoroutinesApi // for runTestOnMain @RunWith(AndroidJUnit4::class) class BrowserIconsTest { + private val defaultAvailMem: Long = 100000 + + class FakeMemoryInfoProvider(private val availMem: Long) : MemoryInfoProvider { + override fun getAvailMem(): Long = availMem + } @get:Rule val coroutinesTestRule = MainCoroutineRule() @@ -65,7 +71,12 @@ class BrowserIconsTest { `when`(generator.generate(any(), any())).thenReturn(mockedIcon) val request = IconRequest(url = "https://www.mozilla_test.org") - val icon = BrowserIcons(testContext, httpClient = mock(), generator = generator) + val icon = BrowserIcons( + context = testContext, + httpClient = mock(), + generator = generator, + memoryInfoProvider = FakeMemoryInfoProvider(defaultAvailMem), + ) .loadIcon(request) assertEquals(mockedIcon, icon.await()) @@ -114,6 +125,7 @@ class BrowserIconsTest { val icon = BrowserIcons( testContext, httpClient = HttpURLConnectionClient(), + memoryInfoProvider = FakeMemoryInfoProvider(defaultAvailMem), ).loadIcon(request).await() assertNotNull(icon) @@ -139,7 +151,11 @@ class BrowserIconsTest { server.start() try { - val icons = BrowserIcons(testContext, httpClient = HttpURLConnectionClient()) + val icons = BrowserIcons( + context = testContext, + httpClient = HttpURLConnectionClient(), + memoryInfoProvider = FakeMemoryInfoProvider(defaultAvailMem), + ) val request = IconRequest( url = "https://www.mozilla.org", @@ -182,7 +198,11 @@ class BrowserIconsTest { server.start() try { - val icons = BrowserIcons(testContext, httpClient = HttpURLConnectionClient()) + val icons = BrowserIcons( + context = testContext, + httpClient = HttpURLConnectionClient(), + memoryInfoProvider = FakeMemoryInfoProvider(defaultAvailMem), + ) val request = IconRequest( url = "https://www.mozilla.org", diff --git a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/HttpIconLoaderTest.kt b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/HttpIconLoaderTest.kt index 3670066921..872440900a 100644 --- a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/HttpIconLoaderTest.kt +++ b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/HttpIconLoaderTest.kt @@ -34,6 +34,11 @@ import java.io.InputStream @RunWith(AndroidJUnit4::class) class HttpIconLoaderTest { + private val defaultAvailMem: Long = 100000 + + class FakeMemoryInfoProvider(private val availMem: Long) : MemoryInfoProvider { + override fun getAvailMem(): Long = availMem + } @Test fun `Loader downloads data and uses appropriate headers`() { @@ -56,7 +61,7 @@ class HttpIconLoaderTest { server.start() try { - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) val result = loader.load( mock(), mock(), @@ -94,7 +99,7 @@ class HttpIconLoaderTest { fun `Loader will not perform any requests for data uris`() { val client: Client = mock() - val result = HttpIconLoader(client).load( + val result = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)).load( mock(), mock(), IconRequest.Resource( @@ -112,7 +117,7 @@ class HttpIconLoaderTest { fun `Request has timeouts applied`() { val client: Client = mock() - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) doReturn( Response( url = "https://www.example.org", @@ -144,7 +149,7 @@ class HttpIconLoaderTest { fun `NoResult is returned for non-successful requests`() { val client: Client = mock() - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) doReturn( Response( url = "https://www.example.org", @@ -170,7 +175,7 @@ class HttpIconLoaderTest { fun `Loader will not try to load URL again that just recently failed`() { val client: Client = mock() - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) doReturn( Response( url = "https://www.example.org", @@ -203,7 +208,7 @@ class HttpIconLoaderTest { val client: Client = mock() doThrow(IOException("Mock")).`when`(client).fetch(any()) - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) val resource = IconRequest.Resource( url = "https://www.example.org", @@ -223,7 +228,7 @@ class HttpIconLoaderTest { } } - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) doReturn( Response( url = "https://www.example.org", @@ -242,10 +247,164 @@ class HttpIconLoaderTest { } @Test + fun `Loader will return NoResult for response with large Content-Length size`() { + val clients = listOf( + HttpURLConnectionClient(), + OkHttpClient(), + ) + + clients.forEach { client -> + val server = MockWebServer() + + // Create a mock Response object with the Content-Length header set to a large size + server.enqueue( + MockResponse().setBody( + javaClass.getResourceAsStream("/misc/test.txt")!! + .bufferedReader() + .use { it.readText() }, + ).addHeader("Content-Length", "2048576"), + ) + + server.start() + + try { + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) + val result = loader.load( + mock(), + mock(), + IconRequest.Resource( + url = server.url("/some/path").toString(), + type = IconRequest.Resource.Type.APPLE_TOUCH_ICON, + ), + ) + + assertTrue(result is IconLoader.Result.NoResult) + } finally { + server.shutdown() + } + } + } + + @Test + fun `Loader will return NoResult for valid Content-Length size and low available memory`() { + val clients = listOf( + HttpURLConnectionClient(), + OkHttpClient(), + ) + + clients.forEach { client -> + val server = MockWebServer() + + server.enqueue( + MockResponse().setBody( + javaClass.getResourceAsStream("/misc/test.txt")!! + .bufferedReader() + .use { it.readText() }, + ).addHeader("Content-Length", "10000"), + ) + + server.start() + + try { + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(availMem = 0)) + val result = loader.load( + mock(), + mock(), + IconRequest.Resource( + url = server.url("/some/path").toString(), + type = IconRequest.Resource.Type.APPLE_TOUCH_ICON, + ), + ) + + assertTrue(result is IconLoader.Result.NoResult) + } finally { + server.shutdown() + } + } + } + + @Test + fun `Loader will return NoResult for null Content-Length header and low available memory`() { + val clients = listOf( + HttpURLConnectionClient(), + OkHttpClient(), + ) + + clients.forEach { client -> + val server = MockWebServer() + + server.enqueue( + MockResponse().setBody( + javaClass.getResourceAsStream("/misc/test.txt")!! + .bufferedReader() + .use { it.readText() }, + ).removeHeader("Content-Length"), + ) + + server.start() + + try { + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(availMem = 0)) + val result = loader.load( + mock(), + mock(), + IconRequest.Resource( + url = server.url("/some/path").toString(), + type = IconRequest.Resource.Type.APPLE_TOUCH_ICON, + ), + ) + + assertTrue(result is IconLoader.Result.NoResult) + } finally { + server.shutdown() + } + } + } + + @Test + fun `Loader downloads data for null Content-Length header and response size within limits`() { + val clients = listOf( + HttpURLConnectionClient(), + OkHttpClient(), + ) + + clients.forEach { client -> + val server = MockWebServer() + + server.enqueue( + MockResponse().setBody( + javaClass.getResourceAsStream("/misc/test.txt")!! + .bufferedReader() + .use { it.readText() }, + ).removeHeader("Content-Length"), + ) + + server.start() + + try { + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) + val result = loader.load( + mock(), + mock(), + IconRequest.Resource( + url = server.url("/some/path").toString(), + type = IconRequest.Resource.Type.APPLE_TOUCH_ICON, + ), + ) + assertTrue("Result should match BytesResult", result is IconLoader.Result.BytesResult) + val data = (result as IconLoader.Result.BytesResult).bytes + assertTrue("Data should not be empty", data.isNotEmpty()) + } finally { + server.shutdown() + } + } + } + + @Test fun `Loader will sanitize URL`() { val client: Client = mock() - val loader = HttpIconLoader(client) + val loader = HttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem)) doReturn( Response( url = "https://www.example.org", diff --git a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoaderTest.kt b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoaderTest.kt index 6b2fe8d8ad..2a2da044bf 100644 --- a/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoaderTest.kt +++ b/mobile/android/android-components/components/browser/icons/src/test/java/mozilla/components/browser/icons/loader/NonBlockingHttpIconLoaderTest.kt @@ -45,6 +45,11 @@ class NonBlockingHttpIconLoaderTest { @get:Rule val coroutinesTestRule = MainCoroutineRule() private val scope = coroutinesTestRule.scope + private val defaultAvailMem: Long = 100000 + + class FakeMemoryInfoProvider(private val availMem: Long) : MemoryInfoProvider { + override fun getAvailMem(): Long = availMem + } @Test fun `Loader will return IconLoader#Result#NoResult for a load request and respond with the result through a callback`() = runTestOnMain { @@ -71,7 +76,7 @@ class NonBlockingHttpIconLoaderTest { var callbackIconRequest: IconRequest? = null var callbackResource: IconRequest.Resource? = null var callbackIcon: IconLoader.Result? = null - val loader = NonBlockingHttpIconLoader(client, scope) { request, resource, icon -> + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { request, resource, icon -> callbackIconRequest = request callbackResource = resource callbackIcon = icon @@ -106,7 +111,7 @@ class NonBlockingHttpIconLoaderTest { var callbackIconRequest: IconRequest? = null var callbackResource: IconRequest.Resource? = null var callbackIcon: IconLoader.Result? = null - val loader = NonBlockingHttpIconLoader(client, scope) { request, resource, icon -> + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { request, resource, icon -> callbackIconRequest = request callbackResource = resource callbackIcon = icon @@ -132,7 +137,7 @@ class NonBlockingHttpIconLoaderTest { @Test fun `Request has timeouts applied`() = runTestOnMain { val client: Client = mock() - val loader = NonBlockingHttpIconLoader(client, scope) { _, _, _ -> } + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { _, _, _ -> } doReturn( Response( url = "https://www.example.org", @@ -165,7 +170,7 @@ class NonBlockingHttpIconLoaderTest { var callbackIconRequest: IconRequest? = null var callbackResource: IconRequest.Resource? = null var callbackIcon: IconLoader.Result? = null - val loader = NonBlockingHttpIconLoader(client, scope) { request, resource, icon -> + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { request, resource, icon -> callbackIconRequest = request callbackResource = resource callbackIcon = icon @@ -198,7 +203,7 @@ class NonBlockingHttpIconLoaderTest { @Test fun `Loader will not try to load URL again that just recently failed`() = runTestOnMain { val client: Client = mock() - val loader = NonBlockingHttpIconLoader(client, scope) { _, _, _ -> } + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { _, _, _ -> } doReturn( Response( url = "https://www.example.org", @@ -231,7 +236,7 @@ class NonBlockingHttpIconLoaderTest { var callbackIconRequest: IconRequest? = null var callbackResource: IconRequest.Resource? = null var callbackIcon: IconLoader.Result? = null - val loader = NonBlockingHttpIconLoader(client, scope) { request, resource, icon -> + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { request, resource, icon -> callbackIconRequest = request callbackResource = resource callbackIcon = icon @@ -256,7 +261,7 @@ class NonBlockingHttpIconLoaderTest { var callbackIconRequest: IconRequest? = null var callbackResource: IconRequest.Resource? = null var callbackIcon: IconLoader.Result? = null - val loader = NonBlockingHttpIconLoader(client, scope) { request, resource, icon -> + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { request, resource, icon -> callbackIconRequest = request callbackResource = resource callbackIcon = icon @@ -292,7 +297,7 @@ class NonBlockingHttpIconLoaderTest { fun `Loader will sanitize URL`() = runTestOnMain { val client: Client = mock() val captor = argumentCaptor<Request>() - val loader = NonBlockingHttpIconLoader(client, scope) { _, _, _ -> } + val loader = NonBlockingHttpIconLoader(client, FakeMemoryInfoProvider(defaultAvailMem), scope) { _, _, _ -> } doReturn( Response( url = "https://www.example.org", diff --git a/mobile/android/android-components/components/browser/menu/src/main/java/mozilla/components/browser/menu/item/CustomTooltip.kt b/mobile/android/android-components/components/browser/menu/src/main/java/mozilla/components/browser/menu/item/CustomTooltip.kt index 9e7ce8b674..6f83c1ffd9 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/java/mozilla/components/browser/menu/item/CustomTooltip.kt +++ b/mobile/android/android-components/components/browser/menu/src/main/java/mozilla/components/browser/menu/item/CustomTooltip.kt @@ -14,7 +14,6 @@ import android.view.WindowManager import android.widget.LinearLayout import android.widget.PopupWindow import android.widget.TextView -import androidx.core.view.ViewCompat import androidx.core.widget.PopupWindowCompat import mozilla.components.browser.menu.R @@ -34,7 +33,7 @@ internal class CustomTooltip private constructor( } override fun onLongClick(view: View): Boolean { - if (ViewCompat.isAttachedToWindow(anchor)) { + if (anchor.isAttachedToWindow()) { show() anchor.addOnAttachStateChangeListener(this) } diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-be/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-be/strings.xml index f3b3bb1755..9edc4724a9 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-be/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-be/strings.xml @@ -10,6 +10,12 @@ <string name="mozac_browser_menu_extensions">Пашырэнні</string> <!-- Label for add-ons sub menu item for add-ons manager --> <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Менеджар дадаткаў</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Менеджар пашырэнняў</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Перайсці ўверх</string> - </resources> + <!-- Content description for the action bar "up" button of the add-ons sub menu item --> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Дадаткі, перайсці ўніз</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Пашырэнні, перайсці ўверх</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-br/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-br/strings.xml index 548cbd7785..f8e14c773d 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-br/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-br/strings.xml @@ -14,4 +14,8 @@ <string name="mozac_browser_menu_extensions_manager">Merañ an askouezhioù</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Adpignat</string> - </resources> + <!-- Content description for the action bar "up" button of the add-ons sub menu item --> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Enlugelladoù, pignat</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Askouezhioù, pignat</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-cak/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-cak/strings.xml index 7ccb1be616..7623a1f39f 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-cak/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-cak/strings.xml @@ -5,11 +5,17 @@ <!-- Content description (not visible, for screen readers etc.): Indicates the overflow menu has a highlight --> <string name="mozac_browser_menu_highlighted">Ya\'on ruq\'ij</string> <!-- Label for add-ons submenu section --> - <string name="mozac_browser_menu_addons">Taq tz\'aqat</string> + <string name="mozac_browser_menu_addons" moz:removedIn="126" tools:ignore="UnusedResources">Taq tz\'aqat</string> + <!-- Label for extensions submenu section --> + <string name="mozac_browser_menu_extensions">Taq k\'amal</string> <!-- Label for add-ons sub menu item for add-ons manager --> - <string name="mozac_browser_menu_addons_manager">Kinuk\'samajel taq Tz\'aqat</string> + <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Kinuk\'samajel taq Tz\'aqat</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Runuk\'samajel taq K\'amal</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Tib\'an okem ajsik</string> <!-- Content description for the action bar "up" button of the add-ons sub menu item --> - <string name="mozac_browser_menu_addons_description">Taq tz\'aqat, tijote\' chi rokem</string> - </resources> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Taq tz\'aqat, tijote\' chi rokem</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Taq k\'amal, tok q\'anij</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-eo/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-eo/strings.xml index 63b30a2150..1ca46d5302 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-eo/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-eo/strings.xml @@ -5,11 +5,17 @@ <!-- Content description (not visible, for screen readers etc.): Indicates the overflow menu has a highlight --> <string name="mozac_browser_menu_highlighted">Elstarigitaj</string> <!-- Label for add-ons submenu section --> - <string name="mozac_browser_menu_addons">Aldonaĵoj</string> + <string name="mozac_browser_menu_addons" moz:removedIn="126" tools:ignore="UnusedResources">Aldonaĵoj</string> + <!-- Label for extensions submenu section --> + <string name="mozac_browser_menu_extensions">Etendaĵoj</string> <!-- Label for add-ons sub menu item for add-ons manager --> - <string name="mozac_browser_menu_addons_manager">Administrilo de aldonaĵoj</string> + <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Administrilo de aldonaĵoj</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Administranto de etendaĵoj</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Iri supren</string> <!-- Content description for the action bar "up" button of the add-ons sub menu item --> - <string name="mozac_browser_menu_addons_description">Aldonaĵoj, supren</string> - </resources> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Aldonaĵoj, supren</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Etendaĵoj, supren</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-eu/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-eu/strings.xml index 53f1a556a3..b69e874c01 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-eu/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-eu/strings.xml @@ -5,11 +5,17 @@ <!-- Content description (not visible, for screen readers etc.): Indicates the overflow menu has a highlight --> <string name="mozac_browser_menu_highlighted">Nabarmendua</string> <!-- Label for add-ons submenu section --> - <string name="mozac_browser_menu_addons">Gehigarriak</string> + <string name="mozac_browser_menu_addons" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak</string> + <!-- Label for extensions submenu section --> + <string name="mozac_browser_menu_extensions">Hedapenak</string> <!-- Label for add-ons sub menu item for add-ons manager --> - <string name="mozac_browser_menu_addons_manager">Gehigarrien kudeatzailea</string> + <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarrien kudeatzailea</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Hedapenen kudeatzailea</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Nabigatu gora</string> <!-- Content description for the action bar "up" button of the add-ons sub menu item --> - <string name="mozac_browser_menu_addons_description">Gehigarriak, nabigatu gora</string> - </resources> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak, nabigatu gora</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Hedapenak, nabigatu gora</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-kab/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-kab/strings.xml index f36a1014b1..58d8809a2c 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-kab/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-kab/strings.xml @@ -10,6 +10,12 @@ <string name="mozac_browser_menu_extensions">Isiɣzaf</string> <!-- Label for add-ons sub menu item for add-ons manager --> <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Amsefrak n izegrar</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Amsefrak n yisiɣzaf</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Inig d asawen</string> - </resources> + <!-- Content description for the action bar "up" button of the add-ons sub menu item --> + <string name="mozac_browser_menu_addons_description" moz:removedIn="126" tools:ignore="UnusedResources">Izegrar niḍen, ulin-d</string> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Isiɣzaf niḍen, ulin-d</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu/src/main/res/values-sc/strings.xml b/mobile/android/android-components/components/browser/menu/src/main/res/values-sc/strings.xml index 4fd82314b3..0a94a4fc21 100644 --- a/mobile/android/android-components/components/browser/menu/src/main/res/values-sc/strings.xml +++ b/mobile/android/android-components/components/browser/menu/src/main/res/values-sc/strings.xml @@ -5,9 +5,15 @@ <!-- Content description (not visible, for screen readers etc.): Indicates the overflow menu has a highlight --> <string name="mozac_browser_menu_highlighted">In evidèntzia</string> <!-- Label for add-ons submenu section --> - <string name="mozac_browser_menu_addons">Cumplementos</string> + <string name="mozac_browser_menu_addons" moz:removedIn="126" tools:ignore="UnusedResources">Cumplementos</string> + <!-- Label for extensions submenu section --> + <string name="mozac_browser_menu_extensions">Estensiones</string> <!-- Label for add-ons sub menu item for add-ons manager --> - <string name="mozac_browser_menu_addons_manager">Gestore de cumplementos</string> + <string name="mozac_browser_menu_addons_manager" moz:removedIn="126" tools:ignore="UnusedResources">Gestore de cumplementos</string> + <!-- Label for extensions sub menu item for extensions manager --> + <string name="mozac_browser_menu_extensions_manager">Gestore de estensiones</string> <!-- Content description for the action bar "up" button --> <string name="action_bar_up_description">Nàviga in artu</string> - </resources> + <!-- Content description for the action bar "up" button of the extensions sub menu item --> + <string name="mozac_browser_menu_extensions_content_description">Estensiones, torra a coa</string> +</resources> diff --git a/mobile/android/android-components/components/browser/menu2/src/test/java/mozilla/components/browser/menu2/ext/BrowserMenuPositioningTest.kt b/mobile/android/android-components/components/browser/menu2/src/test/java/mozilla/components/browser/menu2/ext/BrowserMenuPositioningTest.kt index d9be746793..23c421bd7c 100644 --- a/mobile/android/android-components/components/browser/menu2/src/test/java/mozilla/components/browser/menu2/ext/BrowserMenuPositioningTest.kt +++ b/mobile/android/android-components/components/browser/menu2/src/test/java/mozilla/components/browser/menu2/ext/BrowserMenuPositioningTest.kt @@ -7,7 +7,6 @@ package mozilla.components.browser.menu2.ext import android.graphics.Rect import android.view.View import android.widget.PopupWindow -import androidx.core.view.ViewCompat import androidx.recyclerview.widget.RecyclerView import androidx.test.ext.junit.runners.AndroidJUnit4 import mozilla.components.browser.menu2.R @@ -755,9 +754,9 @@ internal fun createAnchor(x: Int, y: Int, isRTL: Boolean = false): View { }.`when`(view).getLocationInWindow(any()) if (isRTL) { - doReturn(ViewCompat.LAYOUT_DIRECTION_RTL).`when`(view).layoutDirection + doReturn(View.LAYOUT_DIRECTION_RTL).`when`(view).layoutDirection } else { - doReturn(ViewCompat.LAYOUT_DIRECTION_LTR).`when`(view).layoutDirection + doReturn(View.LAYOUT_DIRECTION_LTR).`when`(view).layoutDirection } doReturn(10).`when`(view).height doReturn(15).`when`(view).width diff --git a/mobile/android/android-components/components/browser/session-storage/src/androidTest/assets/index.html b/mobile/android/android-components/components/browser/session-storage/src/androidTest/assets/index.html index b511ab2f19..199b5f61d4 100644 --- a/mobile/android/android-components/components/browser/session-storage/src/androidTest/assets/index.html +++ b/mobile/android/android-components/components/browser/session-storage/src/androidTest/assets/index.html @@ -1,8 +1,8 @@ <html> -<head> + <head> <title>Restore Test</title> -</head> -<body> + </head> + <body> <h1>Hello World</h1> -</body> + </body> </html> diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt index cd492b18e5..42ad594c8f 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/action/BrowserAction.kt @@ -1048,6 +1048,30 @@ sealed class TranslationsAction : BrowserAction() { ) : TranslationsAction(), ActionWithTab /** + * Sets the translations offer setting on the global store. + * The translations offer setting controls when to offer a translation on a page. + * + * See [SetPageSettingsAction] for setting the offer setting on the session store. + * + * @property offerTranslation The offer setting to set. + */ + data class SetGlobalOfferTranslateSettingAction( + val offerTranslation: Boolean, + ) : TranslationsAction() + + /** + * Updates the specified translation offer setting on the translation engine and ensures the final + * state on the global store remains in-sync. + * + * See [UpdatePageSettingAction] for updating the offer setting on the session store. + * + * @property offerTranslation The offer setting to set. + */ + data class UpdateGlobalOfferTranslateSettingAction( + val offerTranslation: Boolean, + ) : TranslationsAction() + + /** * Sets the map of BCP 47 language codes (key) and the [LanguageSetting] option (value). * * @property languageSettings A map containing a key of BCP 47 language code and its @@ -1058,26 +1082,36 @@ sealed class TranslationsAction : BrowserAction() { ) : TranslationsAction() /** + * Updates the specified translation language setting on the translation engine and ensures the + * final state on the global store remains in-sync. + * + * See [UpdatePageSettingAction] for updating the language setting on the session store. + * + * @property languageCode The BCP-47 language code to update. + * @property setting The [LanguageSetting] for the language. + */ + data class UpdateLanguageSettingsAction( + val languageCode: String, + val setting: LanguageSetting, + ) : TranslationsAction() + + /** * Sets the list of sites that the user has opted to never translate. * - * @property tabId The ID of the tab the [EngineSession] that requested the list. * @property neverTranslateSites The never translate sites. */ data class SetNeverTranslateSitesAction( - override val tabId: String, val neverTranslateSites: List<String>, - ) : TranslationsAction(), ActionWithTab + ) : TranslationsAction() /** * Remove from the list of sites the user has opted to never translate. * - * @property tabId The ID of the tab the [EngineSession] that requested the removal. * @property origin A site origin URI that will have the specified never translate permission set. */ data class RemoveNeverTranslateSiteAction( - override val tabId: String, val origin: String, - ) : TranslationsAction(), ActionWithTab + ) : TranslationsAction() /** * Sets the list of language machine learning translation models the translation engine has available. @@ -1255,6 +1289,7 @@ sealed class EngineAction : BrowserAction() { override val tabId: String, val skipLoading: Boolean = false, val followupAction: BrowserAction? = null, + val includeParent: Boolean = false, ) : EngineAction(), ActionWithTab /** @@ -1265,6 +1300,7 @@ sealed class EngineAction : BrowserAction() { val url: String, val flags: EngineSession.LoadUrlFlags = EngineSession.LoadUrlFlags.none(), val additionalHeaders: Map<String, String>? = null, + val includeParent: Boolean = false, ) : EngineAction(), ActionWithTab /** @@ -1402,6 +1438,7 @@ sealed class EngineAction : BrowserAction() { val engineSession: EngineSession, val timestamp: Long = Clock.elapsedRealtime(), val skipLoading: Boolean = false, + val includeParent: Boolean = false, ) : EngineAction(), ActionWithTab /** diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt index 6f807eff16..e83fefb9e1 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt @@ -69,6 +69,7 @@ internal class CreateEngineSessionMiddleware( logger, store, action.tabId, + action.includeParent, ) action.followupAction?.let { @@ -85,6 +86,7 @@ private fun getOrCreateEngineSession( logger: Logger, store: Store<BrowserState, BrowserAction>, tabId: String, + includeParent: Boolean, ): EngineSession? { val tab = store.state.findTabOrCustomTab(tabId) if (tab == null) { @@ -102,7 +104,7 @@ private fun getOrCreateEngineSession( return it } - return createEngineSession(engine, logger, store, tab) + return createEngineSession(engine, logger, store, tab, includeParent) } @MainThread @@ -111,6 +113,7 @@ private fun createEngineSession( logger: Logger, store: Store<BrowserState, BrowserAction>, tab: SessionState, + includeParent: Boolean, ): EngineSession { val engineSession = engine.createSession(tab.content.private, tab.contextId) logger.debug("Created engine session for tab ${tab.id}") @@ -127,6 +130,7 @@ private fun createEngineSession( tab.id, engineSession, skipLoading = skipLoading, + includeParent = includeParent, ), ) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt index 1b7744ff41..82298ef2ce 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt @@ -70,11 +70,11 @@ internal class EngineDelegateMiddleware( // session is already pointing to. Creating an EngineSession will do exactly // that in the linking step. So let's do that. Otherwise we would load the URL // twice. - store.dispatch(EngineAction.CreateEngineSessionAction(action.tabId)) + store.dispatch(EngineAction.CreateEngineSessionAction(action.tabId, includeParent = action.includeParent)) return@launch } - val parentEngineSession = if (tab is TabSessionState) { + val parentEngineSession = if (action.includeParent && tab is TabSessionState) { tab.parentId?.let { store.state.findTabOrCustomTab(it)?.engineState?.engineSession } } else { null diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt index c6f1d01d39..ba714b5e90 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt @@ -37,7 +37,13 @@ internal class LinkingMiddleware( when (action) { is TabListAction.AddTabAction -> { if (action.tab.engineState.engineSession != null && action.tab.engineState.engineObserver == null) { - engineObserver = link(context, action.tab.engineState.engineSession, action.tab) + engineObserver = link( + context, + action.tab.engineState.engineSession, + action.tab, + skipLoading = true, + includeParent = false, + ) } } is TabListAction.AddMultipleTabsAction -> { @@ -58,7 +64,7 @@ internal class LinkingMiddleware( when (action) { is EngineAction.LinkEngineSessionAction -> { context.state.findTabOrCustomTab(action.tabId)?.let { tab -> - engineObserver = link(context, action.engineSession, tab, action.skipLoading) + engineObserver = link(context, action.engineSession, tab, action.skipLoading, action.includeParent) } } else -> { @@ -77,6 +83,7 @@ internal class LinkingMiddleware( engineSession: EngineSession, tab: SessionState, skipLoading: Boolean = true, + includeParent: Boolean, ): Pair<String, EngineObserver> { val observer = EngineObserver(tab.id, context.store) engineSession.register(observer) @@ -91,7 +98,7 @@ internal class LinkingMiddleware( // tab, but opened by an extension e.g. via browser.tabs.update. performLoadOnMainThread(engineSession, tab.content.url, loadFlags = tab.engineState.initialLoadFlags) } else { - val parentEngineSession = if (tab is TabSessionState) { + val parentEngineSession = if (includeParent && tab is TabSessionState) { tab.parentId?.let { context.state.findTabOrCustomTab(it)?.engineState?.engineSession } } else { null diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt index 81e3b8b48b..3c8e645a97 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt @@ -79,6 +79,12 @@ class TranslationsMiddleware( requestPageSettings(context, action.tabId) } } + TranslationOperation.FETCH_OFFER_SETTING -> { + scope.launch { + requestOfferSetting(context, action.tabId) + } + } + TranslationOperation.FETCH_AUTOMATIC_LANGUAGE_SETTINGS -> { scope.launch { requestLanguageSettings(context, action.tabId) @@ -86,7 +92,7 @@ class TranslationsMiddleware( } TranslationOperation.FETCH_NEVER_TRANSLATE_SITES -> { scope.launch { - getNeverTranslateSites(context, action.tabId) + requestNeverTranslateSites(context, action.tabId) } } TranslationOperation.TRANSLATE, @@ -108,7 +114,7 @@ class TranslationsMiddleware( is TranslationsAction.RemoveNeverTranslateSiteAction -> { scope.launch { - removeNeverTranslateSite(context, action.tabId, action.origin) + removeNeverTranslateSite(context, action.origin) } } @@ -151,6 +157,25 @@ class TranslationsMiddleware( } } } + + is TranslationsAction.UpdateGlobalOfferTranslateSettingAction -> { + scope.launch { + updateAlwaysOfferPopupPageSetting( + setting = action.offerTranslation, + ) + } + } + + is TranslationsAction.UpdateLanguageSettingsAction -> { + scope.launch { + updateLanguageSetting( + context = context, + languageCode = action.languageCode, + setting = action.setting, + ) + } + } + else -> { // no-op } @@ -168,6 +193,8 @@ class TranslationsMiddleware( * Language Support - [requestSupportedLanguages] * Language Models - [requestLanguageModels] * Language Settings - [requestLanguageSettings] + * Never Translate Sites List - [requestNeverTranslateSites] + * Offer Setting - [requestOfferSetting] * * @param context Context to use to dispatch to the store. */ @@ -177,6 +204,8 @@ class TranslationsMiddleware( requestSupportedLanguages(context) requestLanguageModels(context) requestLanguageSettings(context) + requestNeverTranslateSites(context) + requestOfferSetting(context) } /** @@ -336,22 +365,22 @@ class TranslationsMiddleware( } /** - * Retrieves the list of never translate sites using [scope] and dispatches the result to the - * store via [TranslationsAction.SetNeverTranslateSitesAction] or else dispatches the failure - * [TranslationsAction.TranslateExceptionAction]. + * Retrieves the list of never translate sites and dispatches the result to the + * store via [TranslationsAction.SetNeverTranslateSitesAction] or else + * dispatches the failure via [TranslationsAction.EngineExceptionAction] and + * when a [tabId] is provided, [TranslationsAction.TranslateExceptionAction]. * * @param context Context to use to dispatch to the store. * @param tabId Tab ID associated with the request. */ - private fun getNeverTranslateSites( + private fun requestNeverTranslateSites( context: MiddlewareContext<BrowserState, BrowserAction>, - tabId: String, + tabId: String? = null, ) { engine.getNeverTranslateSiteList( onSuccess = { context.store.dispatch( TranslationsAction.SetNeverTranslateSitesAction( - tabId = tabId, neverTranslateSites = it, ), ) @@ -360,12 +389,19 @@ class TranslationsMiddleware( onError = { context.store.dispatch( - TranslationsAction.TranslateExceptionAction( - tabId = tabId, - operation = TranslationOperation.FETCH_NEVER_TRANSLATE_SITES, - translationError = TranslationError.CouldNotLoadNeverTranslateSites(it), + TranslationsAction.EngineExceptionAction( + error = TranslationError.CouldNotLoadNeverTranslateSites(it), ), ) + if (tabId != null) { + context.store.dispatch( + TranslationsAction.TranslateExceptionAction( + tabId = tabId, + operation = TranslationOperation.FETCH_NEVER_TRANSLATE_SITES, + translationError = TranslationError.CouldNotLoadNeverTranslateSites(it), + ), + ) + } logger.error("Error requesting never translate sites: ", it) }, ) @@ -377,38 +413,23 @@ class TranslationsMiddleware( * [TranslationsAction.TranslateExceptionAction]. * * @param context Context to use to dispatch to the store. - * @param tabId Tab ID associated with the request. * @param origin A site origin URI that will have the specified never translate permission set. */ private fun removeNeverTranslateSite( context: MiddlewareContext<BrowserState, BrowserAction>, - tabId: String, origin: String, ) { engine.setNeverTranslateSpecifiedSite( origin = origin, setting = false, onSuccess = { - logger.info("Success requesting never translate sites.") - - // Fetch page settings to ensure the state matches the engine. - context.store.dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tabId, - operation = TranslationOperation.FETCH_PAGE_SETTINGS, - ), - ) + logger.info("Success changing never translate sites.") }, onError = { logger.error("Error removing site from never translate list: ", it) - - // Fetch never translate sites to ensure the state matches the engine. - context.store.dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tabId, - operation = TranslationOperation.FETCH_NEVER_TRANSLATE_SITES, - ), - ) + // Fetch never translate sites to ensure the state matches the engine, because it + // was proactively removed in the reducer. + requestNeverTranslateSites(context) }, ) } @@ -472,6 +493,38 @@ class TranslationsMiddleware( } /** + * Retrieves the setting to always offer to translate and dispatches the result to the + * store via [TranslationsAction.SetGlobalOfferTranslateSettingAction]. Will additionally + * dispatch a request to update page settings, when a [tabId] is provided. + * + * @param context Context to use to dispatch to the store. + * @param tabId Tab ID associated with the request. + */ + private fun requestOfferSetting( + context: MiddlewareContext<BrowserState, BrowserAction>, + tabId: String? = null, + ) { + logger.info("Requesting offer setting.") + val alwaysOfferPopup: Boolean = engine.getTranslationsOfferPopup() + + context.store.dispatch( + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = alwaysOfferPopup, + ), + ) + + if (tabId != null) { + // Fetch page settings to ensure the state matches the engine. + context.store.dispatch( + TranslationsAction.OperationRequestedAction( + tabId = tabId, + operation = TranslationOperation.FETCH_PAGE_SETTINGS, + ), + ) + } + } + + /** * Fetches the always or never language setting synchronously from the engine. Will * return null if an error occurs. * @@ -708,8 +761,8 @@ class TranslationsMiddleware( /** * Updates the language settings with the [Engine]. * - * If an error occurs, then the method will request the page settings be re-fetched and set on - * the browser store. + * If an error occurs, and a [tabId] is known then the method will request the page settings be + * re-fetched and set on the browser store. * * @param context The context used to request the page settings. * @param tabId Tab ID associated with the request. @@ -718,7 +771,7 @@ class TranslationsMiddleware( */ private fun updateLanguageSetting( context: MiddlewareContext<BrowserState, BrowserAction>, - tabId: String, + tabId: String? = null, languageCode: String, setting: LanguageSetting, ) { @@ -729,26 +782,37 @@ class TranslationsMiddleware( languageSetting = setting, onSuccess = { - // Ensure the session's page settings remain in sync with this update. - context.store.dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tabId, - operation = TranslationOperation.FETCH_AUTOMATIC_LANGUAGE_SETTINGS, - ), - ) + // Value was proactively updated in [TranslationsStateReducer] for + // [TranslationsBrowserState.languageSettings] + + if (tabId != null) { + // Ensure the session's page settings remain in sync with this update. + context.store.dispatch( + TranslationsAction.OperationRequestedAction( + tabId = tabId, + operation = TranslationOperation.FETCH_AUTOMATIC_LANGUAGE_SETTINGS, + ), + ) + } + logger.info("Successfully updated the language preference.") }, onError = { logger.error("Could not update the language preference.", it) + // The browser store [TranslationsBrowserState.languageSettings] is out of sync, + // re-request to sync the state. + requestLanguageSettings(context, tabId) - // Fetch page settings to ensure the state matches the engine. - context.store.dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tabId, - operation = TranslationOperation.FETCH_PAGE_SETTINGS, - ), - ) + if (tabId != null) { + // Fetch page settings to ensure the state matches the engine. + context.store.dispatch( + TranslationsAction.OperationRequestedAction( + tabId = tabId, + operation = TranslationOperation.FETCH_PAGE_SETTINGS, + ), + ) + } }, ) } diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/ext/TabSessionState.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/ext/TabSessionState.kt new file mode 100644 index 0000000000..b0f1c2e9e9 --- /dev/null +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/ext/TabSessionState.kt @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.state.ext + +import mozilla.components.browser.state.state.TabSessionState + +/** + * Returns the URL of the [TabSessionState]. + */ +fun TabSessionState.getUrl(): String? { + return if (this.readerState.active) { + this.readerState.activeUrl + } else { + this.content.url + } +} diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/TranslationsStateReducer.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/TranslationsStateReducer.kt index 266964455e..89c7ee3ed4 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/TranslationsStateReducer.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/reducer/TranslationsStateReducer.kt @@ -62,11 +62,8 @@ internal object TranslationsStateReducer { } // Checking for if the translations engine is in the fully translated state or not based - // on the values of the translation pair. - if (action.translationEngineState.requestedTranslationPair == null || - action.translationEngineState.requestedTranslationPair?.fromLanguage == null || - action.translationEngineState.requestedTranslationPair?.toLanguage == null - ) { + // on if a visual change has occurred on the browser. + if (action.translationEngineState.hasVisibleChange != true) { // In an untranslated state var translationsError: TranslationError? = null if (action.translationEngineState.detectedLanguages?.supportedDocumentLang == false) { @@ -111,9 +108,9 @@ internal object TranslationsStateReducer { is TranslationsAction.TranslateSuccessAction -> { when (action.operation) { TranslationOperation.TRANSLATE -> { + // The isTranslated state will be identified on a translation state change. state.copyWithTranslationsState(action.tabId) { it.copy( - isTranslated = true, isTranslateProcessing = false, translationError = null, ) @@ -163,6 +160,17 @@ internal object TranslationsStateReducer { } } + TranslationOperation.FETCH_OFFER_SETTING -> { + // Reset the error state, and then generally expect + // [TranslationsAction.SetGlobalOfferTranslateSettingAction] to update state in the + // success case. + state.copyWithTranslationsState(action.tabId) { + it.copy( + settingsError = null, + ) + } + } + TranslationOperation.FETCH_AUTOMATIC_LANGUAGE_SETTINGS -> { state.copy( translationEngine = state.translationEngine.copy( @@ -175,11 +183,11 @@ internal object TranslationsStateReducer { // Reset the error state, and then generally expect // [TranslationsAction.SetNeverTranslateSitesAction] to update // state in the success case. - state.copyWithTranslationsState(action.tabId) { - it.copy( + state.copy( + translationEngine = state.translationEngine.copy( neverTranslateSites = null, - ) - } + ), + ) } } } @@ -229,6 +237,14 @@ internal object TranslationsStateReducer { } } + TranslationOperation.FETCH_OFFER_SETTING -> { + state.copyWithTranslationsState(action.tabId) { + it.copy( + translationError = action.translationError, + ) + } + } + TranslationOperation.FETCH_AUTOMATIC_LANGUAGE_SETTINGS -> { state.copyWithTranslationsState(action.tabId) { it.copy( @@ -240,7 +256,6 @@ internal object TranslationsStateReducer { TranslationOperation.FETCH_NEVER_TRANSLATE_SITES -> { state.copyWithTranslationsState(action.tabId) { it.copy( - neverTranslateSites = null, settingsError = action.translationError, ) } @@ -277,20 +292,20 @@ internal object TranslationsStateReducer { } is TranslationsAction.SetNeverTranslateSitesAction -> - state.copyWithTranslationsState(action.tabId) { - it.copy( + state.copy( + translationEngine = state.translationEngine.copy( neverTranslateSites = action.neverTranslateSites, - ) - } + ), + ) is TranslationsAction.RemoveNeverTranslateSiteAction -> { - val neverTranslateSites = state.findTab(action.tabId)?.translationsState?.neverTranslateSites + val neverTranslateSites = state.translationEngine.neverTranslateSites val updatedNeverTranslateSites = neverTranslateSites?.filter { it != action.origin }?.toList() - state.copyWithTranslationsState(action.tabId) { - it.copy( + state.copy( + translationEngine = state.translationEngine.copy( neverTranslateSites = updatedNeverTranslateSites, - ) - } + ), + ) } is TranslationsAction.OperationRequestedAction -> @@ -326,12 +341,20 @@ internal object TranslationsStateReducer { } } + TranslationOperation.FETCH_OFFER_SETTING -> { + state.copy( + translationEngine = state.translationEngine.copy( + offerTranslation = null, + ), + ) + } + TranslationOperation.FETCH_NEVER_TRANSLATE_SITES -> { - state.copyWithTranslationsState(action.tabId) { - it.copy( + state.copy( + translationEngine = state.translationEngine.copy( neverTranslateSites = null, - ) - } + ), + ) } TranslationOperation.TRANSLATE, TranslationOperation.RESTORE -> { // No state change for these operations @@ -400,6 +423,35 @@ internal object TranslationsStateReducer { } } + is TranslationsAction.UpdateLanguageSettingsAction -> { + val languageSettings = state.translationEngine.languageSettings?.toMutableMap() + // Only set when keys are present. + if (languageSettings?.get(action.languageCode) != null) { + languageSettings[action.languageCode] = action.setting + } + state.copy( + translationEngine = state.translationEngine.copy( + languageSettings = languageSettings, + ), + ) + } + + is TranslationsAction.SetGlobalOfferTranslateSettingAction -> { + state.copy( + translationEngine = state.translationEngine.copy( + offerTranslation = action.offerTranslation, + ), + ) + } + + is TranslationsAction.UpdateGlobalOfferTranslateSettingAction -> { + state.copy( + translationEngine = state.translationEngine.copy( + offerTranslation = action.offerTranslation, + ), + ) + } + is TranslationsAction.SetEngineSupportedAction -> { state.copy( translationEngine = state.translationEngine.copy( diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsBrowserState.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsBrowserState.kt index 2fb937f9f3..c34e1bc062 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsBrowserState.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsBrowserState.kt @@ -13,17 +13,21 @@ import mozilla.components.concept.engine.translate.TranslationSupport * Value type that represents the state of the translations engine within a [BrowserState]. * * @property isEngineSupported Whether the translations engine supports the device architecture. + * @property offerTranslation Whether to offer translations or not to the user. * @property supportedLanguages Set of languages the translation engine supports. * @property languageModels Set of language machine learning translation models the translation engine has available. * @property languageSettings A map containing a key of BCP 47 language code and its * [LanguageSetting] to represent the automatic language settings. + * @property neverTranslateSites List of sites the user has opted to never translate. * @property engineError Holds the error state of the translations engine. * See [TranslationsState.translationError] for session level errors. */ data class TranslationsBrowserState( val isEngineSupported: Boolean? = null, + val offerTranslation: Boolean? = null, val supportedLanguages: TranslationSupport? = null, val languageModels: List<LanguageModel>? = null, val languageSettings: Map<String, LanguageSetting>? = null, + val neverTranslateSites: List<String>? = null, val engineError: TranslationError? = null, ) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsState.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsState.kt index 8c05340928..d70d6e1492 100644 --- a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsState.kt +++ b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/state/TranslationsState.kt @@ -23,7 +23,6 @@ import mozilla.components.concept.engine.translate.TranslationPageSettings * translation engine requires the pair's ML models to be present on the device to complete a * translation. * @property pageSettings The translation engine settings that relate to the current page. - * @property neverTranslateSites List of sites the user has opted to never translate. * @property translationError Type of error that occurred when acquiring resources, translating, or * restoring a translation. * @property settingsError Type of error that occurred when acquiring resources or setting preferences. @@ -37,7 +36,6 @@ data class TranslationsState( val isRestoreProcessing: Boolean = false, val translationDownloadSize: TranslationDownloadSize? = null, val pageSettings: TranslationPageSettings? = null, - val neverTranslateSites: List<String>? = null, val translationError: TranslationError? = null, val settingsError: TranslationError? = null, ) diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/action/TranslationsActionTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/action/TranslationsActionTest.kt index 2a12cda264..ecbbae9c61 100644 --- a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/action/TranslationsActionTest.kt +++ b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/action/TranslationsActionTest.kt @@ -95,6 +95,7 @@ class TranslationsActionTest { error = null, isEngineReady = true, requestedTranslationPair = TranslationPair(fromLanguage = "es", toLanguage = "en"), + hasVisibleChange = true, ) store.dispatch(TranslationsAction.TranslateStateChangeAction(tabId = tab.id, translationEngineState = translatedEngineState)) @@ -110,6 +111,7 @@ class TranslationsActionTest { error = null, isEngineReady = true, requestedTranslationPair = TranslationPair(fromLanguage = null, toLanguage = null), + hasVisibleChange = false, ) store.dispatch(TranslationsAction.TranslateStateChangeAction(tabId = tab.id, nonTranslatedEngineState)) @@ -264,7 +266,6 @@ class TranslationsActionTest { store.dispatch(TranslationsAction.TranslateSuccessAction(tabId = tab.id, operation = TranslationOperation.TRANSLATE)) .joinBlocking() assertEquals(false, tabState().translationsState.isTranslateProcessing) - assertEquals(true, tabState().translationsState.isTranslated) assertEquals(null, tabState().translationsState.translationError) } @@ -347,44 +348,41 @@ class TranslationsActionTest { @Test fun `WHEN a SetNeverTranslateSitesAction is dispatched AND successful THEN update neverTranslateSites`() { // Initial - assertEquals(null, tabState().translationsState.neverTranslateSites) + assertNull(store.state.translationEngine.neverTranslateSites) // Action started val neverTranslateSites = listOf("google.com") store.dispatch( TranslationsAction.SetNeverTranslateSitesAction( - tabId = tab.id, neverTranslateSites = neverTranslateSites, ), ).joinBlocking() // Action success - assertEquals(neverTranslateSites, tabState().translationsState.neverTranslateSites) + assertEquals(neverTranslateSites, store.state.translationEngine.neverTranslateSites) } @Test fun `WHEN a RemoveNeverTranslateSiteAction is dispatched AND successful THEN update neverTranslateSites`() { // Initial add to neverTranslateSites - assertEquals(null, tabState().translationsState.neverTranslateSites) + assertNull(store.state.translationEngine.neverTranslateSites) val neverTranslateSites = listOf("google.com") store.dispatch( TranslationsAction.SetNeverTranslateSitesAction( - tabId = tab.id, neverTranslateSites = neverTranslateSites, ), ).joinBlocking() - assertEquals(neverTranslateSites, tabState().translationsState.neverTranslateSites) + assertEquals(neverTranslateSites, store.state.translationEngine.neverTranslateSites) // Action started store.dispatch( TranslationsAction.RemoveNeverTranslateSiteAction( - tabId = tab.id, origin = "google.com", ), ).joinBlocking() // Action success - assertEquals(listOf<String>(), tabState().translationsState.neverTranslateSites) + assertEquals(listOf<String>(), store.state.translationEngine.neverTranslateSites) } @Test @@ -451,7 +449,6 @@ class TranslationsActionTest { ), ).joinBlocking() assertEquals(null, tabState().translationsState.translationError) - assertEquals(true, tabState().translationsState.isTranslated) assertEquals(false, tabState().translationsState.isTranslateProcessing) // RESTORE usage @@ -900,4 +897,88 @@ class TranslationsActionTest { // Final state assertEquals(languageModels, store.state.translationEngine.languageModels) } + + @Test + fun `WHEN SetOfferTranslateSettingAction is called then set offerToTranslate`() { + // Initial State + assertNull(store.state.translationEngine.offerTranslation) + + // Action started + store.dispatch( + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = false, + ), + ).joinBlocking() + + // Action success + assertFalse(store.state.translationEngine.offerTranslation!!) + } + + @Test + fun `WHEN UpdateOfferTranslateSettingAction is called then set offerToTranslate`() { + // Initial State + assertNull(store.state.translationEngine.offerTranslation) + + // Action started + store.dispatch( + TranslationsAction.UpdateGlobalOfferTranslateSettingAction( + offerTranslation = false, + ), + ).joinBlocking() + + // Action success + assertFalse(store.state.translationEngine.offerTranslation!!) + } + + @Test + fun `WHEN UpdateGlobalLanguageSettingAction is called then update languageSettings`() { + // Initial State + assertNull(store.state.translationEngine.languageSettings) + + // No-op null test + store.dispatch( + TranslationsAction.UpdateLanguageSettingsAction( + languageCode = "fr", + setting = LanguageSetting.ALWAYS, + ), + ).joinBlocking() + + assertNull(store.state.translationEngine.languageSettings) + + // Setting Initial State + val languageSettings = mapOf<String, LanguageSetting>( + "en" to LanguageSetting.OFFER, + "es" to LanguageSetting.NEVER, + "de" to LanguageSetting.ALWAYS, + ) + + store.dispatch( + TranslationsAction.SetLanguageSettingsAction( + languageSettings = languageSettings, + ), + ).joinBlocking() + + assertEquals(languageSettings, store.state.translationEngine.languageSettings) + + // No-op update test + store.dispatch( + TranslationsAction.UpdateLanguageSettingsAction( + languageCode = "fr", + setting = LanguageSetting.ALWAYS, + ), + ).joinBlocking() + + assertEquals(languageSettings, store.state.translationEngine.languageSettings) + + // Main action started + store.dispatch( + TranslationsAction.UpdateLanguageSettingsAction( + languageCode = "es", + setting = LanguageSetting.ALWAYS, + ), + ).joinBlocking() + + // Action success + assertEquals(LanguageSetting.ALWAYS, store.state.translationEngine.languageSettings!!["es"]) + } } diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddlewareTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddlewareTest.kt index 5eaeb328ee..13365b57a7 100644 --- a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddlewareTest.kt +++ b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddlewareTest.kt @@ -263,6 +263,7 @@ class EngineDelegateMiddlewareTest { EngineAction.LoadUrlAction( "test-tab", "https://www.firefox.com", + includeParent = true, ), ).joinBlocking() diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/LinkingMiddlewareTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/LinkingMiddlewareTest.kt index 89939b71a2..c24f838c02 100644 --- a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/LinkingMiddlewareTest.kt +++ b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/LinkingMiddlewareTest.kt @@ -96,7 +96,9 @@ class LinkingMiddlewareTest { store.dispatch(EngineAction.LinkEngineSessionAction(parent.id, parentEngineSession)).joinBlocking() val childEngineSession: EngineSession = mock() - store.dispatch(EngineAction.LinkEngineSessionAction(child.id, childEngineSession)).joinBlocking() + store.dispatch( + EngineAction.LinkEngineSessionAction(child.id, childEngineSession, includeParent = true), + ).joinBlocking() dispatcher.scheduler.advanceUntilIdle() diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt index cf30f7060e..dadc88de52 100644 --- a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt +++ b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt @@ -327,6 +327,35 @@ class TranslationsMiddlewareTest { } @Test + fun `WHEN InitTranslationsBrowserState is dispatched AND the engine is supported THEN SetNeverTranslateSitesAction is also dispatched`() = runTest { + // Send Action + translationsMiddleware.invoke(context = context, next = {}, action = TranslationsAction.InitTranslationsBrowserState) + + // Set the engine to support + val engineSupportedCallback = argumentCaptor<((Boolean) -> Unit)>() + // At least once, since InitAction also will trigger this + verify(engine, atLeastOnce()).isTranslationsEngineSupported( + onSuccess = engineSupportedCallback.capture(), + onError = any(), + ) + engineSupportedCallback.value.invoke(true) + + val neverTranslateSitesCallBack = argumentCaptor<((List<String>) -> Unit)>() + verify(engine, atLeastOnce()).getNeverTranslateSiteList(onSuccess = neverTranslateSitesCallBack.capture(), onError = any()) + val mockNeverTranslate = listOf("www.mozilla.org") + neverTranslateSitesCallBack.value.invoke(mockNeverTranslate) + + waitForIdle() + + // Verifying at least once + verify(store, atLeastOnce()).dispatch( + TranslationsAction.SetNeverTranslateSitesAction( + neverTranslateSites = mockNeverTranslate, + ), + ) + } + + @Test fun `WHEN InitTranslationsBrowserState is dispatched AND has an issue with the engine THEN EngineExceptionAction is dispatched`() = runTest() { // Send Action // Note: Implicitly called once due to connection with InitAction @@ -726,7 +755,6 @@ class TranslationsMiddlewareTest { verify(context.store).dispatch( TranslationsAction.SetNeverTranslateSitesAction( - tabId = tab.id, neverTranslateSites = neverTranslateSites, ), ) @@ -825,7 +853,7 @@ class TranslationsMiddlewareTest { } @Test - fun `WHEN RemoveNeverTranslateSiteAction is dispatched AND removing is unsuccessful THEN FETCH_NEVER_TRANSLATE_SITES is dispatched`() = runTest { + fun `WHEN RemoveNeverTranslateSiteAction is dispatched AND removing is unsuccessful THEN SetNeverTranslateSitesAction is dispatched`() = runTest { val errorCallback = argumentCaptor<((Throwable) -> Unit)>() whenever( engine.setNeverTranslateSpecifiedSite( @@ -838,45 +866,20 @@ class TranslationsMiddlewareTest { val action = TranslationsAction.RemoveNeverTranslateSiteAction( - tabId = tab.id, origin = "google.com", ) translationsMiddleware.invoke(context, {}, action) waitForIdle() - // Verify Dispatch - verify(store).dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tab.id, - operation = TranslationOperation.FETCH_NEVER_TRANSLATE_SITES, - ), - ) - waitForIdle() - } - - @Test - fun `WHEN RemoveNeverTranslateSiteAction is dispatched AND removing is successful THEN FETCH_PAGE_SETTINGS is dispatched`() = runTest { - val sitesCallback = argumentCaptor<(() -> Unit)>() - val action = - TranslationsAction.RemoveNeverTranslateSiteAction( - tabId = tab.id, - origin = "google.com", - ) - translationsMiddleware.invoke(context, {}, action) - verify(engine).setNeverTranslateSpecifiedSite( - origin = any(), - setting = anyBoolean(), - onSuccess = sitesCallback.capture(), - onError = any(), - ) - sitesCallback.value.invoke() - waitForIdle() + val neverTranslateSitesCallBack = argumentCaptor<((List<String>) -> Unit)>() + verify(engine, atLeastOnce()).getNeverTranslateSiteList(onSuccess = neverTranslateSitesCallBack.capture(), onError = any()) + val mockNeverTranslate = listOf("www.mozilla.org") + neverTranslateSitesCallBack.value.invoke(mockNeverTranslate) // Verify Dispatch verify(store).dispatch( - TranslationsAction.OperationRequestedAction( - tabId = tab.id, - operation = TranslationOperation.FETCH_PAGE_SETTINGS, + TranslationsAction.SetNeverTranslateSitesAction( + neverTranslateSites = mockNeverTranslate, ), ) waitForIdle() @@ -942,4 +945,116 @@ class TranslationsMiddlewareTest { waitForIdle() } + + @Test + fun `WHEN InitTranslationsBrowserState is dispatched AND the engine is supported THEN SetOfferTranslateSettingAction is also dispatched`() = runTest { + // Send Action + translationsMiddleware.invoke(context = context, next = {}, action = TranslationsAction.InitTranslationsBrowserState) + + // Set the engine to support + val engineSupportedCallback = argumentCaptor<((Boolean) -> Unit)>() + // At least once, since InitAction also will trigger this + verify(engine, atLeastOnce()).isTranslationsEngineSupported( + onSuccess = engineSupportedCallback.capture(), + onError = any(), + ) + engineSupportedCallback.value.invoke(true) + + // Verify results for offer + verify(engine, atLeastOnce()).getTranslationsOfferPopup() + waitForIdle() + + // Verifying at least once + verify(store, atLeastOnce()).dispatch( + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = false, + ), + ) + + waitForIdle() + } + + @Test + fun `WHEN FETCH_OFFER_SETTING is dispatched with a tab id THEN SetOfferTranslateSettingAction and SetPageSettingsAction are also dispatched`() = runTest { + // Set the mock offer value + whenever( + engine.getTranslationsOfferPopup(), + ).thenAnswer { true } + + // Send Action + val action = + TranslationsAction.OperationRequestedAction( + tabId = tab.id, + operation = TranslationOperation.FETCH_OFFER_SETTING, + ) + translationsMiddleware.invoke(context, {}, action) + waitForIdle() + + // Verify Dispatch + verify(store, atLeastOnce()).dispatch( + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = true, + ), + ) + + // Since we had a tabId, this call will also happen + verify(store, atLeastOnce()).dispatch( + TranslationsAction.SetPageSettingsAction( + tabId = tab.id, + pageSettings = any(), + ), + ) + + waitForIdle() + } + + @Test + fun `WHEN UpdateOfferTranslateSettingAction is called then setTranslationsOfferPopup is called on the engine`() = runTest { + // Send Action + val action = + TranslationsAction.UpdateGlobalOfferTranslateSettingAction( + offerTranslation = true, + ) + translationsMiddleware.invoke(context, {}, action) + waitForIdle() + + // Verify offer was set + verify(engine, atLeastOnce()).setTranslationsOfferPopup(offer = true) + waitForIdle() + } + + @Test + fun `WHEN UpdateLanguageSettingsAction is dispatched and fails THEN SetLanguageSettingsAction is dispatched`() = runTest { + // Send Action + val action = + TranslationsAction.UpdateLanguageSettingsAction( + languageCode = "es", + setting = LanguageSetting.ALWAYS, + ) + translationsMiddleware.invoke(context, {}, action) + + waitForIdle() + + // Mock engine error + val updateLanguagesErrorCallback = argumentCaptor<((Throwable) -> Unit)>() + verify(engine).setLanguageSetting( + languageCode = any(), + languageSetting = any(), + onSuccess = any(), + onError = updateLanguagesErrorCallback.capture(), + ) + updateLanguagesErrorCallback.value.invoke(Throwable()) + + waitForIdle() + + // Verify Dispatch + val languageSettingsCallback = argumentCaptor<((Map<String, LanguageSetting>) -> Unit)>() + verify(engine, atLeastOnce()).getLanguageSettings( + onSuccess = languageSettingsCallback.capture(), + onError = any(), + ) + val mockLanguageSetting = mapOf("en" to LanguageSetting.OFFER) + languageSettingsCallback.value.invoke(mockLanguageSetting) + waitForIdle() + } } diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/ext/TabSessionStateTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/ext/TabSessionStateTest.kt new file mode 100644 index 0000000000..1202afb1c6 --- /dev/null +++ b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/ext/TabSessionStateTest.kt @@ -0,0 +1,34 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.state.ext + +import mozilla.components.browser.state.state.ReaderState +import mozilla.components.browser.state.state.createTab +import org.junit.Assert.assertEquals +import org.junit.Test + +class TabSessionStateTest { + + @Test + fun `GIVEN reader mode is active WHEN get url extension property is fetched THEN return the active url`() { + val readerUrl = "moz-extension://1234" + val activeUrl = "https://mozilla.org" + val readerTab = createTab( + url = readerUrl, + readerState = ReaderState(active = true, activeUrl = activeUrl), + title = "Mozilla", + ) + + assertEquals(activeUrl, readerTab.getUrl()) + } + + @Test + fun `WHEN get url extension property is fetched THEN return the content url`() { + val url = "https://mozilla.org" + val tab = createTab(url = url) + + assertEquals(url, tab.getUrl()) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar/src/main/res/values-nb-rNO/strings.xml b/mobile/android/android-components/components/browser/toolbar/src/main/res/values-nb-rNO/strings.xml index f9cb99c55d..9d9bcbfc13 100644 --- a/mobile/android/android-components/components/browser/toolbar/src/main/res/values-nb-rNO/strings.xml +++ b/mobile/android/android-components/components/browser/toolbar/src/main/res/values-nb-rNO/strings.xml @@ -2,6 +2,7 @@ <resources> <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> <string name="mozac_browser_toolbar_menu_button">Meny</string> + <!-- Content description: For the clear URL text button. --> <string name="mozac_clear_button_description">Tøm</string> <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Sporingsbeskyttelse er på</string> @@ -14,5 +15,5 @@ <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> <string name="mozac_browser_toolbar_progress_loading">Laster</string> <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> - <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Noe av innholdet er blokkert av autoavspillings-innstillingene </string> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Noe av innholdet er blokkert av autoavspillings-innstillingene</string> </resources> diff --git a/mobile/android/android-components/components/browser/toolbar/src/main/res/values-sc/strings.xml b/mobile/android/android-components/components/browser/toolbar/src/main/res/values-sc/strings.xml index 5194a4765e..f0b375f172 100644 --- a/mobile/android/android-components/components/browser/toolbar/src/main/res/values-sc/strings.xml +++ b/mobile/android/android-components/components/browser/toolbar/src/main/res/values-sc/strings.xml @@ -2,6 +2,7 @@ <resources> <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> <string name="mozac_browser_toolbar_menu_button">Menù</string> + <!-- Content description: For the clear URL text button. --> <string name="mozac_clear_button_description">Isbòida</string> <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">S’amparu contra sa sighidura est ativu</string> @@ -13,4 +14,6 @@ <string name="mozac_browser_toolbar_content_description_site_info">Informatziones de su situ</string> <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> <string name="mozac_browser_toolbar_progress_loading">Carrighende</string> - </resources> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Sa funtzionalidade de riprodutzione automàtica at blocadu cuntenutos</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar/src/main/res/values/strings.xml b/mobile/android/android-components/components/browser/toolbar/src/main/res/values/strings.xml index 3c2d7dcf1b..c845e189e7 100644 --- a/mobile/android/android-components/components/browser/toolbar/src/main/res/values/strings.xml +++ b/mobile/android/android-components/components/browser/toolbar/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ <resources> <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> <string name="mozac_clear_button_description">Clear</string> <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tracking Protection is on</string> diff --git a/mobile/android/android-components/components/browser/toolbar2/README.md b/mobile/android/android-components/components/browser/toolbar2/README.md new file mode 100644 index 0000000000..a0cfe1d6ce --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/README.md @@ -0,0 +1,37 @@ +# [Android Components](../../../README.md) > Browser > Toolbar2 + +A customizable toolbar for browsers. + +## Usage + +### Setting up the dependency + +Use Gradle to download the library from [maven.mozilla.org](https://maven.mozilla.org/) ([Setup repository](../../../README.md#maven-repository)): + +```Groovy +implementation "org.mozilla.components:browser-toolbar2:{latest-version}" +``` + +## Facts + +This component emits the following [Facts](../../support/base/README.md#Facts): + +| Action | Item | Extras | Description | +|--------|---------|----------------|------------------------------------| +| CLICK | menu | `menuExtras` | The user opened the overflow menu. | +| COMMIT | toolbar | `commitExtras` | The user has edited the URL. | + +`menuExtras` are additional extras set on the `BrowserMenuBuilder` passed to the `BrowserToolbar` (see [browser-menu](../menu/README.md)). + +#### `commitExtras` + +| Key | Type | Value | +|--------------|---------|-----------------------------------| +| autocomplete | Boolean | Whether the URL was autocompleted | +| source | String? | Which autocomplete list was used | + +## License + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/ diff --git a/mobile/android/android-components/components/browser/toolbar2/build.gradle b/mobile/android/android-components/components/browser/toolbar2/build.gradle new file mode 100644 index 0000000000..60d3930430 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/build.gradle @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + defaultConfig { + minSdkVersion config.minSdkVersion + compileSdk config.compileSdkVersion + targetSdkVersion config.targetSdkVersion + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + namespace 'mozilla.components.browser.toolbar2' +} + +dependencies { + api project(':concept-toolbar') + api project(':ui-autocomplete') + api project(':support-base') + + implementation project(':concept-engine') + implementation project(':concept-menu') + implementation project(':browser-menu') + implementation project(':browser-menu2') + implementation project(':ui-icons') + implementation project(':ui-colors') + implementation project(':ui-widgets') + implementation project(':support-ktx') + + implementation ComponentsDependencies.androidx_appcompat + implementation ComponentsDependencies.androidx_constraintlayout + implementation ComponentsDependencies.androidx_core_ktx + implementation ComponentsDependencies.google_material + + implementation ComponentsDependencies.kotlin_coroutines + + testImplementation project(':support-test') + + testImplementation ComponentsDependencies.androidx_test_core + testImplementation ComponentsDependencies.androidx_test_junit + testImplementation ComponentsDependencies.testing_robolectric + testImplementation ComponentsDependencies.testing_coroutines +} + +apply from: '../../../android-lint.gradle' +apply from: '../../../publish.gradle' +ext.configurePublish(config.componentsGroupId, archivesBaseName, project.ext.description) diff --git a/mobile/android/android-components/components/browser/toolbar2/proguard-rules.pro b/mobile/android/android-components/components/browser/toolbar2/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/AndroidManifest.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..e16cda1d34 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<manifest /> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/BrowserToolbar.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/BrowserToolbar.kt new file mode 100644 index 0000000000..e740455385 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/BrowserToolbar.kt @@ -0,0 +1,691 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2 + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.View.NO_ID +import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.ImageView +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting.Companion.PRIVATE +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.content.ContextCompat +import androidx.core.view.forEach +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch +import mozilla.components.browser.toolbar2.display.DisplayToolbar +import mozilla.components.browser.toolbar2.edit.EditToolbar +import mozilla.components.concept.toolbar.AutocompleteDelegate +import mozilla.components.concept.toolbar.AutocompleteResult +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.concept.toolbar.Toolbar.Highlight +import mozilla.components.support.base.android.Padding +import mozilla.components.support.base.log.logger.Logger +import mozilla.components.support.ktx.kotlin.trimmed +import mozilla.components.ui.autocomplete.AutocompleteView +import mozilla.components.ui.autocomplete.InlineAutocompleteEditText +import mozilla.components.ui.autocomplete.OnFilterListener +import mozilla.components.ui.widgets.behavior.EngineViewScrollingBehavior +import kotlin.coroutines.CoroutineContext + +internal fun ImageView.setTintResource(@ColorRes tintColorResource: Int) { + if (tintColorResource != NO_ID) { + imageTintList = ContextCompat.getColorStateList(context, tintColorResource) + } +} + +/** + * A customizable toolbar for browsers. + * + * The toolbar can switch between two modes: display and edit. The display mode displays the current + * URL and controls for navigation. In edit mode the current URL can be edited. Those two modes are + * implemented by the DisplayToolbar and EditToolbar classes. + * + * ``` + * +----------------+ + * | BrowserToolbar | + * +--------+-------+ + * + + * +-------+-------+ + * | | + * +---------v------+ +-------v--------+ + * | DisplayToolbar | | EditToolbar | + * +----------------+ +----------------+ + * ``` + */ +@Suppress("TooManyFunctions") +class BrowserToolbar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : ViewGroup(context, attrs, defStyleAttr), Toolbar { + private var state: State = State.DISPLAY + + @VisibleForTesting + internal var searchTerms: String = "" + private var urlCommitListener: ((String) -> Boolean)? = null + var isNavBarEnabled: Boolean = false + + /** + * Toolbar in "display mode". + */ + var display = DisplayToolbar( + context, + this, + LayoutInflater.from(context).inflate( + R.layout.mozac_browser_toolbar_displaytoolbar, + this, + false, + ), + ) + @VisibleForTesting(otherwise = PRIVATE) + internal set + + /** + * Toolbar in "edit mode". + */ + var edit = EditToolbar( + context, + this, + LayoutInflater.from(context).inflate( + R.layout.mozac_browser_toolbar_edittoolbar, + this, + false, + ), + ) + @VisibleForTesting(otherwise = PRIVATE) + internal set + + override var title: String + get() = display.title + set(value) { display.title = value } + + override var url: CharSequence + get() = display.url.toString() + set(value) { + // We update the display toolbar immediately. We do not do that for the edit toolbar to not + // mess with what the user is entering. Instead we will remember the value and update the + // edit toolbar whenever we switch to it. + display.url = (value as String).trimmed() + } + + override var siteSecure: Toolbar.SiteSecurity + get() = display.siteSecurity + set(value) { display.siteSecurity = value } + + override var highlight: Highlight = Highlight.NONE + set(value) { + if (field != value) { + display.setHighlight(value) + field = value + } + } + + override var siteTrackingProtection: Toolbar.SiteTrackingProtection = + Toolbar.SiteTrackingProtection.OFF_GLOBALLY + set(value) { + if (field != value) { + display.setTrackingProtectionState(value) + field = value + } + } + + override var private: Boolean + get() = edit.private + set(value) { edit.private = value } + + /** + * Registers the given listener to be invoked when the user edits the URL. + */ + override fun setOnEditListener(listener: Toolbar.OnEditListener) { + edit.editListener = listener + } + + /** + * Registers the given function to be invoked when users changes text in the toolbar. + * + * @param filter A function which will perform autocompletion and send results to [AutocompleteDelegate]. + */ + override fun setAutocompleteListener(filter: suspend (String, AutocompleteDelegate) -> Unit) { + // Our 'filter' knows how to autocomplete, and the 'urlView' knows how to apply results of + // autocompletion. Which gives us a lovely delegate chain! + // urlView decides when it's appropriate to ask for autocompletion, and in turn we invoke + // our 'filter' and send results back to 'urlView'. + edit.setAutocompleteListener(filter) + } + + override fun refreshAutocomplete() { + edit.refreshAutocompleteSuggestion() + } + + init { + addView(display.rootView) + addView(edit.rootView) + + updateState(State.DISPLAY) + } + + // We layout the toolbar ourselves to avoid the overhead from using complex ViewGroup implementations + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { + forEach { child -> + child.layout( + 0 + paddingLeft, + 0 + paddingTop, + paddingLeft + child.measuredWidth, + paddingTop + child.measuredHeight, + ) + } + } + + // We measure the views manually to avoid overhead by using complex ViewGroup implementations + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + // Our toolbar will always use the full width and a fixed height (default) or the provided + // height if it's an exact value. + val width = MeasureSpec.getSize(widthMeasureSpec) + val height = if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) { + MeasureSpec.getSize(heightMeasureSpec) + } else { + resources.getDimensionPixelSize(R.dimen.mozac_browser_toolbar_default_toolbar_height) + } + + setMeasuredDimension(width, height) + + // Let the children measure themselves using our fixed size (with padding subtracted) + val childWidth = width - paddingLeft - paddingRight + val childHeight = height - paddingTop - paddingBottom + + val childWidthSpec = MeasureSpec.makeMeasureSpec(childWidth, MeasureSpec.EXACTLY) + val childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY) + + forEach { child -> child.measure(childWidthSpec, childHeightSpec) } + } + + override fun onBackPressed(): Boolean { + if (state == State.EDIT) { + displayMode() + return true + } + return false + } + + override fun onStop() { + display.onStop() + } + + override fun setSearchTerms(searchTerms: String) { + this.searchTerms = searchTerms.trimmed() + + if (state == State.EDIT) { + edit.editSuggestion(this.searchTerms) + } + } + + override fun displayProgress(progress: Int) { + display.updateProgress(progress) + } + + override fun setOnUrlCommitListener(listener: (String) -> Boolean) { + this.urlCommitListener = listener + } + + /** + * Declare that the actions (navigation actions, browser actions, page actions) have changed and + * should be updated if needed. + * + * The toolbar will call the <code>visible</code> lambda of every action to determine whether a + * view for this action should be added or removed. Additionally <code>bind</code> will be + * called on every visible action to update its view. + */ + override fun invalidateActions() { + display.invalidateActions() + edit.invalidateActions() + } + + /** + * Adds an action to be displayed on the right side of the toolbar (outside of the URL bounding + * box) in display mode. + * + * If there is not enough room to show all icons then some icons may be moved to an overflow + * menu. + * + * Related: + * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/user_interface/Browser_action + */ + override fun addBrowserAction(action: Toolbar.Action) { + display.addBrowserAction(action) + } + + /** + * Removes a previously added browser action (see [addBrowserAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + override fun removeBrowserAction(action: Toolbar.Action) { + display.removeBrowserAction(action) + } + + /** + * Removes a previously added page action (see [addPageAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + override fun removePageAction(action: Toolbar.Action) { + display.removePageAction(action) + } + + /** + * Adds an action to be displayed on the right side of the URL in display mode. + * + * Related: + * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/user_interface/Page_actions + */ + override fun addPageAction(action: Toolbar.Action) { + display.addPageAction(action) + } + + /** + * Adds an action to be display on the far left side of the toolbar. This area is usually used + * on larger devices for navigation actions like "back" and "forward". + */ + override fun addNavigationAction(action: Toolbar.Action) { + display.addNavigationAction(action) + } + + /** + * Removes a previously added navigation action (see [addNavigationAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + override fun removeNavigationAction(action: Toolbar.Action) { + display.removeNavigationAction(action) + } + + /** + * Adds an action to be displayed at the start of the URL in edit mode. + */ + override fun addEditActionStart(action: Toolbar.Action) { + edit.addEditActionStart(action) + } + + /** + * Adds an action to be displayed at the end of the URL in edit mode. + */ + override fun addEditActionEnd(action: Toolbar.Action) { + edit.addEditActionEnd(action) + } + + /** + * Removes an action end of the URL in edit mode. + */ + override fun removeEditActionEnd(action: Toolbar.Action) { + edit.removeEditActionEnd(action) + } + + /** + * Hides the menu button in display mode. + */ + override fun hideMenuButton() { + display.hideMenuButton() + } + + /** + * Shows the menu button in display mode. + */ + override fun showMenuButton() { + display.showMenuButton() + } + + /** + * Sets the horizontal padding in display mode. + */ + override fun setDisplayHorizontalPadding(horizontalPadding: Int) { + display.setHorizontalPadding(horizontalPadding) + } + + /** + * Hides the page action separator in display/edit mode. + */ + override fun hidePageActionSeparator() { + display.hidePageActionSeparator() + edit.hidePageActionSeparator() + } + + /** + * Shows the page action separator in display/edit mode. + */ + override fun showPageActionSeparator() { + display.showPageActionSeparator() + edit.showPageActionSeparator() + } + + /** + * Switches to URL editing mode. + * + * @param cursorPlacement Where the cursor should be placed after focusing on the URL input field. + */ + override fun editMode(cursorPlacement: Toolbar.CursorPlacement) { + val urlValue = if (searchTerms.isEmpty()) url else searchTerms + edit.updateUrl(urlValue.toString(), false) + updateState(State.EDIT) + edit.focus() + + when (cursorPlacement) { + Toolbar.CursorPlacement.ALL -> { + edit.selectAll() + } + Toolbar.CursorPlacement.END -> { + edit.selectEnd() + } + } + } + + /** + * Switches to URL displaying mode. + */ + override fun displayMode() { + updateState(State.DISPLAY) + } + + /** + * Dismisses the display toolbar popup menu. + */ + override fun dismissMenu() { + display.views.menu.dismissMenu() + } + + override fun enableScrolling() { + // Behavior can be changed without us knowing. Not safe to use a memoized value. + (layoutParams as? CoordinatorLayout.LayoutParams)?.apply { + (behavior as? EngineViewScrollingBehavior)?.enableScrolling() + } + } + + override fun disableScrolling() { + // Behavior can be changed without us knowing. Not safe to use a memoized value. + (layoutParams as? CoordinatorLayout.LayoutParams)?.apply { + (behavior as? EngineViewScrollingBehavior)?.disableScrolling() + } + } + + override fun expand() { + (layoutParams as? CoordinatorLayout.LayoutParams)?.apply { + (behavior as? EngineViewScrollingBehavior)?.forceExpand(this@BrowserToolbar) + } + } + + override fun collapse() { + (layoutParams as? CoordinatorLayout.LayoutParams)?.apply { + (behavior as? EngineViewScrollingBehavior)?.forceCollapse(this@BrowserToolbar) + } + } + + internal fun onUrlEntered(url: String) { + if (urlCommitListener?.invoke(url) != false) { + // Return to display mode if there's no urlCommitListener or if it returned true. This lets + // the app control whether we should switch to display mode automatically. + displayMode() + } + } + + private fun updateState(state: State) { + this.state = state + + val (show, hide) = when (state) { + State.DISPLAY -> { + edit.stopEditing() + Pair(display.rootView, edit.rootView) + } + State.EDIT -> { + edit.startEditing() + Pair(edit.rootView, display.rootView) + } + } + + show.visibility = View.VISIBLE + hide.visibility = View.GONE + } + + private enum class State { + DISPLAY, + EDIT, + } + + /** + * An action button to be added to the toolbar. + * + * @param imageDrawable The drawable to be shown. + * @param contentDescription The content description to use. + * @param visible Lambda that returns true or false to indicate whether this button should be shown. + * @param autoHide Lambda that returns true or false to indicate whether this button should auto hide. + * @param weight Lambda that returns an integer to indicate weight of an action. The lesser the weight, + * the closer it is to the url. A default weight -1 indicates, the position is not cared for + * and action will be appended at the end. + * @param background A custom (stateful) background drawable resource to be used. + * @param padding a custom [Padding] for this Button. + * @param iconTintColorResource Optional ID of color resource to tint the icon. + * @param longClickListener Callback that will be invoked whenever the button is long-pressed. + * @param listener Callback that will be invoked whenever the button is pressed + */ + open class Button( + imageDrawable: Drawable, + contentDescription: String, + visible: () -> Boolean = { true }, + autoHide: () -> Boolean = { false }, + weight: () -> Int = { -1 }, + @DrawableRes background: Int = 0, + val padding: Padding = DEFAULT_PADDING, + @ColorRes iconTintColorResource: Int = NO_ID, + longClickListener: (() -> Unit)? = null, + listener: () -> Unit, + ) : Toolbar.ActionButton( + imageDrawable, + contentDescription, + visible, + autoHide, + weight, + background, + padding, + iconTintColorResource, + longClickListener, + listener, + ) + + /** + * An action button with two states, selected and unselected. When the button is pressed, the + * state changes automatically. + * + * @param image The drawable to be shown if the button is in unselected state. + * @param imageSelected The drawable to be shown if the button is in selected state. + * @param contentDescription The content description to use if the button is in unselected state. + * @param contentDescriptionSelected The content description to use if the button is in selected state. + * @param visible Lambda that returns true or false to indicate whether this button should be shown. + * @param weight Lambda that returns an integer to indicate weight of an action. The lesser the weight, + * the closer it is to the url. A default weight -1 indicates, the position is not cared for + * and action will be appended at the end. + * @param selected Sets whether this button should be selected initially. + * @param background A custom (stateful) background drawable resource to be used. + * @param padding a custom [Padding] for this Button. + * @param listener Callback that will be invoked whenever the checked state changes. + */ + open class ToggleButton( + image: Drawable, + imageSelected: Drawable, + contentDescription: String, + contentDescriptionSelected: String, + visible: () -> Boolean = { true }, + weight: () -> Int = { -1 }, + selected: Boolean = false, + @DrawableRes background: Int = 0, + val padding: Padding = DEFAULT_PADDING, + listener: (Boolean) -> Unit, + ) : Toolbar.ActionToggleButton( + image, + imageSelected, + contentDescription, + contentDescriptionSelected, + visible, + weight, + selected, + background, + padding, + listener, + ) + + /** + * An action that either shows an active button or an inactive button based on the provided + * <code>isInPrimaryState</code> lambda. All secondary characteristics default to their + * corresponding primary. + * + * @param primaryImage: The drawable to be shown if the button is in the primary/enabled state + * @param primaryContentDescription: The content description to use if the button is in the primary state. + * @param secondaryImage: The drawable to be shown if the button is in the secondary/disabled state. + * @param secondaryContentDescription: The content description to use if the button is in the secondary state. + * @param isInPrimaryState: Lambda that returns whether this button should be in the primary or secondary state. + * @param primaryImageTintResource: Optional ID of color resource to tint the icon in the primary state. + * @param secondaryImageTintResource: ID of color resource to tint the icon in the secondary state. + * @param disableInSecondaryState: Disable the button entirely when in the secondary state? + * @param weight Lambda that returns an integer to indicate weight of an action. The lesser the weight, + * the closer it is to the url. A default weight -1 indicates, the position is not cared for + * and action will be appended at the end. + * @param background A custom (stateful) background drawable resource to be used. + * @param longClickListener Callback that will be invoked whenever the button is long-pressed. + * @param listener Callback that will be invoked whenever the button is pressed. + */ + open class TwoStateButton( + val primaryImage: Drawable, + val primaryContentDescription: String, + val secondaryImage: Drawable = primaryImage, + val secondaryContentDescription: String = primaryContentDescription, + val isInPrimaryState: () -> Boolean = { true }, + @ColorRes val primaryImageTintResource: Int = NO_ID, + @ColorRes val secondaryImageTintResource: Int = primaryImageTintResource, + val disableInSecondaryState: Boolean = true, + override val weight: () -> Int = { -1 }, + background: Int = 0, + longClickListener: (() -> Unit)? = null, + listener: () -> Unit, + ) : Button( + primaryImage, + primaryContentDescription, + weight = weight, + background = background, + longClickListener = longClickListener, + listener = listener, + ) { + var enabled: Boolean = false + private set + + override fun bind(view: View) { + enabled = isInPrimaryState.invoke() + + val button = view as ImageButton + if (enabled) { + button.setImageDrawable(primaryImage) + button.contentDescription = primaryContentDescription + button.setTintResource(primaryImageTintResource) + button.isEnabled = true + } else { + button.setImageDrawable(secondaryImage) + button.contentDescription = secondaryContentDescription + button.setTintResource(secondaryImageTintResource) + button.isEnabled = !disableInSecondaryState + } + } + } + + companion object { + internal const val ACTION_PADDING_DP = 16 + internal val DEFAULT_PADDING = + Padding(ACTION_PADDING_DP, ACTION_PADDING_DP, ACTION_PADDING_DP, ACTION_PADDING_DP) + } +} + +/** + * Wraps [filter] execution in a coroutine context, cancelling prior executions on every invocation. + * [coroutineContext] must be of type that doesn't propagate cancellation of its children upwards. + */ +class AsyncFilterListener( + private val urlView: AutocompleteView, + override val coroutineContext: CoroutineContext, + private val filter: suspend (String, AutocompleteDelegate) -> Unit, + private val uiContext: CoroutineContext = Dispatchers.Main, +) : OnFilterListener, CoroutineScope { + override fun invoke(text: String) { + // We got a new input, so whatever past autocomplete queries we still have running are + // irrelevant. We cancel them, but do not depend on cancellation to take place. + coroutineContext.cancelChildren() + + CoroutineScope(coroutineContext).launch { + filter(text, AsyncAutocompleteDelegate(urlView, this, uiContext)) + } + } +} + +/** + * An autocomplete delegate which is aware of its parent scope (to check for cancellations). + * Responsible for processing autocompletion results and discarding stale results when [urlView] moved on. + */ +private class AsyncAutocompleteDelegate( + private val urlView: AutocompleteView, + private val parentScope: CoroutineScope, + override val coroutineContext: CoroutineContext, + private val logger: Logger = Logger("AsyncAutocompleteDelegate"), +) : AutocompleteDelegate, CoroutineScope { + override fun applyAutocompleteResult(result: AutocompleteResult, onApplied: () -> Unit) { + // Bail out if we were cancelled already. + if (!parentScope.isActive) { + logger.debug("Autocomplete request cancelled. Discarding results.") + return + } + + // Process results on the UI dispatcher. + CoroutineScope(coroutineContext).launch { + // Ignore this result if the query is stale. + if (result.input == urlView.originalText.lowercase()) { + urlView.applyAutocompleteResult( + InlineAutocompleteEditText.AutocompleteResult( + text = result.text, + source = result.source, + totalItems = result.totalItems, + ), + ) + onApplied() + } else { + logger.debug("Discarding stale autocomplete result.") + } + } + } + + override fun noAutocompleteResult(input: String) { + // Bail out if we were cancelled already. + if (!parentScope.isActive) { + logger.debug("Autocomplete request cancelled. Discarding 'noAutocompleteResult'.") + return + } + + // Process results on the UI thread. + CoroutineScope(coroutineContext).launch { + // Ignore this result if the query is stale. + if (input == urlView.originalText) { + urlView.noAutocompleteResult() + } else { + logger.debug("Discarding stale lack of autocomplete results.") + } + } + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbar.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbar.kt new file mode 100644 index 0000000000..66218febbb --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbar.kt @@ -0,0 +1,711 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.content.Context +import android.graphics.Color +import android.graphics.Typeface +import android.graphics.drawable.Drawable +import android.os.Build +import android.util.TypedValue +import android.view.View +import android.view.accessibility.AccessibilityEvent +import android.widget.ImageView +import android.widget.ProgressBar +import androidx.annotation.ColorInt +import androidx.appcompat.content.res.AppCompatResources.getDrawable +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.content.ContextCompat +import androidx.core.view.isVisible +import mozilla.components.browser.menu.BrowserMenuBuilder +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.browser.toolbar2.R +import mozilla.components.browser.toolbar2.internal.ActionContainer +import mozilla.components.concept.menu.MenuController +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.support.ktx.android.content.isScreenReaderEnabled +import mozilla.components.ui.colors.R.color as photonColors + +/** + * Sub-component of the browser toolbar responsible for displaying the URL and related controls ("display mode"). + * + * Structure: + * ``` + * +-------------+------------+-----------------------+----------+------+ + * | navigation | indicators | url [ page ] | browser | menu | + * | actions | | [ actions ] | actions | | + * +-------------+------------+-----------------------+----------+------+ + * +------------------------progress------------------------------------+ + * ``` + * + * Navigation actions (optional): + * A dynamic list of clickable icons usually used for navigation on larger devices + * (e.g. “back”/”forward” buttons.) + * + * Indicators (optional): + * Tracking protection indicator icon (e.g. “shield” icon) that may show a doorhanger when clicked. + * Separator icon: a vertical line that separate the above and below icons. + * Site security indicator icon (e.g. “Lock” icon) that may show a doorhanger when clicked. + * Empty indicator: Icon that will be displayed if the URL is empty. + * + * URL: + * Section that displays the current URL (read-only) + * + * Page actions (optional): + * A dynamic list of clickable icons inside the URL section (e.g. “reader mode” icon) + * + * Browser actions (optional): + * A list of dynamic clickable icons on the toolbar (e.g. tabs tray button) + * + * Menu (optional): + * A button that shows an overflow menu when clicked (constructed using the browser-menu + * component) + * + * Progress (optional): + * A horizontal progress bar showing the loading progress (at the top or bottom of the toolbar). + */ +@Suppress("LargeClass") +class DisplayToolbar internal constructor( + private val context: Context, + private val toolbar: BrowserToolbar, + internal val rootView: View, +) { + /** + * Enum of indicators that can be displayed in the toolbar. + */ + enum class Indicators { + SECURITY, + TRACKING_PROTECTION, + EMPTY, + HIGHLIGHT, + } + + /** + * Data class holding the customizable colors in "display mode". + * + * @property securityIconSecure Color tint for the "secure connection" icon (lock). + * @property securityIconInsecure Color tint for the "insecure connection" icon (broken lock). + * @property emptyIcon Color tint for the icon shown when the URL is empty. + * @property menu Color tint for the menu icon. + * @property hint Text color of the hint shown when the URL is empty. + * @property title Text color of the website title. + * @property text Text color of the URL. + * @property trackingProtection Color tint for the tracking protection icons. + * @property separator Color tint for the separator shown between indicators. + * @property pageActionSeparator Color tint of separator dividing url and page actions. + * @property highlight Color tint for the highlight icon. + * + * Set/Get the site security icon colours. It uses a pair of color integers which represent the + * insecure and secure colours respectively. + */ + data class Colors( + @ColorInt val securityIconSecure: Int, + @ColorInt val securityIconInsecure: Int, + @ColorInt val emptyIcon: Int, + @ColorInt val menu: Int, + @ColorInt val hint: Int, + @ColorInt val title: Int, + @ColorInt val text: Int, + @ColorInt val trackingProtection: Int?, + @ColorInt val separator: Int, + @ColorInt val pageActionSeparator: Int, + @ColorInt val highlight: Int?, + ) + + /** + * Data class holding the customizable icons in "display mode". + * + * @property emptyIcon An icon that is shown in front of the URL if the URL is empty. + * @property trackingProtectionTrackersBlocked An icon that is shown if tracking protection is + * enabled and trackers have been blocked. + * @property trackingProtectionNothingBlocked An icon that is shown if tracking protection is + * enabled and no trackers have been blocked. + * @property trackingProtectionException An icon that is shown if tracking protection is enabled + * but the current page is in the "exception list". + * @property highlight An icon that is shown if any event needs to be brought + * to the user's attention. Like the autoplay permission been blocked. + */ + data class Icons( + val emptyIcon: Drawable?, + val trackingProtectionTrackersBlocked: Drawable, + val trackingProtectionNothingBlocked: Drawable, + val trackingProtectionException: Drawable, + val highlight: Drawable, + ) + + /** + * Gravity enum for positioning the progress bar. + */ + enum class Gravity { + TOP, + BOTTOM, + } + + internal val views = DisplayToolbarViews( + browserActions = rootView.findViewById(R.id.mozac_browser_toolbar_browser_actions), + pageActions = rootView.findViewById(R.id.mozac_browser_toolbar_page_actions), + navigationActions = rootView.findViewById(R.id.mozac_browser_toolbar_navigation_actions), + background = rootView.findViewById(R.id.mozac_browser_toolbar_background), + separator = rootView.findViewById(R.id.mozac_browser_toolbar_separator), + pageActionSeparator = rootView.findViewById(R.id.mozac_browser_toolbar_action_separator), + emptyIndicator = rootView.findViewById(R.id.mozac_browser_toolbar_empty_indicator), + menu = MenuButton(rootView.findViewById(R.id.mozac_browser_toolbar_menu)), + securityIndicator = rootView.findViewById(R.id.mozac_browser_toolbar_security_indicator), + trackingProtectionIndicator = rootView.findViewById( + R.id.mozac_browser_toolbar_tracking_protection_indicator, + ), + origin = rootView.findViewById<OriginView>(R.id.mozac_browser_toolbar_origin_view).also { + it.toolbar = toolbar + }, + progress = rootView.findViewById<ProgressBar>(R.id.mozac_browser_toolbar_progress), + highlight = rootView.findViewById(R.id.mozac_browser_toolbar_permission_indicator), + ) + + /** + * Customizable colors in "display mode". + */ + var colors: Colors = Colors( + securityIconSecure = ContextCompat.getColor(context, photonColors.photonWhite), + securityIconInsecure = ContextCompat.getColor(context, photonColors.photonWhite), + emptyIcon = ContextCompat.getColor(context, photonColors.photonWhite), + menu = ContextCompat.getColor(context, photonColors.photonWhite), + hint = views.origin.hintColor, + title = views.origin.titleColor, + text = views.origin.textColor, + trackingProtection = null, + separator = ContextCompat.getColor(context, photonColors.photonGrey80), + pageActionSeparator = ContextCompat.getColor(context, photonColors.photonGrey80), + highlight = null, + ) + set(value) { + field = value + + updateSiteSecurityIcon() + views.emptyIndicator.setColorFilter(value.emptyIcon) + views.menu.setColorFilter(value.menu) + views.origin.hintColor = value.hint + views.origin.titleColor = value.title + views.origin.textColor = value.text + views.separator.setColorFilter(value.separator) + views.pageActionSeparator.setBackgroundColor(value.pageActionSeparator) + + if (value.trackingProtection != null) { + views.trackingProtectionIndicator.setTint(value.trackingProtection) + views.trackingProtectionIndicator.setColorFilter(value.trackingProtection) + } + + if (value.highlight != null) { + views.highlight.setTint(value.highlight) + } + } + + /** + * Customizable icons in "edit mode". + */ + var icons: Icons = Icons( + emptyIcon = null, + trackingProtectionTrackersBlocked = requireNotNull( + getDrawable(context, TrackingProtectionIconView.DEFAULT_ICON_ON_TRACKERS_BLOCKED), + ), + trackingProtectionNothingBlocked = requireNotNull( + getDrawable(context, TrackingProtectionIconView.DEFAULT_ICON_ON_NO_TRACKERS_BLOCKED), + ), + trackingProtectionException = requireNotNull( + getDrawable(context, TrackingProtectionIconView.DEFAULT_ICON_OFF_FOR_A_SITE), + ), + highlight = requireNotNull( + getDrawable(context, R.drawable.mozac_dot_notification), + ), + ) + set(value) { + field = value + + views.emptyIndicator.setImageDrawable(value.emptyIcon) + + views.trackingProtectionIndicator.setIcons( + value.trackingProtectionNothingBlocked, + value.trackingProtectionTrackersBlocked, + value.trackingProtectionException, + ) + views.highlight.setIcon(value.highlight) + } + + /** + * Allows customization of URL for display purposes. + */ + var urlFormatter: ((CharSequence) -> CharSequence)? = null + + /** + * Sets a listener to be invoked when the site security indicator icon is clicked. + */ + fun setOnSiteSecurityClickedListener(listener: (() -> Unit)?) { + if (listener == null) { + views.securityIndicator.setOnClickListener(null) + views.securityIndicator.background = null + } else { + views.securityIndicator.setOnClickListener { + listener.invoke() + } + + val outValue = TypedValue() + context.theme.resolveAttribute( + android.R.attr.selectableItemBackgroundBorderless, + outValue, + true, + ) + + views.securityIndicator.setBackgroundResource(outValue.resourceId) + } + } + + /** + * Sets a listener to be invoked when the site tracking protection indicator icon is clicked. + */ + fun setOnTrackingProtectionClickedListener(listener: (() -> Unit)?) { + if (listener == null) { + views.trackingProtectionIndicator.setOnClickListener(null) + views.trackingProtectionIndicator.background = null + } else { + views.trackingProtectionIndicator.setOnClickListener { + listener.invoke() + } + + val outValue = TypedValue() + context.theme.resolveAttribute( + android.R.attr.selectableItemBackgroundBorderless, + outValue, + true, + ) + + views.trackingProtectionIndicator.setBackgroundResource(outValue.resourceId) + } + } + + /** + * Sets a lambda to be invoked when the menu is dismissed + */ + fun setMenuDismissAction(onDismiss: () -> Unit) { + views.menu.setMenuDismissAction(onDismiss) + } + + /** + * List of indicators that should be displayed next to the URL. + */ + var indicators: List<Indicators> = listOf(Indicators.SECURITY) + set(value) { + field = value + + updateIndicatorVisibility() + } + + var displayIndicatorSeparator: Boolean = true + set(value) { + field = value + updateIndicatorVisibility() + } + + /** + * Sets the background that should be drawn behind the URL, page actions an indicators. + */ + fun setUrlBackground(background: Drawable?) { + views.background.setImageDrawable(background) + } + + /** + * Whether the progress bar should be drawn at the top or bottom of the toolbar. + */ + var progressGravity: Gravity = Gravity.BOTTOM + set(value) { + field = value + + val layout = rootView as ConstraintLayout + layout.hashCode() + + val constraintSet = ConstraintSet() + constraintSet.clone(layout) + constraintSet.clear(views.progress.id, ConstraintSet.TOP) + constraintSet.clear(views.progress.id, ConstraintSet.BOTTOM) + constraintSet.connect( + views.progress.id, + if (value == Gravity.TOP) ConstraintSet.TOP else ConstraintSet.BOTTOM, + ConstraintSet.PARENT_ID, + if (value == Gravity.TOP) ConstraintSet.TOP else ConstraintSet.BOTTOM, + ) + constraintSet.applyTo(layout) + } + + /** + * Sets a lambda that will be invoked whenever the URL in display mode was clicked. Only if this + * lambda returns <code>true</code> the toolbar will switch to editing mode. Return + * <code>false</code> to not switch to editing mode and handle the click manually. + */ + var onUrlClicked: () -> Boolean + get() = views.origin.onUrlClicked + set(value) { + views.origin.onUrlClicked = value + } + + /** + * Sets the text to be displayed when the URL of the toolbar is empty. + */ + var hint: String + get() = views.origin.hint + set(value) { + views.origin.hint = value + } + + /** + * Sets the size of the text for the title displayed in the toolbar. + */ + var titleTextSize: Float + get() = views.origin.titleTextSize + set(value) { + views.origin.titleTextSize = value + } + + /** + * Sets the size of the text for the URL/search term displayed in the toolbar. + */ + var textSize: Float + get() = views.origin.textSize + set(value) { + views.origin.textSize = value + } + + /** + * Sets the typeface of the text for the URL/search term displayed in the toolbar. + */ + var typeface: Typeface + get() = views.origin.typeface + set(value) { + views.origin.typeface = value + } + + /** + * Sets a [BrowserMenuBuilder] that will be used to create a menu when the menu button is clicked. + * The menu button will only be visible if a builder or controller has been set. + */ + var menuBuilder: BrowserMenuBuilder? + get() = views.menu.menuBuilder + set(value) { + views.menu.menuBuilder = value + } + + /** + * Sets a [MenuController] that will be used to create a menu when the menu button is clicked. + * The menu button will only be visible if a builder or controller has been set. + * If both a [menuBuilder] and controller are present, only the controller will be used. + */ + var menuController: MenuController? + get() = views.menu.menuController + set(value) { + views.menu.menuController = value + } + + /** + * Set a LongClickListener to the urlView of the toolbar. + */ + fun setOnUrlLongClickListener(handler: ((View) -> Boolean)?) = views.origin.setOnUrlLongClickListener(handler) + + private fun updateIndicatorVisibility() { + val urlEmpty = url.isEmpty() + + views.securityIndicator.visibility = if (!urlEmpty && indicators.contains(Indicators.SECURITY)) { + View.VISIBLE + } else { + View.GONE + } + + views.trackingProtectionIndicator.visibility = if ( + !urlEmpty && indicators.contains(Indicators.TRACKING_PROTECTION) + ) { + View.VISIBLE + } else { + View.GONE + } + + views.emptyIndicator.visibility = if (urlEmpty && indicators.contains(Indicators.EMPTY)) { + View.VISIBLE + } else { + View.GONE + } + + views.highlight.visibility = if (!urlEmpty && indicators.contains(Indicators.HIGHLIGHT)) { + setHighlight(toolbar.highlight) + } else { + View.GONE + } + + updateSeparatorVisibility() + } + + private fun updateSeparatorVisibility() { + views.separator.visibility = if ( + displayIndicatorSeparator && + views.trackingProtectionIndicator.isVisible && + views.securityIndicator.isVisible + ) { + View.VISIBLE + } else { + View.GONE + } + + // In Fenix (which is using a beta release of ConstraintLayout) we are seeing issues after + // early visibility changes. Children of the ConstraintLayout are not visible and have a + // size of 0x0 (even though they have a fixed size in the layout XML). Explicitly requesting + // to layout the ConstraintLayout fixes that issue. This may be a bug in the beta of + // ConstraintLayout and in the future we may be able to just remove this call. + rootView.requestLayout() + } + + /** + * Updates the title to be displayed. + */ + internal var title: String + get() = views.origin.title + set(value) { + views.origin.title = value + } + + /** + * Updates the URL to be displayed. + */ + internal var url: CharSequence = "" + set(value) { + field = value + views.origin.url = urlFormatter?.invoke(value) ?: value + updateIndicatorVisibility() + } + + /** + * Sets the site's security icon as secure if true, else the regular globe. + */ + internal var siteSecurity: Toolbar.SiteSecurity = Toolbar.SiteSecurity.INSECURE + set(value) { + field = value + updateSiteSecurityIcon() + } + + private fun updateSiteSecurityIcon() { + @ColorInt val color = when (siteSecurity) { + Toolbar.SiteSecurity.INSECURE -> colors.securityIconInsecure + Toolbar.SiteSecurity.SECURE -> colors.securityIconSecure + } + if (color == Color.TRANSPARENT && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + views.securityIndicator.clearColorFilter() + } else { + views.securityIndicator.setColorFilter(color) + } + + views.securityIndicator.siteSecurity = siteSecurity + } + + internal fun setTrackingProtectionState(state: Toolbar.SiteTrackingProtection) { + views.trackingProtectionIndicator.siteTrackingProtection = state + updateSeparatorVisibility() + } + + internal fun setHighlight(state: Toolbar.Highlight): Int { + if (!indicators.contains(Indicators.HIGHLIGHT)) { + return views.highlight.visibility + } + + views.highlight.state = state + + return views.highlight.visibility + } + + internal fun onStop() { + views.menu.dismissMenu() + } + + /** + * Updates the progress to be displayed. + * + * Accessibility note: + * ProgressBars can be made accessible to TalkBack by setting `android:accessibilityLiveRegion`. + * They will emit TYPE_VIEW_SELECTED events. TalkBack will format those events into percentage + * announcements along with a pitch-change earcon. We are not using that feature here for + * several reasons: + * 1. They are dispatched via a 200ms timeout. Since loading a page can be a short process, + * and since we only update the bar a handful of times, these events often never fire and + * they don't give the user a true sense of the progress. + * 2. The last 100% event is dispatched after the view is hidden. This prevents the event + * from being fired, so the user never gets a "complete" event. + * 3. Live regions in TalkBack have their role announced, so the user will hear + * "Progress bar, 25%". For a common feature like page load this is very chatty and unintuitive. + * 4. We can provide custom strings instead of the less useful percentage utterance, but + * TalkBack will not play an earcon if an event has its own text. + * + * For all those reasons, we are going another route here with a "loading" announcement + * when the progress bar first appears along with scroll events that have the same + * pitch-change earcon in TalkBack (although they are a bit louder). This gives a concise and + * consistent feedback to the user that they can depend on. + * + */ + internal fun updateProgress(progress: Int) { + if (!views.progress.isVisible && progress > 0) { + // Loading has just started, make visible. + views.progress.visibility = View.VISIBLE + + // Announce "loading" for accessibility if it has not been completed + if (progress < views.progress.max) { + views.progress.announceForAccessibility( + context.getString(R.string.mozac_browser_toolbar_progress_loading), + ) + } + } + + views.progress.progress = progress + val event = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + AccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SCROLLED) + } else { + @Suppress("DEPRECATION") + AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED) + }.apply { + scrollY = progress + maxScrollY = views.progress.max + } + + if (context.isScreenReaderEnabled) { + views.progress.parent.requestSendAccessibilityEvent(views.progress, event) + } + + if (progress >= views.progress.max) { + // Loading is done, hide progress bar. + views.progress.visibility = View.GONE + } + } + + /** + * Declare that the actions (navigation actions, browser actions, page actions) have changed and + * should be updated if needed. + */ + internal fun invalidateActions() { + views.menu.invalidateMenu() + + views.browserActions.invalidateActions() + views.pageActions.invalidateActions() + views.navigationActions.invalidateActions() + } + + /** + * Adds an action to be displayed on the right side of the toolbar (outside of the URL bounding + * box) in display mode. + * + * If there is not enough room to show all icons then some icons may be moved to an overflow + * menu. + * + * Related: + * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/user_interface/Browser_action + */ + internal fun addBrowserAction(action: Toolbar.Action) { + views.browserActions.addAction(action) + } + + /** + * Removes a previously added browser action (see [addBrowserAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + internal fun removeBrowserAction(action: Toolbar.Action) { + views.browserActions.removeAction(action) + } + + /** + * Removes a previously added page action (see [addBrowserAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + internal fun removePageAction(action: Toolbar.Action) { + views.pageActions.removeAction(action) + } + + /** + * Adds an action to be displayed on the right side of the URL in display mode. + * + * Related: + * https://developer.mozilla.org/en-US/Add-ons/WebExtensions/user_interface/Page_actions + */ + internal fun addPageAction(action: Toolbar.Action) { + views.pageActions.addAction(action) + } + + /** + * Adds an action to be display on the far left side of the toolbar. This area is usually used + * on larger devices for navigation actions like "back" and "forward". + */ + internal fun addNavigationAction(action: Toolbar.Action) { + views.navigationActions.addAction(action) + } + + /** + * Removes a previously added navigation action (see [addNavigationAction]). If the provided + * action was never added, this method has no effect. + * + * @param action the action to remove. + */ + internal fun removeNavigationAction(action: Toolbar.Action) { + views.navigationActions.removeAction(action) + } + + /** + * Hides the menu button in display mode. + */ + fun hideMenuButton() { + views.menu.setShouldBeHidden(true) + } + + /** + * Shows the menu button in display mode. + */ + internal fun showMenuButton() { + views.menu.setShouldBeHidden(false) + } + + /** + * Sets the horizontal padding. + */ + fun setHorizontalPadding(horizontalPadding: Int) { + rootView.setPadding(horizontalPadding, 0, horizontalPadding, 0) + } + + /** + * Hides the page action separator in display mode. + */ + fun hidePageActionSeparator() { + views.pageActionSeparator.isVisible = false + } + + /** + * Shows the page action separator in display mode. + */ + internal fun showPageActionSeparator() { + views.pageActionSeparator.isVisible = true + } +} + +/** + * Internal holder for view references. + */ +@Suppress("LongParameterList") +internal class DisplayToolbarViews( + val browserActions: ActionContainer, + val pageActions: ActionContainer, + val navigationActions: ActionContainer, + val background: ImageView, + val separator: ImageView, + val pageActionSeparator: View, + val emptyIndicator: ImageView, + val menu: MenuButton, + val securityIndicator: SiteSecurityIconView, + val trackingProtectionIndicator: TrackingProtectionIconView, + val origin: OriginView, + val progress: ProgressBar, + val highlight: HighlightView, +) diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbarView.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbarView.kt new file mode 100644 index 0000000000..5bd684a07e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/DisplayToolbarView.kt @@ -0,0 +1,51 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.content.Context +import android.graphics.Canvas +import android.util.AttributeSet +import android.view.View +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout +import mozilla.components.browser.toolbar2.R + +/** + * Custom ConstraintLayout for DisplayToolbar that allows us to draw ripple backgrounds on the toolbar + * by setting a background to transparent. + */ +class DisplayToolbarView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : ConstraintLayout(context, attrs, defStyleAttr) { + init { + // Forcing transparent background so that draw methods will get called and ripple effect + // for children will be drawn on this layout. + setBackgroundColor(0x00000000) + } + + lateinit var backgroundView: ImageView + + override fun onFinishInflate() { + backgroundView = findViewById(R.id.mozac_browser_toolbar_background) + backgroundView.visibility = View.INVISIBLE + + super.onFinishInflate() + } + + // Overriding draw instead of onDraw since we want to draw the background before the actual + // (transparent) background (with a ripple effect) is drawn. + override fun draw(canvas: Canvas) { + canvas.save() + canvas.translate(backgroundView.x, backgroundView.y) + + backgroundView.drawable?.draw(canvas) + + canvas.restore() + + super.draw(canvas) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/HighlightView.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/HighlightView.kt new file mode 100644 index 0000000000..240da038ec --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/HighlightView.kt @@ -0,0 +1,91 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import androidx.annotation.VisibleForTesting +import androidx.appcompat.content.res.AppCompatResources +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.view.isVisible +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.Toolbar.Highlight +import mozilla.components.concept.toolbar.Toolbar.Highlight.NONE +import mozilla.components.concept.toolbar.Toolbar.Highlight.PERMISSIONS_CHANGED + +/** + * Internal widget to display a dot notification. + */ +internal class HighlightView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : AppCompatImageView(context, attrs, defStyleAttr) { + + init { + visibility = GONE + } + + var state: Highlight = NONE + set(value) { + if (value != field) { + field = value + updateIcon() + } + } + + @VisibleForTesting + internal var highlightTint: Int? = null + + private var highlightIcon: Drawable = + requireNotNull(AppCompatResources.getDrawable(context, DEFAULT_ICON)) + + fun setTint(tint: Int) { + highlightTint = tint + setColorFilter(tint) + } + + fun setIcon(icons: Drawable) { + this.highlightIcon = icons + + updateIcon() + } + + @Synchronized + @VisibleForTesting + internal fun updateIcon() { + val update = state.toUpdate() + + isVisible = update.visible + + contentDescription = if (update.contentDescription != null) { + context.getString(update.contentDescription) + } else { + null + } + + highlightTint?.let { setColorFilter(it) } + setImageDrawable(update.drawable) + } + + companion object { + val DEFAULT_ICON = R.drawable.mozac_dot_notification + } + + private fun Highlight.toUpdate(): Update = when (this) { + PERMISSIONS_CHANGED -> Update( + highlightIcon, + R.string.mozac_browser_toolbar_content_description_autoplay_blocked, + true, + ) + + NONE -> Update( + null, + null, + false, + ) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/MenuButton.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/MenuButton.kt new file mode 100644 index 0000000000..6c2a919d00 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/MenuButton.kt @@ -0,0 +1,106 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import androidx.annotation.ColorInt +import androidx.annotation.VisibleForTesting +import androidx.core.view.isVisible +import mozilla.components.browser.menu.BrowserMenuBuilder +import mozilla.components.browser.menu.ext.asCandidateList +import mozilla.components.browser.menu.ext.getHighlight +import mozilla.components.browser.toolbar2.facts.emitOpenMenuFact +import mozilla.components.concept.menu.MenuController + +internal class MenuButton( + @get:VisibleForTesting internal val impl: mozilla.components.browser.menu.view.MenuButton, +) { + + init { + impl.isVisible = false + impl.register( + object : mozilla.components.concept.menu.MenuButton.Observer { + override fun onShow() { + emitOpenMenuFact(impl.menuBuilder?.extras) + } + }, + ) + } + + /** + * Reference to the [MenuController]. + * If present, [menuBuilder] will be ignored. + */ + var menuController: MenuController? + get() = impl.menuController + set(value) { + impl.menuController = value + impl.isVisible = shouldBeVisible() + } + + /** + * Legacy [BrowserMenuBuilder] reference. + * Used to build the menu. + */ + var menuBuilder: BrowserMenuBuilder? + get() = impl.menuBuilder + set(value) { + impl.menuBuilder = value + impl.isVisible = shouldBeVisible() + } + + /** + * Declare that the menu items should be updated if needed. + * This should only be used once a [menuBuilder] is set. + * To update items in the [menuController], call [MenuController.submitList] directly. + */ + fun invalidateMenu() { + val menuController = menuController + if (menuController != null) { + // Convert the menu builder items into a menu candidate list, + // if the menu builder is present + menuBuilder?.items?.let { items -> + val list = items.asCandidateList(impl.context) + menuController.submitList(list) + } + } else { + // Invalidate the BrowserMenu + impl.invalidateBrowserMenu() + impl.setHighlight(menuBuilder?.items?.getHighlight()) + } + } + + fun dismissMenu() { + val menuController = menuController + if (menuController != null) { + // Use the controller to dismiss the menu + menuController.dismiss() + } else { + // Use the button to dismiss the legacy menu + impl.dismissMenu() + } + } + + /** + * Sets a lambda to be invoked when the menu is dismissed + */ + @Suppress("Deprecation") + fun setMenuDismissAction(onDismiss: () -> Unit) { + impl.onDismiss = onDismiss + } + + fun setColorFilter(@ColorInt color: Int) = impl.setColorFilter(color) + + /** + * Hides the menu button. + * + * @param shouldBeHidden A [Boolean] that determines the visibility of the menu button. + */ + fun setShouldBeHidden(shouldBeHidden: Boolean) { + impl.isVisible = !shouldBeHidden && shouldBeVisible() + } + + @VisibleForTesting + internal fun shouldBeVisible() = impl.menuBuilder != null || impl.menuController != null +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/OriginView.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/OriginView.kt new file mode 100644 index 0000000000..3cd70d0dc9 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/OriginView.kt @@ -0,0 +1,198 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.animation.LayoutTransition +import android.content.Context +import android.graphics.Typeface +import android.util.AttributeSet +import android.util.TypedValue +import android.view.Gravity +import android.view.View +import android.widget.LinearLayout +import android.widget.TextView +import androidx.annotation.VisibleForTesting +import androidx.core.view.isVisible +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.browser.toolbar2.R + +private const val TITLE_VIEW_WEIGHT = 5.7f +private const val URL_VIEW_WEIGHT = 4.3f + +/** + * View displaying the URL and optionally the title of a website. + */ +internal class OriginView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : LinearLayout(context, attrs, defStyleAttr) { + internal lateinit var toolbar: BrowserToolbar + + private val textSizeUrlNormal = context.resources.getDimension( + R.dimen.mozac_browser_toolbar_url_textsize, + ) + private val textSizeUrlWithTitle = context.resources.getDimension( + R.dimen.mozac_browser_toolbar_url_with_title_textsize, + ) + private val textSizeTitle = context.resources.getDimension( + R.dimen.mozac_browser_toolbar_title_textsize, + ) + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val urlView = TextView(context).apply { + id = R.id.mozac_browser_toolbar_url_view + setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeUrlNormal) + gravity = Gravity.CENTER_VERTICAL + + setSingleLine() + isClickable = true + isFocusable = true + + setOnClickListener { + if (onUrlClicked()) { + toolbar.editMode() + } + } + + val fadingEdgeSize = resources.getDimensionPixelSize( + R.dimen.mozac_browser_toolbar_url_fading_edge_size, + ) + + setFadingEdgeLength(fadingEdgeSize) + isHorizontalFadingEdgeEnabled = fadingEdgeSize > 0 + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal val titleView = TextView(context).apply { + id = R.id.mozac_browser_toolbar_title_view + visibility = View.GONE + + setTextSize( + TypedValue.COMPLEX_UNIT_PX, + textSizeTitle, + ) + gravity = Gravity.CENTER_VERTICAL + + setSingleLine() + + val fadingEdgeSize = resources.getDimensionPixelSize( + R.dimen.mozac_browser_toolbar_url_fading_edge_size, + ) + + setFadingEdgeLength(fadingEdgeSize) + isHorizontalFadingEdgeEnabled = fadingEdgeSize > 0 + } + + init { + orientation = VERTICAL + + addView( + titleView, + LayoutParams( + LayoutParams.MATCH_PARENT, + 0, + TITLE_VIEW_WEIGHT, + ), + ) + + addView( + urlView, + LayoutParams( + LayoutParams.MATCH_PARENT, + 0, + URL_VIEW_WEIGHT, + ), + ) + + layoutTransition = LayoutTransition() + } + + internal var title: String + get() = titleView.text.toString() + set(value) { + titleView.text = value + + titleView.isVisible = value.isNotEmpty() + + urlView.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + if (value.isNotEmpty()) { + textSizeUrlWithTitle + } else { + textSizeUrlNormal + }, + ) + } + + internal var onUrlClicked: () -> Boolean = { true } + + fun setOnUrlLongClickListener(handler: ((View) -> Boolean)?) { + urlView.isLongClickable = true + titleView.isLongClickable = true + + urlView.setOnLongClickListener(handler) + titleView.setOnLongClickListener(handler) + } + + internal var url: CharSequence + get() = urlView.text + set(value) { urlView.text = value } + + /** + * Sets the colour of the text to be displayed when the URL of the toolbar is empty. + */ + var hintColor: Int + get() = urlView.currentHintTextColor + set(value) { + urlView.setHintTextColor(value) + } + + /** + * Sets the text to be displayed when the URL of the toolbar is empty. + */ + var hint: String + get() = urlView.hint.toString() + set(value) { urlView.hint = value } + + /** + * Sets the colour of the text for title displayed in the toolbar. + */ + var titleColor: Int + get() = urlView.currentTextColor + set(value) { titleView.setTextColor(value) } + + /** + * Sets the colour of the text for the URL/search term displayed in the toolbar. + */ + var textColor: Int + get() = urlView.currentTextColor + set(value) { urlView.setTextColor(value) } + + /** + * Sets the size of the text for the title displayed in the toolbar. + */ + var titleTextSize: Float + get() = titleView.textSize + set(value) { titleView.textSize = value } + + /** + * Sets the size of the text for the URL/search term displayed in the toolbar. + */ + var textSize: Float + get() = urlView.textSize + set(value) { + urlView.textSize = value + } + + /** + * Sets the typeface of the text for the URL/search term displayed in the toolbar. + */ + var typeface: Typeface + get() = urlView.typeface + set(value) { + urlView.typeface = value + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/SiteSecurityIconView.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/SiteSecurityIconView.kt new file mode 100644 index 0000000000..6ebde5a885 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/SiteSecurityIconView.kt @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import androidx.appcompat.widget.AppCompatImageView +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.Toolbar.SiteSecurity + +/** + * Internal widget to display the different icons of site security, relies on the + * [SiteSecurity] state of each page. + */ +internal class SiteSecurityIconView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : AppCompatImageView(context, attrs, defStyleAttr) { + + // We allow null here because in some situations, onCreateDrawableState is getting called from + // the super() constructor on the View class, way before this class properties get + // initialized causing a null pointer exception. + // See for more details: https://github.com/mozilla-mobile/android-components/issues/4058 + var siteSecurity: SiteSecurity? = SiteSecurity.INSECURE + set(value) { + if (value != field) { + field = value + refreshDrawableState() + } + + field = value + } + + override fun onCreateDrawableState(extraSpace: Int): IntArray { + return when (siteSecurity) { + SiteSecurity.INSECURE, null -> super.onCreateDrawableState(extraSpace) + SiteSecurity.SECURE -> { + val drawableState = super.onCreateDrawableState(extraSpace + 1) + View.mergeDrawableStates(drawableState, intArrayOf(R.attr.state_site_secure)) + drawableState + } + } + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconView.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconView.kt new file mode 100644 index 0000000000..654f4edadb --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconView.kt @@ -0,0 +1,135 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.content.Context +import android.graphics.drawable.Animatable +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import androidx.annotation.StringRes +import androidx.annotation.VisibleForTesting +import androidx.appcompat.content.res.AppCompatResources +import androidx.appcompat.widget.AppCompatImageView +import androidx.core.view.isVisible +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection.OFF_FOR_A_SITE +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection.OFF_GLOBALLY +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection.ON_TRACKERS_BLOCKED + +/** + * Internal widget to display the different icons of tracking protection, relies on the + * [SiteTrackingProtection] state of each page. + */ +internal class TrackingProtectionIconView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : AppCompatImageView(context, attrs, defStyleAttr) { + var siteTrackingProtection: SiteTrackingProtection? = null + set(value) { + if (value != field) { + field = value + updateIcon() + } + } + + @VisibleForTesting + internal var trackingProtectionTint: Int? = null + + private var iconOnNoTrackersBlocked: Drawable = + requireNotNull(AppCompatResources.getDrawable(context, DEFAULT_ICON_ON_NO_TRACKERS_BLOCKED)) + private var iconOnTrackersBlocked: Drawable = + requireNotNull(AppCompatResources.getDrawable(context, DEFAULT_ICON_ON_TRACKERS_BLOCKED)) + private var disabledForSite: Drawable = + requireNotNull(AppCompatResources.getDrawable(context, DEFAULT_ICON_OFF_FOR_A_SITE)) + + fun setTint(tint: Int) { + trackingProtectionTint = tint + } + + fun setIcons( + iconOnNoTrackersBlocked: Drawable, + iconOnTrackersBlocked: Drawable, + disabledForSite: Drawable, + ) { + this.iconOnNoTrackersBlocked = iconOnNoTrackersBlocked + this.iconOnTrackersBlocked = iconOnTrackersBlocked + this.disabledForSite = disabledForSite + + updateIcon() + } + + @Synchronized + private fun updateIcon() { + val update = siteTrackingProtection?.toUpdate() ?: return + + isVisible = update.visible + + contentDescription = if (update.contentDescription != null) { + context.getString(update.contentDescription) + } else { + null + } + + setOrClearColorFilter(update.drawable) + setImageDrawable(update.drawable) + + if (update.drawable is Animatable) { + update.drawable.start() + } + } + + @VisibleForTesting + internal fun setOrClearColorFilter(drawable: Drawable?) { + if (drawable is Animatable) { + clearColorFilter() + } else { + trackingProtectionTint?.let { setColorFilter(it) } + } + } + + companion object { + val DEFAULT_ICON_ON_NO_TRACKERS_BLOCKED = + R.drawable.mozac_ic_tracking_protection_on_no_trackers_blocked + val DEFAULT_ICON_ON_TRACKERS_BLOCKED = + R.drawable.mozac_ic_tracking_protection_on_trackers_blocked + val DEFAULT_ICON_OFF_FOR_A_SITE = + R.drawable.mozac_ic_tracking_protection_off_for_a_site + } + + private fun SiteTrackingProtection.toUpdate(): Update = when (this) { + ON_NO_TRACKERS_BLOCKED -> Update( + iconOnNoTrackersBlocked, + R.string.mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked, + true, + ) + + ON_TRACKERS_BLOCKED -> Update( + iconOnTrackersBlocked, + R.string.mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1, + true, + ) + + OFF_FOR_A_SITE -> Update( + disabledForSite, + R.string.mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1, + true, + ) + + OFF_GLOBALLY -> Update( + null, + null, + false, + ) + } +} + +internal class Update( + val drawable: Drawable?, + @StringRes val contentDescription: Int?, + val visible: Boolean, +) diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/edit/EditToolbar.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/edit/EditToolbar.kt new file mode 100644 index 0000000000..2595ab66e2 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/edit/EditToolbar.kt @@ -0,0 +1,415 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.edit + +import android.content.Context +import android.graphics.Typeface +import android.graphics.drawable.Drawable +import android.os.Build +import android.view.KeyEvent +import android.view.View +import android.widget.ImageView +import androidx.annotation.ColorInt +import androidx.annotation.VisibleForTesting +import androidx.annotation.VisibleForTesting.Companion.PRIVATE +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.content.ContextCompat +import androidx.core.view.inputmethod.EditorInfoCompat +import androidx.core.view.isVisible +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.asCoroutineDispatcher +import mozilla.components.browser.toolbar2.AsyncFilterListener +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.browser.toolbar2.R +import mozilla.components.browser.toolbar2.facts.emitCommitFact +import mozilla.components.browser.toolbar2.internal.ActionContainer +import mozilla.components.concept.toolbar.AutocompleteDelegate +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.support.base.log.logger.Logger +import mozilla.components.support.base.utils.NamedThreadFactory +import mozilla.components.support.ktx.android.view.showKeyboard +import mozilla.components.ui.autocomplete.InlineAutocompleteEditText +import java.util.concurrent.Executors +import mozilla.components.ui.colors.R as colorsR + +private const val AUTOCOMPLETE_QUERY_THREADS = 3 + +/** + * Sub-component of the browser toolbar responsible for allowing the user to edit the URL ("edit mode"). + * + * Structure: + * +------+--------------------+---------------------------+------------------+------+ + * | icon | edit actions start | url | edit actions end | exit | + * +------+--------------------+---------------------------+------------------+------+ + * + * - icon: Optional icon that will be shown in front of the URL. + * - edit actions start: Optional action icons injected by other components in front of the URL + * (e.g. search engines). + * - url: Editable URL of the currently displayed website. + * - edit actions end: Optional action icons injected by other components after the URL + * (e.g. barcode scanner). + * - exit: Button that switches back to display mode or invoke an app-defined callback. + */ +@Suppress("LargeClass") +class EditToolbar internal constructor( + context: Context, + private val toolbar: BrowserToolbar, + internal val rootView: View, +) { + private val logger = Logger("EditToolbar") + + /** + * Data class holding the customizable colors in "edit mode". + * + * @property clear Color tint used for the "cancel" icon to leave "edit mode". + * @property icon Color tint of the icon displayed in front of the URL. + * @property hint Text color of the hint shown when the URL field is empty. + * @property text Text color of the URL. + * @property suggestionBackground The background color used for autocomplete suggestions. + * @property suggestionForeground The foreground color used for autocomplete suggestions. + * @property pageActionSeparator Color tint of separator dividing page actions. + */ + data class Colors( + @ColorInt val clear: Int, + @ColorInt val erase: Int, + @ColorInt val icon: Int?, + @ColorInt val hint: Int, + @ColorInt val text: Int, + @ColorInt val suggestionBackground: Int, + @ColorInt val suggestionForeground: Int?, + @ColorInt val pageActionSeparator: Int, + ) + + private val autocompleteDispatcher = SupervisorJob() + + Executors.newFixedThreadPool( + AUTOCOMPLETE_QUERY_THREADS, + NamedThreadFactory("EditToolbar"), + ).asCoroutineDispatcher() + + CoroutineExceptionHandler { _, throwable -> + logger.error("Error while processing autocomplete input", throwable) + } + + @VisibleForTesting(otherwise = PRIVATE) + internal val views = EditToolbarViews( + background = rootView.findViewById(R.id.mozac_browser_toolbar_background), + icon = rootView.findViewById(R.id.mozac_browser_toolbar_edit_icon), + editActionsStart = rootView.findViewById(R.id.mozac_browser_toolbar_edit_actions_start), + editActionsEnd = rootView.findViewById(R.id.mozac_browser_toolbar_edit_actions_end), + clear = rootView.findViewById<ImageView>(R.id.mozac_browser_toolbar_clear_view).apply { + setOnClickListener { + onClear() + } + }, + erase = rootView.findViewById<ImageView>(R.id.mozac_browser_toolbar_erase_view).apply { + setOnClickListener { + onClear() + } + }, + url = rootView.findViewById<InlineAutocompleteEditText>( + R.id.mozac_browser_toolbar_edit_url_view, + ).apply { + setOnCommitListener { + // We emit the fact before notifying the listener because otherwise the listener may cause a focus + // change which may reset the autocomplete state that we want to report here. + emitCommitFact(autocompleteResult) + + toolbar.onUrlEntered(text.toString()) + } + + setOnTextChangeListener { text, _ -> + onTextChanged(text) + } + + setUrlGoneMargin( + ConstraintSet.END, + context.resources.getDimensionPixelSize(R.dimen.mozac_browser_toolbar_url_gone_margin_end), + ) + + setOnDispatchKeyEventPreImeListener { event -> + if (event?.keyCode == KeyEvent.KEYCODE_BACK && editListener?.onCancelEditing() != false) { + toolbar.displayMode() + } + false + } + }, + pageActionSeparator = rootView.findViewById(R.id.mozac_browser_action_separator), + ) + + /** + * Customizable colors in "edit mode". + */ + var colors: Colors = Colors( + clear = ContextCompat.getColor(context, colorsR.color.photonWhite), + erase = ContextCompat.getColor(context, colorsR.color.photonWhite), + icon = null, + hint = views.url.currentHintTextColor, + text = views.url.currentTextColor, + suggestionBackground = views.url.autoCompleteBackgroundColor, + suggestionForeground = views.url.autoCompleteForegroundColor, + pageActionSeparator = ContextCompat.getColor(context, colorsR.color.photonGrey80), + ) + set(value) { + field = value + + views.clear.setColorFilter(value.clear) + + views.erase.setColorFilter(value.erase) + + if (value.icon != null) { + views.icon.setColorFilter(value.icon) + } + + views.url.setHintTextColor(value.hint) + views.url.setTextColor(value.text) + views.url.autoCompleteBackgroundColor = value.suggestionBackground + views.url.autoCompleteForegroundColor = value.suggestionForeground + views.pageActionSeparator.setBackgroundColor(value.pageActionSeparator) + } + + /** + * Sets the background that will be drawn behind the URL, icon and edit actions. + */ + fun setUrlBackground(background: Drawable?) { + views.background.setImageDrawable(background) + } + + /** + * Sets an icon that will be drawn in front of the URL. + */ + fun setIcon(icon: Drawable, contentDescription: String) { + views.icon.setImageDrawable(icon) + views.icon.contentDescription = contentDescription + views.icon.visibility = View.VISIBLE + } + + /** + * Sets a click listener on the icon view + */ + fun setIconClickListener(listener: ((View) -> Unit)?) { + views.icon.setOnClickListener(listener) + } + + /** + * Sets the text to be displayed when the URL of the toolbar is empty. + */ + var hint: String + get() = views.url.hint.toString() + set(value) { views.url.hint = value } + + /** + * Sets the size of the text for the URL/search term displayed in the toolbar. + */ + var textSize: Float + get() = views.url.textSize + set(value) { + views.url.textSize = value + } + + /** + * Sets the typeface of the text for the URL/search term displayed in the toolbar. + */ + var typeface: Typeface + get() = views.url.typeface + set(value) { views.url.typeface = value } + + /** + * Sets a listener to be invoked when focus of the URL input view (in edit mode) changed. + */ + fun setOnEditFocusChangeListener(listener: (Boolean) -> Unit) { + views.url.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus -> + listener.invoke(hasFocus) + } + } + + /** + * Focuses the url input field and shows the virtual keyboard if needed. + */ + fun focus() { + views.url.run { + if (!hasFocus()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + // On Android 14 this needs to be called before requestFocus() in order to receive focus. + isFocusableInTouchMode = true + } + requestFocus() + showKeyboard() + } + } + } + + internal fun stopEditing() { + editListener?.onStopEditing() + } + + internal fun startEditing() { + editListener?.onStartEditing() + } + + internal var editListener: Toolbar.OnEditListener? = null + + internal fun setAutocompleteListener(filter: suspend (String, AutocompleteDelegate) -> Unit) { + views.url.setOnFilterListener( + AsyncFilterListener(views.url, autocompleteDispatcher, filter), + ) + } + + /** + * Attempt to restart the autocomplete functionality with the current user input. + */ + internal fun refreshAutocompleteSuggestion() { + views.url.refreshAutocompleteSuggestions() + } + + internal fun invalidateActions() { + views.editActionsStart.invalidateActions() + views.editActionsEnd.invalidateActions() + } + + internal fun addEditActionStart(action: Toolbar.Action) { + views.editActionsStart.addAction(action) + } + + internal fun addEditActionEnd(action: Toolbar.Action) { + views.editActionsEnd.addAction(action) + } + + internal fun removeEditActionEnd(action: Toolbar.Action) { + views.editActionsEnd.removeAction(action) + } + + /** + * Updates the text of the URL input field. Note: this does *not* affect the value of url itself + * and is only a visual change + */ + fun updateUrl( + url: String, + shouldAutoComplete: Boolean = false, + shouldHighlight: Boolean = false, + shouldAppend: Boolean = false, + ): String { + if (shouldAppend) { + views.url.appendText(url, shouldAutoComplete) + } else { + views.url.setText(url, shouldAutoComplete) + } + views.clear.isVisible = url.isNotBlank() && !toolbar.isNavBarEnabled + views.erase.isVisible = url.isNotBlank() && toolbar.isNavBarEnabled + + if (shouldHighlight) { + views.url.setSelection(views.url.text.length - url.length, views.url.text.length) + } + return views.url.text.toString() + } + + /** + * Select the entire text in the URL input field. + */ + internal fun selectAll() { + views.url.selectAll() + } + + /** + * Places the cursor at the end of the URL input field. + */ + internal fun selectEnd() { + views.url.setSelection(views.url.text.length) + } + + /** + * Applies the given search terms for further editing, requesting new suggestions along the way. + */ + internal fun editSuggestion(searchTerms: String) { + updateUrl(searchTerms) + views.url.setSelection(views.url.text.length) + focus() + + editListener?.onTextChanged(searchTerms) + } + + /** + * Sets/gets private mode. + * + * In private mode the IME should not update any personalized data such as typing history and personalized language + * model based on what the user typed. + */ + internal var private: Boolean + get() = (views.url.imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING) != 0 + set(value) { + views.url.imeOptions = if (value) { + views.url.imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING + } else { + views.url.imeOptions and (EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv()) + } + } + + private fun onClear() { + // We set text to an empty string instead of using clear to avoid #3612. + views.url.setText("") + editListener?.onInputCleared() + } + + private fun setUrlGoneMargin(anchor: Int, dimen: Int) { + val set = ConstraintSet() + val container = rootView.findViewById<ConstraintLayout>( + R.id.mozac_browser_toolbar_container, + ) + set.clone(container) + set.setGoneMargin(R.id.mozac_browser_toolbar_edit_url_view, anchor, dimen) + set.applyTo(container) + } + + private fun onTextChanged(text: String) { + views.clear.isVisible = text.isNotBlank() && !toolbar.isNavBarEnabled + views.erase.isVisible = text.isNotBlank() && toolbar.isNavBarEnabled + views.editActionsEnd.autoHideAction(text.isEmpty()) + + /* + We use margin_gone instead of margin to take into account both the actionContainer(which in + most cases is gone) and the clear button. + */ + if (text.isNotBlank()) { + setUrlGoneMargin(ConstraintSet.END, 0) + } else { + setUrlGoneMargin( + ConstraintSet.END, + rootView.resources.getDimensionPixelSize( + R.dimen.mozac_browser_toolbar_url_gone_margin_end, + ), + ) + } + editListener?.onTextChanged(text) + } + + /** + * Hides the page action separator in edit mode. + */ + fun hidePageActionSeparator() { + views.pageActionSeparator.isVisible = false + } + + /** + * Shows the page action separator in edit mode. + */ + fun showPageActionSeparator() { + views.pageActionSeparator.isVisible = true + } +} + +/** + * Internal holder for view references. + */ +@Suppress("LongParameterList") +internal class EditToolbarViews( + val background: ImageView, + val icon: ImageView, + val editActionsStart: ActionContainer, + val editActionsEnd: ActionContainer, + val clear: ImageView, + val erase: ImageView, + val url: InlineAutocompleteEditText, + val pageActionSeparator: View, +) diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/facts/ToolbarFacts.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/facts/ToolbarFacts.kt new file mode 100644 index 0000000000..06f09ea18d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/facts/ToolbarFacts.kt @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.facts + +import mozilla.components.support.base.Component +import mozilla.components.support.base.facts.Action +import mozilla.components.support.base.facts.Fact +import mozilla.components.support.base.facts.collect +import mozilla.components.ui.autocomplete.InlineAutocompleteEditText + +/** + * Facts emitted for telemetry related to [ToolbarFeature] + */ +class ToolbarFacts { + /** + * Items that specify which portion of the [ToolbarFeature] was interacted with + */ + object Items { + const val TOOLBAR = "toolbar" + const val MENU = "menu" + } +} + +private fun emitToolbarFact( + action: Action, + item: String, + value: String? = null, + metadata: Map<String, Any>? = null, +) { + Fact( + Component.BROWSER_TOOLBAR, + action, + item, + value, + metadata, + ).collect() +} + +internal fun emitOpenMenuFact(extras: Map<String, Any>?) { + emitToolbarFact(Action.CLICK, ToolbarFacts.Items.MENU, metadata = extras) +} + +internal fun emitCommitFact( + autocompleteResult: InlineAutocompleteEditText.AutocompleteResult?, +) { + val metadata = if (autocompleteResult == null) { + mapOf( + "autocomplete" to false, + ) + } else { + mapOf( + "autocomplete" to true, + "source" to autocompleteResult.source, + ) + } + + emitToolbarFact(Action.COMMIT, ToolbarFacts.Items.TOOLBAR, metadata = metadata) +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionContainer.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionContainer.kt new file mode 100644 index 0000000000..7907dba520 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionContainer.kt @@ -0,0 +1,134 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.internal + +import android.content.Context +import android.transition.TransitionManager +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.widget.LinearLayout +import androidx.annotation.VisibleForTesting +import androidx.core.view.isVisible +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.Toolbar + +/** + * A container [View] for displaying [Toolbar.Action] objects. + */ +internal class ActionContainer @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, +) : LinearLayout(context, attrs, defStyleAttr) { + private val actions = mutableListOf<ActionWrapper>() + private var actionSize: Int? = null + + init { + gravity = Gravity.CENTER_VERTICAL + orientation = HORIZONTAL + visibility = View.GONE + + context.obtainStyledAttributes( + attrs, + R.styleable.ActionContainer, + defStyleAttr, + 0, + ).run { + actionSize = attrs?.let { + getDimensionPixelSize(R.styleable.ActionContainer_actionContainerItemSize, 0) + } + + recycle() + } + } + + fun addAction(action: Toolbar.Action) { + val wrapper = ActionWrapper(action) + + if (action.visible()) { + visibility = View.VISIBLE + + action.createView(this).let { + wrapper.view = it + val insertionIndex = calculateInsertionIndex(action) + addActionView(it, insertionIndex) + } + } + + actions.add(wrapper) + } + + /** + * Essentially calculates the index of an action on toolbar based on a + * map [visibleActionIndicesWithWeights] that holds the order + * of visible action indices to their weights sorted by weights. + * An index is now calculated by finding the immediate next larger weight + * compared to the new action's weight. Index of this find becomes the index of the new action. + * If not found, action is appended at the end. + */ + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun calculateInsertionIndex(newAction: Toolbar.Action): Int { + if (newAction.weight() == -1) { + return -1 + } + val visibleActionIndicesWithWeights = actions.filter { it.actual.visible() } + .mapNotNull { actionWrapper -> + val index = indexOfChild(actionWrapper.view) + if (index != -1) index to actionWrapper.actual.weight() else null + }.sortedBy { it.second } + + val insertionIndex = visibleActionIndicesWithWeights.firstOrNull { it.second > newAction.weight() }?.first + + return insertionIndex ?: childCount + } + + fun removeAction(action: Toolbar.Action) { + actions.find { it.actual == action }?.let { + actions.remove(it) + removeView(it.view) + } + } + + fun invalidateActions() { + TransitionManager.beginDelayedTransition(this) + var updatedVisibility = View.GONE + + for (action in actions) { + val visible = action.actual.visible() + + if (visible) { + updatedVisibility = View.VISIBLE + } + + if (!visible && action.view != null) { + removeView(action.view) + action.view = null + } else if (visible && action.view == null) { + action.actual.createView(this).let { + action.view = it + val insertionIndex = calculateInsertionIndex(action.actual) + addActionView(it, insertionIndex) + } + } + + action.view?.let { action.actual.bind(it) } + } + + visibility = updatedVisibility + } + + fun autoHideAction(isVisible: Boolean) { + for (action in actions) { + if (action.actual.autoHide()) { + action.view?.isVisible = isVisible + } + } + } + + private fun addActionView(view: View, index: Int) { + addView(view, index, LayoutParams(actionSize ?: 0, actionSize ?: 0)) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionWrapper.kt b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionWrapper.kt new file mode 100644 index 0000000000..8600372f1e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/java/mozilla/components/browser/toolbar2/internal/ActionWrapper.kt @@ -0,0 +1,16 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.internal + +import android.view.View +import mozilla.components.concept.toolbar.Toolbar + +/** + * A wrapper helper to pair a Toolbar.Action with an optional View. + */ +internal class ActionWrapper( + var actual: Toolbar.Action, + var view: View? = null, +) diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_browser_toolbar_icons_vertical_separator.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_browser_toolbar_icons_vertical_separator.xml new file mode 100644 index 0000000000..2e366640df --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_browser_toolbar_icons_vertical_separator.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <size android:width="@dimen/mozac_browser_toolbar_icons_separator_width" + android:height="@dimen/mozac_browser_toolbar_icons_separator_height" /> + <solid android:color="#aaaaaa" /> +</shape>
\ No newline at end of file diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_dot_notification.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_dot_notification.xml new file mode 100644 index 0000000000..5469b822af --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_dot_notification.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="8dp" + android:height="8dp" + android:viewportWidth="10" + android:viewportHeight="10"> + <path + android:pathData="M1,5a4,4 0 1,0 8,0a4,4 0 1,0 -8,0" + android:strokeWidth="1" + android:strokeAlpha=".2" + android:fillColor="#fff" + android:strokeColor="#000" /> +</vector> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_site_security.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_site_security.xml new file mode 100644 index 0000000000..ab2b8d0e37 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_site_security.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ac="http://schemas.android.com/apk/res-auto"> + <item + android:drawable="@drawable/mozac_ic_lock_24" + ac:state_site_secure="true" /> + <item + android:drawable="@drawable/mozac_ic_broken_lock" /> +</selector> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_off_for_a_site.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_off_for_a_site.xml new file mode 100644 index 0000000000..250bfbfc4c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_off_for_a_site.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M17.9,10.83c-0.27,2.81 -0.75,4.18 -2,5.86A6.48,6.48 0,0 1,12 19a7,7 0,0 1,-2.32 -0.92l-1.44,1.43A8.44,8.44 0,0 0,11.89 21h0.22a8.36,8.36 0,0 0,5.33 -3.08c1.53,-2 2.14,-3.72 2.45,-6.89C20,10.28 20,9 20,7.76l-2,2c-0.06,0.47 -0.08,0.82 -0.1,1.07zM20.21,3.83a1,1 0,0 0,-1.42 0l-0.3,0.31a1.86,1.86 0,0 0,-0.31 -0.1L12,3 5.82,4A2.14,2.14 0,0 0,4 6.1c0,1.67 0,3.9 0.11,4.9a12.43,12.43 0,0 0,1.69 5.79l-2,2a1,1 0,0 0,0 1.42,1 1,0 0,0 1.42,0l15,-15a1,1 0,0 0,-0.01 -1.42zM12,10.59L12,7l-4,0.7c0,2 0.07,2.74 0.09,3a11.65,11.65 0,0 0,0.63 3.17l-1.46,1.46a11.13,11.13 0,0 1,-1.16 -4.5C6,10.08 6,8.4 6,6.11A0.15,0.15 0,0 1,6.14 6L12,5l4.79,0.79z" /> +</vector> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_no_trackers_blocked.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_no_trackers_blocked.xml new file mode 100644 index 0000000000..4f81a5602b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_no_trackers_blocked.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M20 6c0-1-0.8-1.9-1.8-2L12 3 5.8 4C4.8 4 4 5 4 6l0.1 5c0.3 3.2 1 5 2.5 7a8.4 8.4 0 0 0 5.3 3h0.2c2.1-0.3 4-1.4 5.3-3 1.6-2 2.2-3.8 2.5-7l0.1-5zm-2.1 4.8a10 10 0 0 1-2 6c-1 1.1-2.4 2-3.9 2.3a6.5 6.5 0 0 1-3.9-2.4 9.9 9.9 0 0 1-2-5.9 67.3 67.3 0 0 1 0-4.9L12 5l5.9 1 0.1 0.2-0.1 4.7zM8 7.6v3c0.3 2.7 0.8 3.7 1.7 5 0.6 0.6 1.4 1.2 2.3 1.4V7l-4 0.6z" /> +</vector> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_trackers_blocked.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_trackers_blocked.xml new file mode 100644 index 0000000000..4f81a5602b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/drawable/mozac_ic_tracking_protection_on_trackers_blocked.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M20 6c0-1-0.8-1.9-1.8-2L12 3 5.8 4C4.8 4 4 5 4 6l0.1 5c0.3 3.2 1 5 2.5 7a8.4 8.4 0 0 0 5.3 3h0.2c2.1-0.3 4-1.4 5.3-3 1.6-2 2.2-3.8 2.5-7l0.1-5zm-2.1 4.8a10 10 0 0 1-2 6c-1 1.1-2.4 2-3.9 2.3a6.5 6.5 0 0 1-3.9-2.4 9.9 9.9 0 0 1-2-5.9 67.3 67.3 0 0 1 0-4.9L12 5l5.9 1 0.1 0.2-0.1 4.7zM8 7.6v3c0.3 2.7 0.8 3.7 1.7 5 0.6 0.6 1.4 1.2 2.3 1.4V7l-4 0.6z" /> +</vector> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_displaytoolbar.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_displaytoolbar.xml new file mode 100644 index 0000000000..5a5f779a70 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_displaytoolbar.xml @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<mozilla.components.browser.toolbar2.display.DisplayToolbarView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:mozac="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="56dp" + android:orientation="vertical"> + + <!-- Navigation --> + + <mozilla.components.browser.toolbar2.internal.ActionContainer + android:id="@+id/mozac_browser_toolbar_navigation_actions" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:layout_marginTop="4dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + mozac:actionContainerItemSize="48dp" + tools:layout_width="48dp" /> + + <!-- URL container --> + + <ImageView + android:id="@+id/mozac_browser_toolbar_background" + android:layout_width="0dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:importantForAccessibility="no" + app:layout_constraintEnd_toStartOf="@+id/mozac_browser_toolbar_browser_actions" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_navigation_actions" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginEnd="0dp" /> + + <!-- URL indicators (lock, tracking protection, ..) --> + + <ImageView + android:id="@+id/mozac_browser_toolbar_empty_indicator" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:scaleType="center" + android:visibility="gone" + app:layout_constraintStart_toStartOf="@id/mozac_browser_toolbar_background" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_ic_search_24" + tools:ignore="ContentDescription" /> + + <mozilla.components.browser.toolbar2.display.TrackingProtectionIconView + android:id="@+id/mozac_browser_toolbar_tracking_protection_indicator" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:scaleType="center" + android:visibility="gone" + app:layout_constraintStart_toEndOf="@id/mozac_browser_toolbar_empty_indicator" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_ic_tracking_protection_on_no_trackers_blocked" /> + + <ImageView + android:id="@+id/mozac_browser_toolbar_separator" + android:layout_width="@dimen/mozac_browser_toolbar_icons_separator_width" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:importantForAccessibility="no" + android:scaleType="center" + android:visibility="gone" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_tracking_protection_indicator" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_browser_toolbar_icons_vertical_separator" /> + + <mozilla.components.browser.toolbar2.display.SiteSecurityIconView + android:id="@+id/mozac_browser_toolbar_security_indicator" + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:contentDescription="@string/mozac_browser_toolbar_content_description_site_info" + android:scaleType="center" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_separator" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@drawable/mozac_ic_site_security" /> + + <mozilla.components.browser.toolbar2.display.HighlightView + android:id="@+id/mozac_browser_toolbar_permission_indicator" + android:layout_width="10dp" + android:layout_height="10dp" + android:importantForAccessibility="no" + app:layout_constraintBottom_toBottomOf="@+id/mozac_browser_toolbar_security_indicator" + app:layout_constraintEnd_toEndOf="@+id/mozac_browser_toolbar_security_indicator" + android:layout_marginEnd="8dp" + android:layout_marginBottom="8dp" + android:visibility="gone" + android:tint="@color/photonBlue40" + app:srcCompat="@drawable/mozac_dot_notification" /> + + <!-- URL & Title --> + + <mozilla.components.browser.toolbar2.display.OriginView + android:id="@+id/mozac_browser_toolbar_origin_view" + android:layout_width="0dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:paddingEnd="@dimen/mozac_browser_toolbar_origin_padding_end" + app:layout_constraintEnd_toStartOf="@+id/mozac_browser_toolbar_action_separator" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_security_indicator" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginStart="8dp" + app:layout_goneMarginTop="8dp" /> + + <View + android:id="@+id/mozac_browser_toolbar_action_separator" + android:layout_width="@dimen/mozac_browser_toolbar_page_action_separator_width" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginStart="8dp" + android:visibility="gone" + android:importantForAccessibility="no" + android:scaleType="center" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_origin_view" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_toolbar_page_actions" + app:layout_constraintTop_toTopOf="parent" /> + + <!-- Page actions --> + + <mozilla.components.browser.toolbar2.internal.ActionContainer + android:id="@+id/mozac_browser_toolbar_page_actions" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:layout_marginTop="4dp" + android:scaleType="center" + app:layout_constraintEnd_toEndOf="@+id/mozac_browser_toolbar_background" + app:layout_constraintTop_toTopOf="parent" + mozac:actionContainerItemSize="48dp" + tools:layout_width="48dp" /> + + <!-- Browser Actions --> + + <mozilla.components.browser.toolbar2.internal.ActionContainer + android:id="@+id/mozac_browser_toolbar_browser_actions" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:layout_marginTop="4dp" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_toolbar_menu" + app:layout_constraintTop_toTopOf="parent" + mozac:actionContainerItemSize="48dp" + tools:layout_width="48dp" /> + + <!-- Menu --> + + <mozilla.components.browser.menu.view.MenuButton + android:id="@+id/mozac_browser_toolbar_menu" + android:layout_width="36dp" + android:layout_height="48dp" + android:layout_marginTop="4dp" + android:background="?android:attr/selectableItemBackgroundBorderless" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <!-- Progress Bar --> + + <ProgressBar + android:id="@+id/mozac_browser_toolbar_progress" + style="?android:attr/progressBarStyleHorizontal" + android:layout_width="0dp" + android:layout_height="@dimen/mozac_browser_toolbar_progress_bar_height" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + +</mozilla.components.browser.toolbar2.display.DisplayToolbarView> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_edittoolbar.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_edittoolbar.xml new file mode 100644 index 0000000000..3325cd099f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/layout/mozac_browser_toolbar_edittoolbar.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<androidx.constraintlayout.widget.ConstraintLayout + android:id="@+id/mozac_browser_toolbar_container" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:mozac="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:orientation="vertical" + android:layout_height="56dp"> + + <ImageView + android:id="@+id/mozac_browser_toolbar_background" + android:layout_width="0dp" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:importantForAccessibility="no" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/mozac_browser_toolbar_edit_icon" + android:layout_width="40dp" + android:layout_height="40dp" + android:scaleType="center" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="@id/mozac_browser_toolbar_background" + app:srcCompat="@drawable/mozac_ic_search_24" + android:visibility="gone" + tools:ignore="ContentDescription" + android:layout_marginTop="8dp" /> + + <mozilla.components.browser.toolbar2.internal.ActionContainer + android:id="@+id/mozac_browser_toolbar_edit_actions_start" + android:layout_width="wrap_content" + android:layout_height="40dp" + android:layout_marginTop="8dp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toEndOf="@id/mozac_browser_toolbar_edit_icon" + mozac:actionContainerItemSize="56dp" + tools:layout_width="56dp" /> + + <mozilla.components.ui.autocomplete.InlineAutocompleteEditText + android:id="@+id/mozac_browser_toolbar_edit_url_view" + android:layout_width="0dp" + android:layout_marginTop="8dp" + android:layout_height="40dp" + android:width="100dp" + android:height="100dp" + android:imeOptions="actionGo|flagNoExtractUi|flagNoFullscreen" + android:inputType="textUri|text" + android:lines="1" + android:gravity="center_vertical" + android:background="#00000000" + android:textSize="15sp" + app:layout_goneMarginStart="8dp" + app:layout_constraintStart_toEndOf="@id/mozac_browser_toolbar_edit_actions_start" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_toolbar_erase_view" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/mozac_browser_toolbar_erase_view" + android:layout_width="44dp" + android:layout_height="44dp" + android:contentDescription="@string/mozac_clear_button_description" + android:scaleType="center" + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_20" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_edit_url_view" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_action_separator" + app:layout_constraintTop_toTopOf="parent" /> + + <View + android:id="@+id/mozac_browser_action_separator" + android:layout_width="@dimen/mozac_browser_toolbar_page_action_separator_width" + android:layout_height="40dp" + android:layout_marginTop="8dp" + android:visibility="gone" + android:importantForAccessibility="no" + android:scaleType="center" + app:layout_constraintStart_toEndOf="@+id/mozac_browser_toolbar_erase_view" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_toolbar_edit_actions_end" + app:layout_constraintTop_toTopOf="parent" /> + + <mozilla.components.browser.toolbar2.internal.ActionContainer + android:id="@+id/mozac_browser_toolbar_edit_actions_end" + android:layout_width="wrap_content" + android:layout_height="40dp" + android:layout_marginTop="8dp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toStartOf="@id/mozac_browser_toolbar_clear_view" + mozac:actionContainerItemSize="40dp" + tools:layout_width="48dp" /> + + <ImageView + android:id="@+id/mozac_browser_toolbar_clear_view" + android:layout_width="40dp" + android:layout_height="40dp" + android:width="100dp" + android:height="100dp" + android:contentDescription="@string/mozac_clear_button_description" + android:scaleType="center" + app:srcCompat="@drawable/mozac_ic_cross_circle_fill_24" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="@+id/mozac_browser_toolbar_background" + app:layout_constraintTop_toTopOf="parent" /> + +</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-am/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-am/strings.xml new file mode 100644 index 0000000000..eda99f879b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-am/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ምናሌ</string> + <string name="mozac_clear_button_description">አጽዳ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">የመከታተያ ጥበቃ በርቷል</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">የክትትል ጥበቃ መከታተያዎችን አግዷል</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">የክትትል ጥበቃ ለዚህ ድረ-ገፅ ጠፍቷል</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">የድረ-ገፅ መረጃ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">በመጫን ላይ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">አንዳንድ ይዘቶች በራስ አጫውት ቅንብር ታግደዋል</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-an/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-an/strings.xml new file mode 100644 index 0000000000..14b40de38e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-an/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <string name="mozac_clear_button_description">Borrar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protección contra seguimiento ye activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Las protección contra seguimiento ha blocau elementos de seguimiento</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protección de seguimiento ye desactivada en este puesto</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información d’o puesto</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Se ye cargando</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ar/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000000..a4a01aa836 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ar/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">القائمة</string> + <string name="mozac_clear_button_description">امسح</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">الحماية من التعقّب مفعّلة</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">حجبت الحماية من التعقّب بعض المتعقّبات</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">عُطّلت الحماية من التعقب في هذا الموقع</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">معلومات الموقع</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">يُحمّل</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">حجب إعداد التشغيل التلقائي بعض المحتوى</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ast/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ast/strings.xml new file mode 100644 index 0000000000..6cb4e96a9a --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ast/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <string name="mozac_clear_button_description">Borrar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La proteición antirrastrexu ta activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La proteición antirrastrexu bloquió rastrexadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La proteición antirrastrexu ta desactivada nesti sitiu</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitiu</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">La configuración de la reproducción automática bloquió parte del conteníu</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-az/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-az/strings.xml new file mode 100644 index 0000000000..0ccb692a99 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-az/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menyu</string> + <string name="mozac_clear_button_description">Təmizlə</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">İzlənmə Qoruması açıqdır</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">İzlənmə Qoruması izləyiciləri əngəllədi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">İzlənmə Qoruması bu sayt üçün sönülüdür</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sayt məlumatları</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Yüklənir</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-azb/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-azb/strings.xml new file mode 100644 index 0000000000..d2901fff35 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-azb/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">منو</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">پوز</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ایزلهمه قورونماسی آچیقدیر</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">تعقیب قوروماسی تعقیبچیلری مسدود ائدیپدیر</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">بو سایت اوچون ایزلهمه قورونماسی باغلیدیر.</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">سایت بیلگیلری</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">دولور</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">بعضی محتوا اتوْماتیکچال تنظیمی ایله بلوْکلانیب</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ban/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ban/strings.xml new file mode 100644 index 0000000000..037114093f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ban/strings.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Puyung</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Jantosang dumun</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-be/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-be/strings.xml new file mode 100644 index 0000000000..5042e0d03d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-be/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Ачысціць</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ахова ад сачэння ўключана</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ахова ад сачэння заблакавала трэкеры</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ахова ад сачэння выключана на гэтым сайце</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Інфармацыя пра сайт</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Загрузка</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Некаторае змесціва было заблакавана наладамі аўтапрайгравання</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bg/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bg/strings.xml new file mode 100644 index 0000000000..6f6d6ecbe0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bg/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Изчистване</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Защита от проследяване включена</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Защитата от проследяване е спряла проследяване</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Защитата от проследяване е изключена за сайта</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Показване на информация за сайта</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Зареждане</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Част от съдържанието е спряно от настройките за автоматично възпроизвеждане</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bn/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bn/strings.xml new file mode 100644 index 0000000000..8c93a8c6e7 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bn/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">মেনু</string> + <string name="mozac_clear_button_description">পরিষ্কার করুন</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ট্র্যাকিং সুরক্ষা চালু আছে</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ট্র্যাকিং সুরক্ষা ট্র্যাকারদের অবরুদ্ধ করেছে</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">এই সাইটের জন্য ট্র্যাকিং সুরক্ষা বন্ধ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">সাইটের তথ্য</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">লোড হচ্ছে</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">কিছু বিষয়বস্তু অটোপ্লে সেটিং দ্বারা ব্লক করা হয়েছে</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-br/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-br/strings.xml new file mode 100644 index 0000000000..c5f9c203fd --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-br/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Lañser</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Skarzhañ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Gweredekaet eo ar gware heuliañ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Stanket ez eus bet heulierien gant ar gwarez heuliañ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Diweredekaet eo bet ar gwarez heuliañ evit al lecʼhienn-mañ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Titouroù al lecʼhienn</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">O kargañ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Elfennoù ’zo a zo bet stanket gant arventenn al lenn emgefreek</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bs/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bs/strings.xml new file mode 100644 index 0000000000..473bf58af2 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-bs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meni</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Očisti</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Zaštita od praćenja uključena</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Zaštita od praćenja je blokirala pratioce</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Zaštita od praćenja je isključena za ovu stranicu</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informacije o stranici</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Učitavanje</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Neki sadržaj je blokiran postavkom automatske reprodukcije</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ca/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ca/strings.xml new file mode 100644 index 0000000000..44f350dcf2 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ca/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <string name="mozac_clear_button_description">Esborra</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protecció contra el seguiment està activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protecció contra el seguiment ha blocat elements de seguiment coneguts</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">S’ha desactivat la protecció contra el seguiment per a aquest lloc</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informació del lloc</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">S’està carregant</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Una part del contingut s’ha blocat per la configuració de la reproducció automàtica</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cak/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cak/strings.xml new file mode 100644 index 0000000000..ae15567dc0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cak/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">K\'utsamaj</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Tijosq\'ïx</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tzijïl ri Chajinïk Chuwäch Ojqanïk</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Eruq\'aton ojqanela\' ri i Chajinïk chuwäch Ojqanïk</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Chupül ri Chajinïk chuwäch Ojqanem pa re ruxaq re\'</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Rutzijol ruxaq</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Nusamajij</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Jun peraj chi re ri rupam xq\'at ruma ri runuk\'ulem ri ruyon nitzij</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ceb/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ceb/strings.xml new file mode 100644 index 0000000000..4a03205a32 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ceb/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Panas</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ang Tracking Protection on</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ang Tracking Protection nibara ug tracker</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Wala\'y Tracking Protection ani nga site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Detalye sa site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Loading</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Ang uban content gibara sa setting sa autoplay</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ckb/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ckb/strings.xml new file mode 100644 index 0000000000..95e99bea91 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ckb/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">پێڕست</string> + <string name="mozac_clear_button_description">پاککردنەوە</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">پارێزگاری لە چاودێری کارایە</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">پارێزگاری چاودێری توانی چەند چاودێریکەرێک بلۆک بکات</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">پارێزگاری لە چاودێری ناکارایە بۆ ئەم ماڵپەڕە</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">زانیاری ماڵپەڕ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">باردەکرێت</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">هەندێک ناوەڕۆک بلۆک کران لە لایەن ڕێکخستنی خۆپێکردنەوە</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-co/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-co/strings.xml new file mode 100644 index 0000000000..2a309bb0b3 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-co/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Listinu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Squassà</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">A prutezzione contr’à u spiunagiu hè attivata</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A prutezzione contr’à u spiunagiu hà bluccatu perseguitatori</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A prutezzione contr’à u spiunagiu hè disattivata per stu situ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Infurmazioni nant’à u situ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Caricamentu in corsu</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Certi cuntenuti sò stati bluccati da a preferenza di lettura autumatica</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cs/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cs/strings.xml new file mode 100644 index 0000000000..a2c3e0d17a --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cs/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Nabídka</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Vymazat</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ochrana proti sledování je zapnuta</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ochrana proti sledování zablokovala sledovací prvky</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ochrana proti sledování je pro tento web vypnuta</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informace o stránce</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Načítání</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Část obsahu byla zablokována nastavením automatického přehrávání</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cy/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cy/strings.xml new file mode 100644 index 0000000000..3689bb4004 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-cy/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Dewislen</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Clirio</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Mae Diogelwch rhag Tracio ymlaen</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Mae Diogelwch rhag Tracio wedi rhwystro tracwyr</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Mae Diogelwch rhag Tracio wedi ei ddiffodd ar gyfer y wefan hon</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Manylion y wefan</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Llwytho</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Mae rhywfaint o gynnwys wedi’i rwystro gan osodiadau awtochwarae</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-da/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-da/strings.xml new file mode 100644 index 0000000000..b8d4ba146f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-da/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Ryd</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Beskyttelse mod sporing er slået til</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Beskyttelse mod sporing har blokeret sporings-tjenester</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Beskyttelse mod sporing er slået fra for dette websted</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Information om webstedet</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Indlæser</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Noget indhold er blevet blokeret af indstillingen for automatisk afspilning</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-de/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-de/strings.xml new file mode 100644 index 0000000000..2db37ddfd5 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-de/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menü</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Leeren</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Schutz vor Aktivitätenverfolgung ist an</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Der Tracking-Schutz hat Tracker blockiert</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Der Tracking-Schutz ist für diese Website deaktiviert</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Seiteninformation</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Wird geladen…</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Einige Inhalte wurden durch die Einstellung zur automatischen Wiedergabe blockiert</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-dsb/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-dsb/strings.xml new file mode 100644 index 0000000000..5f13b6571d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-dsb/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meni</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Lašowaś</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Slědowański šćit jo zašaltowany</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Slědowański šćit jo blokěrował pśeslědowaki</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Slědowański šćit jo něnto znjemóžnjony za toś to sedło</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sedłowe informacije</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Zacytujo se</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Někake wopśimjeśe jo se pśez wótgrawańske nastajenje zablokěrował</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-el/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-el/strings.xml new file mode 100644 index 0000000000..8960320249 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-el/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Μενού</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Απαλοιφή</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Η προστασία από καταγραφή είναι ενεργή</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Η προστασία από καταγραφή έχει αποκλείσει ιχνηλάτες</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Η προστασία από καταγραφή είναι ανενεργή για τον ιστότοπο</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Πληροφορίες ιστοτόπου</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Φόρτωση</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Ορισμένο περιεχόμενο έχει αποκλειστεί από τη ρύθμιση αυτόματης αναπαραγωγής</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rCA/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rCA/strings.xml new file mode 100644 index 0000000000..29866e8096 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rCA/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Clear</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tracking Protection is on</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Tracking Protection has blocked trackers</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Tracking Protection is off for this site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Site information</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Loading</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Some content has been blocked by the autoplay setting</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rGB/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rGB/strings.xml new file mode 100644 index 0000000000..29866e8096 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-en-rGB/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Clear</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tracking Protection is on</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Tracking Protection has blocked trackers</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Tracking Protection is off for this site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Site information</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Loading</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Some content has been blocked by the autoplay setting</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eo/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eo/strings.xml new file mode 100644 index 0000000000..5f31034648 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eo/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menuo</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Viŝi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Protekto kontraŭ spurado ŝaltita</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protekto kontraŭ spurado blokis spurilojn</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Protekto kontraŭ spurado malŝaltita por tiu ĉi retejo</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informo pri retejo</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ŝargado</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Parto de la enhavo estis blokita de la agordo pri aŭtomata ludado</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rAR/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rAR/strings.xml new file mode 100644 index 0000000000..d5fa1f30f0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rAR/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpiar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protección contra rastreo está habilitada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protección contra rastreo bloqueó los rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protección de rastreo está deshabilitada para este sitio</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Se bloquearon algunos contenidos debido a la configuración de reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rCL/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rCL/strings.xml new file mode 100644 index 0000000000..107843b536 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rCL/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpiar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Protección de seguimiento activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La Protección de seguimiento ha bloqueado rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Protección de seguimiento desactivada para este sitio</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Algunos contenidos han sido bloqueados por los ajustes de reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rES/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rES/strings.xml new file mode 100644 index 0000000000..9c4263b840 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rES/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpiar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protección contra rastreo está activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protección contra rastreo ha bloqueado rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protección contra rastreo está desactivada para este sitio web</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Algunos contenidos han sido bloqueados por los ajustes de reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rMX/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rMX/strings.xml new file mode 100644 index 0000000000..cd4388769d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es-rMX/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <string name="mozac_clear_button_description">Limpiar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protección contra rastreo está activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protección contra rastreo ha bloqueado rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protección contra rastreo está desactivada para este sitio</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Parte del contenido ha sido bloqueado por la configuración de reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es/strings.xml new file mode 100644 index 0000000000..9c4263b840 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-es/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpiar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protección contra rastreo está activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protección contra rastreo ha bloqueado rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protección contra rastreo está desactivada para este sitio web</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información del sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Algunos contenidos han sido bloqueados por los ajustes de reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-et/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-et/strings.xml new file mode 100644 index 0000000000..7fb1096fd7 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-et/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menüü</string> + <string name="mozac_clear_button_description">Tühjenda</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Jälitamisvastane kaitse on sees</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Jälitamisvastane kaitse on jälitajaid blokkinud</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Täiustatud jälitamisvastane kaitse on sellel saidil väljas</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Saidi teave</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Laadimine</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Osa sisu on automaatse esitamise sättega blokitud</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eu/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eu/strings.xml new file mode 100644 index 0000000000..fb0520f183 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-eu/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menua</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Garbitu</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Jarraipenaren babesa gaituta dago</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Jarraipenaren babesak jarraipen-elementuak blokeatu ditu</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Jarraipenaren babesa desgaituta dago webgune honetarako</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Gunearen informazioa</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Kargatzen</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Eduki batzuk blokeatu egin dira erreprodukzio automatikoko ezarpenetan oinarrituta</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fa/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fa/strings.xml new file mode 100644 index 0000000000..f381a2069f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fa/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">منو</string> + <string name="mozac_clear_button_description">پاک کردن</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">حفاظت در برابر ردیابی روشن است</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">حفاظت در برابر ردیابی، ردیابها را مسدود کرده است</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">حفاظت در برابر ردیابی برای این پایگاه خاموش است</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">اطلاعات پایگاه</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">در حال بار کردن</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">برخی از محتواها توسط تنظیمات پخش خودکار مسدود شدهاند</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ff/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ff/strings.xml new file mode 100644 index 0000000000..b774316dfb --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ff/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Dosol</string> + <string name="mozac_clear_button_description">Momtu</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ndeenka Dewindol nani e</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ndeenka Dewindol faliima rewindotooɓe</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ndeenka Dewindol ko ko ñifi e ndee lowre</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Humpito lowre</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Nana loowa</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fi/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fi/strings.xml new file mode 100644 index 0000000000..b47d8af7bc --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fi/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Valikko</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Tyhjennä</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Seurannan suojaus on päällä</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Seurannan suojaus on estänyt seuraimia</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Seurannan suojaus ei ole käytössä tällä sivustolla</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sivustotiedot</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ladataan</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Automaattisen toiston asetus on estänyt osan sisällöstä</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fr/strings.xml new file mode 100644 index 0000000000..072941bc03 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Effacer</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protection contre le pistage est activée</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protection contre le pistage a bloqué des traqueurs</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protection contre le pistage est désactivée pour ce site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informations sur le site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Chargement en cours</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Certains contenus ont été bloqués par le paramètre de lecture automatique</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fur/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fur/strings.xml new file mode 100644 index 0000000000..19900e6bc0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fur/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menù</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Nete</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protezion da lis spiis e je ative</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protezion da lis spiis e à blocât spiis</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protezion da lis spiis e je disativade par chest sît</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informazions sît</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Daûr a cjamâ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Cualchi contignût al è stât blocât de impostazion pe riproduzion automatiche</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fy-rNL/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fy-rNL/strings.xml new file mode 100644 index 0000000000..9aca189901 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-fy-rNL/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Wiskje</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Beskerming tsjin folgjen is ynskeakele</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Beskerming tsjin folgjen hat trackers blokkearre</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Beskerming tsjin folgjen is út foar dizze website</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Website-ynformaasje</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Lade</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Guon ynhâld is blokkearre troch de ynstelling foar automatysk ôfspyljen</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ga-rIE/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ga-rIE/strings.xml new file mode 100644 index 0000000000..ba4f41d62f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ga-rIE/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Roghchlár</string> + <string name="mozac_clear_button_description">Bánaigh</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tá Cosaint ar Lorgaireacht ar siúl</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Chuir Cosaint ar Lorgaireacht cosc ar lorgairí</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Tá Cosaint ar Lorgaireacht múchta don suíomh seo</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Eolas faoin suíomh</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Á lódáil</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gd/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gd/strings.xml new file mode 100644 index 0000000000..d694698b3d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gd/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Clàr-taice</string> + <string name="mozac_clear_button_description">Falamhaich</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tha an dìon o thracadh air</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Bhac gleus an dìon o thracadh tracaichean</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Tha an dìon o thracadh dheth air an làrach seo</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Fiosrachadh mun làrach</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ga luchdadh</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Chaidh cuid dhen t-susbaint a bhacadh an cois roghainn na fèin-chluich</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gl/strings.xml new file mode 100644 index 0000000000..990d910d08 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Borrar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Protección contra o rastrexo activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A protección contra o rastrexo bloqueou rastrexadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A protección contra o rastrexo está desactivada para este sitio</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Información sobre o sitio</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">A configuración de reprodución automática bloqueou algúns contidos</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gn/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gn/strings.xml new file mode 100644 index 0000000000..7798e540da --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gn/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Poravorã</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Mopotĩ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tapykuehoha ñemo’ã oñemyandy</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ñemo’ã jehekaha ojoko tapykuehohápe</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ñemo’ã jehekaha ndoikovéima ko tendápe g̃uarã</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Marandu tenda rehegua</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Henyhẽhína</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Ojejoko ndahetái tetepy ñemboheta ijeheguíva ñemboheko rupive</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gu-rIN/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000000..a6ff2d26b0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-gu-rIN/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">મેનુ</string> + <string name="mozac_clear_button_description">સાફ કરો</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ટ્રેકિંગ સુરક્ષા ચાલુ છે</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ટ્રેકિંગ સુરક્ષા દ્વારા ટ્રેકર્સને અવરોધિત કરવામાં આવ્યા છે</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">આ સાઇટ માટે ટ્રેકિંગ સુરક્ષા બંધ છે</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">સાઇટ માહિતી</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">લોડ કરી રહ્યું છે</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hi-rIN/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hi-rIN/strings.xml new file mode 100644 index 0000000000..2d3c7d9b42 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hi-rIN/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">मेन्यू</string> + <string name="mozac_clear_button_description">साफ करें</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ट्रैकिंग सुरक्षा चालू है</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ट्रैकिंग सुरक्षा ने ट्रैकरों को अवरुद्ध कर दिया है</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">इस साइट के लिए ट्रैकिंग सुरक्षा बंद है</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">साइट सूचना</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">लोड हो रहा है</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hil/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hil/strings.xml new file mode 100644 index 0000000000..b02bc03a94 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hil/strings.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Klaro</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Loading</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hr/strings.xml new file mode 100644 index 0000000000..420583468b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hr/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Izbornik</string> + <string name="mozac_clear_button_description">Izbriši</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Zaštita od praćenja je uključena</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Zaštita od praćenja je blokirala programe za praćenje</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Zaštita od praćenja je isključena za ovu stranicu</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informacije o web mjestu</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Učitavanje</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Neki sadržaji su blokirani zbog postavki automatske reprodukcije</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hsb/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hsb/strings.xml new file mode 100644 index 0000000000..2c03305e16 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hsb/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meni</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Zhašeć</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Slědowanski škit je zmóžnjeny</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Slědowanski škit je přesćěhowaki blokował</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Slědowanski škit je znjemóžnjeny za tute sydło</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sydłowe informacije</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Začituje so</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Někajki wobsah je so přez wothrawanske nastajenje zablokował</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hu/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hu/strings.xml new file mode 100644 index 0000000000..eef3c81920 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hu/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menü</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Törlés</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Követés elleni védelem bekapcsolva</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A követés elleni védelem nyomkövetőket blokkolt</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A követés elleni védelem le van tiltva ezen az oldalon</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Oldalinformációk</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Betöltés</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Bizonyos tartalmakat letiltott az automatikus lejátszási beállítás</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hy-rAM/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hy-rAM/strings.xml new file mode 100644 index 0000000000..668ae3425c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-hy-rAM/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Ցանկ</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Մաքրել</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Հետագծման պաշտպանությունը միաց. է</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Հետագծման պաշտպանությունն արգելափակել է հետագծիչները</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Հետագծման պաշտպանությունն անջ. է այս կայքի համար</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Կայքի տեղեկատվություն</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Բեռնում</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Որոշ բովանդակություն արգելափակվել է ինքնանվագարկման կարգավորումով</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ia/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ia/strings.xml new file mode 100644 index 0000000000..8a27cf8a5a --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ia/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Vacuar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Protection contra le traciamento active</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Le protection contra le traciamento ha blocate traciatores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Le protection contra le traciamento es disactivate pro iste sito</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informationes del sito</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargamento</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Alcun contento ha essite blocate per le parametros del reproduction automatic</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-in/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-in/strings.xml new file mode 100644 index 0000000000..2d7074c6ba --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-in/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Bersihkan</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Perlindungan Pelacakan aktif</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Perlindungan Pelacakan telah memblokir pelacak</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Perlindungan Pelacakan dinonaktifkan untuk situs ini</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informasi situs</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Memuat</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Beberapa konten telah diblokir dengan pengaturan putar-otomatis</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-is/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-is/strings.xml new file mode 100644 index 0000000000..653bc2c4d0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-is/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Valmynd</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Hreinsa</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Vörn gegn gagnasöfnun virk</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Vörn gegn gagnasöfnun hefur lokað á rekjara</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Vörn gegn gagnasöfnun er ekki virk fyrir þetta svæði</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Upplýsingar um vefsvæði</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Hleður</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Lokað hefur verið sumt efni með stillingum fyrir sjálfvirka afspilun</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-it/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-it/strings.xml new file mode 100644 index 0000000000..33d9f28220 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-it/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Cancella</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protezione antitracciamento è attiva</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protezione antitracciamento ha bloccato contenuti traccianti</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protezione antitracciamento è disattivata per questo sito</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informazioni sito</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Caricamento…</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Alcuni contenuti sono stati bloccati dall’impostazione per la riproduzione automatica</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-iw/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-iw/strings.xml new file mode 100644 index 0000000000..51477ead53 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-iw/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">תפריט</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">ניקוי</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">הגנת מעקב פעילה</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">הגנת מעקב חסמה רכיבי מעקב</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">הגנת מעקב כבויה עבור אתר זה</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">פרטי האתר</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">בטעינה</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">תוכן מסויים נחסם על־ידי ההגדרה של הניגון האוטומטי</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ja/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ja/strings.xml new file mode 100644 index 0000000000..4707063495 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ja/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">メニュー</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">消去</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">トラッキング防止はオンです</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">トラッキング防止によりトラッカーをブロックしました</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">このサイトではトラッキング防止がオフです</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">サイト情報</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">読み込み中</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">一部のコンテンツは自動再生設定によってブロックされています</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ka/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ka/strings.xml new file mode 100644 index 0000000000..bf438a8ed7 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ka/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">მენიუ</string> + <string name="mozac_clear_button_description">გასუფთავება</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">თვალთვალისგან დაცვა ჩართულია</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">თვალთვალისგან დაცვამ შეზღუდა მეთვალყურეები</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">თვალთვალისგან დაცვა გამორთულია ამ საიტზე</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">საიტის მონაცემები</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">იტვირთება</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ზოგიერთი მასალა შეიზღუდა თვითგაშვების პარამეტრებით</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kaa/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kaa/strings.xml new file mode 100644 index 0000000000..e4ad1073b0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kaa/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menyu</string> + <string name="mozac_clear_button_description">Tazalaw</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Baqlaw qorǵanıwı qosılǵan</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Baqlaw qorǵanıw funkciyası trekkerlerdi blokladı</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Bul sayt ushın baqlaw qorǵanıwı óshirilgen</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sayt maǵlıwmatları</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Júklenbekte</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Ayrım kontentler avtomatik sazlawlar tárepinen bloklanǵan</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kab/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kab/strings.xml new file mode 100644 index 0000000000..034ec09580 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kab/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Umuɣ</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Sfeḍ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ammesten mgal aḍfaṛ yermed</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ammesten mgal aḍfaṛ yessewḥel ineḍfaṛen</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ammesten mgal aḍfaṛ insa akka tura i usmel-a</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Asmel n telɣut</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Asali</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Yettusewḥel kra n yigburen s aɣewwar n tɣuri tawurmant</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kk/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kk/strings.xml new file mode 100644 index 0000000000..17b7710fac --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kk/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Мәзір</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Тазарту</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Бақылаудан қорғаныс іске қосулы</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Бақылаудан қорғаныс трекерлерді бұғаттады</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Бақылаудан қорғаныс бұл сайт үшін сөндірілген</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Сайт ақпараты</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Жүктелуде</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Кейбір құрама автоойнату баптауларымен бұғатталған</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kmr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kmr/strings.xml new file mode 100644 index 0000000000..29542924a0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kmr/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menû</string> + <string name="mozac_clear_button_description">Paqij bike</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Parastina ji Şopandinê vekirî ye</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Parastina ji şopandinê şopdar asteng kirin</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Parastina ji şopadinê, ji bo vê malperê girtî ye</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Agahiyên malperê</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Tê barkirin</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Hin naverok ji aliyê eyara lêdana-otomatîk ve hatin astengkirin</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kn/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kn/strings.xml new file mode 100644 index 0000000000..ec07a646a6 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-kn/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ಪರಿವಿಡಿ</string> + <string name="mozac_clear_button_description">ಅಳಿಸು</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ಜಾಡು ಇರಿಸುವಿಕೆ ಇಂದ ರಕ್ಷಣೆ ಶುರುವಾಗಿದೆ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ಟ್ರ್ಯಾಕಿಂಗ್ ಪ್ರೊಟೆಕ್ಷನ್ ಟ್ರ್ಯಾಕರ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ಈ ಸೈಟ್ಗಾಗಿ ಟ್ರ್ಯಾಕಿಂಗ್ ಪ್ರೊಟೆಕ್ಷನ್ ಆಫ್ ಆಗಿದೆ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ತಾಣದ ಮಾಹಿತಿ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ಲೋಡ್ ಆಗುತ್ತಿದೆ</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ko/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ko/strings.xml new file mode 100644 index 0000000000..ff3fcf3bcc --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ko/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">메뉴</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">지우기</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">추적 방지 기능이 켜져 있음</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">추적 방지 기능이 추적기를 차단함</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">이 사이트에 추적 방지 기능이 꺼져 있음</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">사이트 정보</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">로드 중</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">자동 재생 설정에 의해 일부 콘텐츠가 차단되었습니다.</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ldrtl/dimens.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ldrtl/dimens.xml new file mode 100644 index 0000000000..a36c7c4366 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ldrtl/dimens.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<resources> + <!-- DisplayToolbar --> + <dimen name="mozac_browser_toolbar_origin_padding_end">16dp</dimen> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lij/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lij/strings.xml new file mode 100644 index 0000000000..31fd025526 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lij/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menû</string> + <string name="mozac_clear_button_description">Scancella</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Proteçion anti-traciamento açeiza</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A proteçion anti-traciamento a l\'à blocou di traciatoî</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A proteçion anti-traciamento a l\'é asmortâ pe sto scito</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informaçioin do scito</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Carego</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lo/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lo/strings.xml new file mode 100644 index 0000000000..d9327a731d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lo/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ເມນູ</string> + <string name="mozac_clear_button_description">ລົບລ້າງ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ການປ້ອງກັນການຕິດຕາມກຳລັງເປີດຢູ່</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ການປ້ອງກັນການຕິດຕາມໄດ້ບັອກຕົວຕິດຕາມ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ການປ້ອງກັນການຕິດຕາມໄດ້ປິດສຳລັບເວັບໄຊທນີ້</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ຂໍ້ມູນເວັບໄຊ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ກຳລັງໂຫລດ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ເນື້ອຫາບາງອັນຖືກບລັອກໂດຍການຕັ້ງຄ່າການຫຼີ້ນອັດຕະໂນມັດ</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lt/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lt/strings.xml new file mode 100644 index 0000000000..433b57f18e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-lt/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meniu</string> + <string name="mozac_clear_button_description">Išvalyti</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Apsauga nuo stebėjimo įjungta</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Apsaugo nuo stebėjimo užblokavo stebėjimo elementus</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Apsauga nuo stebėjimo šioje svetainėje išjungta</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Svetainės informacija</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Įkeliama</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Dalį turinio užblokavo automatinio grojimo nuostatos</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mix/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mix/strings.xml new file mode 100644 index 0000000000..1636f653d5 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mix/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Katsi</string> + <string name="mozac_clear_button_description">Ku^un</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Chika va^a ña sau</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Chika va^a ña sau</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Chika va^a ña sau nu pagina yo^o </string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Tu^tu sitio yo^o</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Sachuin</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Ma ku kunu ña ku reproducción automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ml/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ml/strings.xml new file mode 100644 index 0000000000..9f376452a4 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ml/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">മെനു</string> + <string name="mozac_clear_button_description">മായ്ക്കുക</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ട്രാക്കിങ്ങ് സംരക്ഷണം ഓൺ ആണ്</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ട്രാക്കിംഗ് സംരക്ഷണം ട്രാക്കറുകളെ തടഞ്ഞു</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ഈ സൈറ്റിന് ട്രാക്കിംഗ് പരിരക്ഷ ഇപ്പോൾ ഓഫാണ്</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">സൈറ്റ് വിവരങ്ങള്</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ലഭ്യമാക്കുന്നു</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mr/strings.xml new file mode 100644 index 0000000000..5430ce7327 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-mr/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">मेनू</string> + <string name="mozac_clear_button_description">साफ करा</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ट्रॅकिंग संरक्षण चालू आहे</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ट्रॅकिंग संरक्षणने ट्रॅकर्स अवरोधित केले आहेत</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">या साइटसाठी ट्रॅकिंग संरक्षण बंद आहे</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">साईट माहिती</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">लोड होत आहे</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-my/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-my/strings.xml new file mode 100644 index 0000000000..006be61ee2 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-my/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">စာရင်း</string> + <string name="mozac_clear_button_description">ရှင်းလင်းပါ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ခြေရာခံကာကွယ်မှုကို ဖွင့်ထားသည်</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ခြေရာခံကာကွယ်မှုသည် ခြေရာခံသူများကိုပိတ်ဆို့ထားသည်။</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ဒီ site အတွက်အကာအကွယ်ပေးမှုကိုပိတ်ထားသည်</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ဆိုက်အချက်အလက်</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">အလုပ်လုပ်နေတယ်</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">အလိုအလျောက်ဖွင့်ခြင်း ဆက်တင်မှ အကြောင်းအရာအချို့အား ပိတ်ထားသည်။</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nb-rNO/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nb-rNO/strings.xml new file mode 100644 index 0000000000..9d9bcbfc13 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nb-rNO/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meny</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Tøm</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Sporingsbeskyttelse er på</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Sporingsbeskyttelse har blokkert sporere</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Sporingsbeskyttelse er slått av for dette nettstedet</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informasjon om nettstedet</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Laster</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Noe av innholdet er blokkert av autoavspillings-innstillingene</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ne-rNP/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ne-rNP/strings.xml new file mode 100644 index 0000000000..6a4341aafd --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ne-rNP/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">मेनु</string> + <string name="mozac_clear_button_description">खाली गर्नुहोस्</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ट्र्याकिंग संरक्षण सक्रिय छ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ट्र्याकिङ्ग सुरक्षाले ट्रयाकरहरुलाई रोकेको छ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">हाल यस साइटको लागी ट्रयाकिङ् सुरक्षा बन्द गरिएको छ।</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">साइट जानकारी</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">लोड हुँदैछ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">केहि सामग्री स्वतः प्ले सेटिङ्ग द्वारा रोकिएको छ</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nl/strings.xml new file mode 100644 index 0000000000..fee481b12f --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Wissen</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Bescherming tegen volgen is ingeschakeld</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Bescherming tegen volgen heeft trackers geblokkeerd</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Bescherming tegen volgen is uit voor deze website</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Website-informatie</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Laden</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Sommige inhoud is geblokkeerd door de instelling voor automatisch afspelen</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nn-rNO/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nn-rNO/strings.xml new file mode 100644 index 0000000000..c77b3373d0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-nn-rNO/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meny</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Tøm</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Sporingsvern er på</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Sporingsvern har blokkert sporarar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Sporingsvern er slått av for denne nettstaden</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informasjon om nettstaden</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Lastar</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Noko innhald har vorte blokkert av autoavspelings-innstillingane</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-oc/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-oc/strings.xml new file mode 100644 index 0000000000..d2a72f26c1 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-oc/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menú</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Escafar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La proteccion contra lo seguiment es activada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La proteccion contra lo seguiment a blocat de traçadors</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La proteccion contra lo seguiment es desactivada per aqueste site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informacions del site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargament</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Una part del contengut es estada blocada per la configuracion de la lectura automatica</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-or/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-or/strings.xml new file mode 100644 index 0000000000..9ca67e8959 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-or/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ମେନୁ</string> + <string name="mozac_clear_button_description">ଖାଲି କରନ୍ତୁ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ଟ୍ରାକିଂ ସୁରକ୍ଷା ଚାଲୁଛି</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ଟ୍ରାକିଂ ସୁରକ୍ଷା ଟ୍ରାକରଗୁଡ଼ିକୁ ରୋକି ଦେଇଛି</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ଟ୍ରାକିଂ ସୁରକ୍ଷା ଏହି ସାଇଟ ପାଇଁ ବନ୍ଦ ଅଛି</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ସାଇଟ ସୂଚନା</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ଧାରଣ କରୁଅଛି</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rIN/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rIN/strings.xml new file mode 100644 index 0000000000..10a68745b3 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rIN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ਮੇਨੂ</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">ਸਾਫ਼ ਕਰੋ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ਟਰੈਕ ਕਰਨ ਤੋਂ ਸੁਰੱਖਿਆ ਚਾਲੂ ਹੈ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਟਰੈਕਾਂ ਉੱਤੇ ਪਾਬੰਦੀ ਲਗਾਉਂਦੀ ਹੈ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ਇਸ ਸਾਈਟ ਲਈ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ਸਾਈਟ ਜਾਣਕਾਰੀ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ਲੋਡ ਹੋ ਰਿਹਾ ਹੈ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ਕੁਝ ਸਮੱਗਰੀ ਨੂੰ ਆਪੇ-ਪਲੇਅ ਦੀ ਸੈਟਿੰਗ ਰਾਹੀਂ ਪਾਬੰਦੀ ਲਾਈ ਹੈ</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rPK/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rPK/strings.xml new file mode 100644 index 0000000000..f48af403b2 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pa-rPK/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">مینو</string> + <string name="mozac_clear_button_description">صاف کرو</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ٹوہ لاوݨ توں سرکھیا چالو اے</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ٹوہ لاوݨ توں کجھ روک لاۓ گئے ہن</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ٹوہ لاوݨ توں سرکھیا بند ہو گیا</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">سائٹ جاݨکاری</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">لوڈ کیتا جا رہا اے</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">خود بخود چلݨ نال کجھ وستوآں روکے گئے</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pl/strings.xml new file mode 100644 index 0000000000..083dfd9aa9 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Wyczyść</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ochrona przed śledzeniem jest włączona</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ochrona przed śledzeniem zablokowała elementy śledzące</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ochrona przed śledzeniem jest wyłączona na tej witrynie</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informacje o witrynie</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Wczytywanie</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Część treści została zablokowana przez ustawienie automatycznego odtwarzania</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rBR/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000000..135bacdc26 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Proteção contra rastreamento ativada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A proteção contra rastreamento bloqueou rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A proteção contra rastreamento está desativada neste site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informações do site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Carregando</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Algum conteúdo foi bloqueado pela configuração de reprodução automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rPT/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000000..bcd168a481 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-pt-rPT/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Limpar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Proteção contra monitorização está ativada</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">A proteção contra a monitorização bloqueou rastreadores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">A proteção contra monitorização está desativada para este site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informação do site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">A carregar</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Algum conteúdo foi bloqueado pela configuração de reprodução automática</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-rm/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-rm/strings.xml new file mode 100644 index 0000000000..d583fd3c77 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-rm/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Stizzar</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">La protecziun cunter il fastizar è activa</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">La protecziun cunter il fastizar ha bloccà fastizaders</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">La protecziun cunter il fastizar è deactivada per questa website</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Infurmaziuns davart la website</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Chargiar</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Tschert cuntegn è vegnì bloccà dal parameter da la reproducziun automatica</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ro/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ro/strings.xml new file mode 100644 index 0000000000..72dee0c902 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ro/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meniu</string> + <string name="mozac_clear_button_description">Șterge</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Protecția împotriva urmăririi este activată</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Protecția împotriva urmăririi a blocat elementele de urmărire</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Protecția împotriva urmăririi este dezactivată pentru acest site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informații despre site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Se încarcă</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ru/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000000..f722325b3a --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ru/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Очистить</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Защита от отслеживания включена</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Защита от отслеживания заблокировала трекеры</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Защита от отслеживания отключена для этого сайта</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Сведения о сайте</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Загрузка</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Некоторое содержимое было заблокировано настройками автовоспроизведения</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sat/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sat/strings.xml new file mode 100644 index 0000000000..f363d29490 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sat/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">ᱢᱮᱱᱩ</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">ᱯᱷᱟᱨᱪᱟ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ᱯᱟᱸᱡᱟ ᱟᱰ ᱪᱟᱹᱞᱩ ᱢᱮᱱᱟᱜ-ᱟ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱯᱟᱧᱡᱟ ᱫᱟᱱᱟᱲ ᱠᱚ ᱟᱠᱚᱴ ᱠᱮᱜᱼᱟᱭ</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ᱯᱟᱸᱡᱟ ᱨᱚᱯᱷᱟ ᱵᱚᱸᱫᱚ ᱢᱮᱱᱟᱜ-ᱟ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ᱥᱟᱭᱤᱴ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ᱞᱟᱫᱮᱜ ᱠᱟᱱᱟ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ᱟᱡ ᱛᱮ ᱮᱛᱦᱚᱵ ᱥᱟᱡᱟᱣ ᱠᱚ ᱠᱷᱟᱹᱛᱤᱨ ᱛᱮ ᱠᱤᱪᱷᱤ ᱡᱤᱱᱤᱥ ᱠᱚ ᱵᱞᱚᱠ ᱠᱟᱱᱟ</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sc/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sc/strings.xml new file mode 100644 index 0000000000..f0b375f172 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sc/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menù</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Isbòida</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">S’amparu contra sa sighidura est ativu</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">S’amparu contra sa sighidura at blocadu sighidores</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Sa protetzione contra sa sighidura est disativada pro custu situ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informatziones de su situ</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Carrighende</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Sa funtzionalidade de riprodutzione automàtica at blocadu cuntenutos</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-si/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-si/strings.xml new file mode 100644 index 0000000000..52a9db1744 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-si/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">වට්ටෝරුව</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">මකන්න</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ලුහුබැඳීමේ රැකවරණය සක්රියයි</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ලුහුබැඳීමේ රැකවරණයෙන් අවහිරයි</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">අඩවිය සඳහා ලුහුබැඳීමේ රැකවරණය අබලයි</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">අඩවියේ තොරතුරු</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">පූරණය වෙමින්</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ස්වයං වාදන සැකසුම මගින් ඇතැම් අන්තර්ගත අවහිර වී ඇත</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sk/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sk/strings.xml new file mode 100644 index 0000000000..d60ecd8152 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sk/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Ponuka</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Vymazať</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ochrana pred sledovaním je zapnutá</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ochrana pred sledovaním zablokovala sledovacie prvky</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ochrana pred sledovaním je na tejto stránke vypnutá</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informácie o stránke</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Načítava sa</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Niektorý obsah bol zablokovaný nastavením automatického prehrávania</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-skr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-skr/strings.xml new file mode 100644 index 0000000000..ccf404cabd --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-skr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">مینیو</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">صاف کرو</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">سراغ کاری تحفظ چالو ہے</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">سراغ کاری تحفظ نے سُراغ رساں کوں بلاک کر ݙتا ہے</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">سراغ کاری تحفظ ایں سائٹ کیتے بند ہے</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">سائٹ ڄاݨکاری</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">لوڈ تھیندا پئے</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">کجھ مواد کوں آٹو پلے ترتیباں نال بلاک کر ݙتا ڳئے</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sl/strings.xml new file mode 100644 index 0000000000..0d7a545930 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sl/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meni</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Počisti</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Zaščita pred sledenjem je vključena</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Zaščita pred sledenjem je zavrnila sledilce</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Zaščita pred sledenjem je za to spletno mesto izključena</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Podatki o strani</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Nalaganje</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Nastavitev samodejnega predvajanja je zavrnila nekaj vsebine</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sq/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sq/strings.xml new file mode 100644 index 0000000000..33b69257a5 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sq/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Spastroje</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Mbrojtje Nga Gjurmimet është aktive</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Mbrojtja Nga Gjurmimet ka bllokuar gjurmues</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Mbrojtja Nga Gjurmimet është e çaktivizuar për këtë sajt</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Hollësi sajti</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Po ngarkohet</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Është bllokuar lëndë nga rregullimi i vetëluajtjes</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sr/strings.xml new file mode 100644 index 0000000000..5e70cab0c1 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sr/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Мени</string> + <string name="mozac_clear_button_description">Обриши</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Заштита од праћења је укључена</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Заштита од праћења је блокирала пратиоце</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Заштита од праћења је искључена за ову страницу</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Информације о страници</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Учитавање</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Неки садржај је блокиран због подешавања аутоматске репродукције</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-su/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-su/strings.xml new file mode 100644 index 0000000000..af9bfdc6b0 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-su/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Beresihan</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Kilung Palacakan keur hurung</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Kilung Palacakan geus meungpeuk palacak</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Kilung Palacakan pareum pikeun ieu loka</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Émbaran loka</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ngamuat</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Sababaraha kontén dipeungpeuk ku setélan otoplay</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sv-rSE/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sv-rSE/strings.xml new file mode 100644 index 0000000000..8922e20f5e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-sv-rSE/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Meny</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Rensa</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Spårningsskydd är på</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Spårningsskydd har blockerat spårare</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Spårningsskydd är avstängt för den här webbplatsen</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Webbplatsinformation</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Laddar</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">En del innehåll har blockerats av inställningen för automatisk uppspelning</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-szl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-szl/strings.xml new file mode 100644 index 0000000000..e6537d32b1 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-szl/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Myni</string> + <string name="mozac_clear_button_description">Wypucuj</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ôchrōna ôd śledzynio je załōnczōno</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ôchrōna ôd śledzynio szperuje śledzōnce elymynty</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Na tyj strōnie ôchrōna ôd śledzynio je wyłōnczōno</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informacyje ô strōnie</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ladowanie</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Nasztalowanie autōmatycznego puszczanio zaszperowało kōnsek zawartości</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ta/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000000..9b6e317f6c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ta/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">பட்டி</string> + <string name="mozac_clear_button_description">துடை</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">தடமறியல் பாதுகாப்பு இயக்கத்தில்</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">தடமறியல் பாதுகாப்பு தடமறிவான்களை முடக்கியது</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">தடமறியல் பாதுகாப்பு இத்தளத்தில் அணைக்கப்பட்டுள்ளது</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">தளத்தகவல்கள்</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">ஏற்றுகிறது</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">தன்னியக்க அமைப்பால் சில உள்ளடக்கம் தடுக்கப்பட்டுள்ளது</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-te/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-te/strings.xml new file mode 100644 index 0000000000..504c84b58d --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-te/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">మెనూ</string> + <string name="mozac_clear_button_description">తుడిచివేయి</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ట్రాకింగ్ సంరక్షణ చేతనంగా ఉంది</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ట్రాకింగ్ సంరక్షణ ట్రాకర్లను నిరోధించింది</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">ఈ సైటుకి ట్రాకింగ్ సంరక్షణ ఆపివేయబడింది</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">సైటు సమాచారం</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">వస్తోంది</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">ఆటోప్లే అమరిక ద్వారా కొంత కంటెంట్ నిరోధించబడింది</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tg/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tg/strings.xml new file mode 100644 index 0000000000..0fed273e55 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tg/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Пок кардан</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Муҳофизат аз пайгирӣ фаъол аст</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Муҳофизат аз пайгирӣ васоити пайгириро манъ кард</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Муҳофизат аз пайгирӣ барои ин сомона хомӯш аст</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Маълумот дар бораи сомона</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Бор шуда истодааст</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Баъзеи муҳтаво тавассути танзими пахши худкор манъ карда шуд</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-th/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-th/strings.xml new file mode 100644 index 0000000000..55f06924fa --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-th/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">เมนู</string> + <string name="mozac_clear_button_description">ล้าง</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">การป้องกันการติดตามเปิดอยู่</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">การป้องกันการติดตามได้ปิดกั้นตัวติดตาม</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">การป้องกันการติดตามปิดอยู่สำหรับไซต์นี้</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">ข้อมูลไซต์</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">กำลังโหลด</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">เนื้อหาบางส่วนถูกปิดกั้นด้วยการตั้งค่าเล่นอัตโนมัติ</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tl/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tl/strings.xml new file mode 100644 index 0000000000..4e5e6b3300 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tl/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Burahin</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Nakabukas ang Tracking Protection</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">May naharang na mga tracker ang Tracking Protection</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Nakasara ang Tracking Protection sa site na ito</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Impormasyon sa site</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Naglo-load</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">May ilang content na naharang dahil sa autoplay setting</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tok/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tok/strings.xml new file mode 100644 index 0000000000..d9f3149d1b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tok/strings.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="mozac_clear_button_description">o weka ale</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">lipu li ken ala lukin e sona sina</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">lipu li weka e lipu lukin</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">lipu ni la weka pi lipu lukin li lon ala</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">sona lipu</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">o awen</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tr/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000000..904675f6e9 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tr/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menü</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Temizle</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">İzlenme koruması açık</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">İzlenme koruması, takip kodlarını engelledi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Bu sitede izlenme koruması kapalı</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Site bilgileri</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Yükleniyor</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Otomatik oynatma ayarınız bazı içerikleri engelledi</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-trs/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-trs/strings.xml new file mode 100644 index 0000000000..ef86e00be9 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-trs/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menû</string> + <string name="mozac_clear_button_description">Nā\'nïn\'</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Sa narrán riña sa naga\'nāj a</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Narrán sa dugumî ñù\' riña nej sa naga\'nāj a</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Nitāj si \'iaj sun sa narán riña sa naga\'nāj a riña sitiô nan</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Nuguan\' huā rayi\'î sitiô nan</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Hìaj ayì\'ij</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Huā da’āj nej sa mà riñaj narán gi’iaj guendâ nù sa duguachín man’an sa ni’io’</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tt/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tt/strings.xml new file mode 100644 index 0000000000..3a463ee5cf --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tt/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <string name="mozac_clear_button_description">Чистарту</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Күзәтелүдән Саклау кабызылган</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Күзәтүдән саклау күзәтеп торучыларны блоклады</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Бу сайт өчен Күзәтелүдән Саклау сүндерелгән</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Сайт турында мәгълүмат</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Йөкләү</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Автоуйнату көйләүләре аркасында кайбер эчтәлекләр блокланды</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tzm/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tzm/strings.xml new file mode 100644 index 0000000000..d451c5972c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-tzm/strings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Umuɣ</string> + <string name="mozac_clear_button_description">Sfeḍ</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Asmel n wasit</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Asali</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ug/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ug/strings.xml new file mode 100644 index 0000000000..89e5173df3 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ug/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">تىزىملىك</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">تازىلا</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">ئىزلاشتىن توسۇش ئىقتىدارى ئوچۇق</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">ئىز قوغلاش قوغدىغۇچىسى ئىز قوغلىغۇچىلارنى توستى</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">بۇ توربېكەتكە نىسبەتەن ئىزلاشتىن قوغداش تاقاق</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">بېكەت ئۇچۇرى</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">يۈكلەۋاتىدۇ</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">بەزى مەزمۇنلارنى ئاپتوماتىك قويۇش تەڭشىكى توستى</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uk/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000000..1460d015dd --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uk/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Меню</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Очистити</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Захист від стеження увімкнено</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Захист від стеження заблокував стеження</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Захист від стеження вимкнено для цього сайту</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Інформація про сайт</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Завантаження</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Деякий вміст заблоковано налаштуванням автовідтворення</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ur/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ur/strings.xml new file mode 100644 index 0000000000..78470d254c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-ur/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">مینیو</string> + <string name="mozac_clear_button_description">صاف کریں</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">سراغ کاری تحفظ چالو ہے</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">سراغ کاری تحفظ نے سُراغ رساں کو مسدود کردیا ہے</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">سراغ کاری تحفظ اس سائٹ کے لیئے بند ہے</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">سائٹ کی معلومات</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">لوڈ کر رہا ہے</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">کچھ مشمولات کو آٹو پلے سیٹنگ سے مسدود کردیا گیا ہے</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uz/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uz/strings.xml new file mode 100644 index 0000000000..ec69af71f6 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-uz/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menyu</string> + <string name="mozac_clear_button_description">Tozalash</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Kuzatuvdan himoya yoniq</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Kuzatuvdan himoya funksiyasi kuzatuvchilarni blokladi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Bu sayt uchun kuzatuvdan himoya funksiyasi oʻchirilgan</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Sayt maʼlumoti</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Yuklanmoqda</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Avtomatik ishga tushirish sozlamasi tufayli ayrim kontentlar bloklandi</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vec/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vec/strings.xml new file mode 100644 index 0000000000..15a625bcbc --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vec/strings.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <string name="mozac_clear_button_description">Pulisi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ƚa protesion antitraciamento ƚa xe ativa</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ƚa protesion antitraciamento ƚa ga blocà contenudi tracianti</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ƚa protesion antitraciamento ƚa xe disativà par sto sito</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Informasioni sito</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Cargamento</string> + </resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vi/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vi/strings.xml new file mode 100644 index 0000000000..c3c54456ed --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-vi/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Xóa</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Trình chống theo dõi đang bật</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Trình chống theo dõi đã chặn trình theo dõi</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Đã tắt Trình chống theo dõi cho trang web này</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Thông tin về trang web</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Đang tải</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Một số nội dung đã bị chặn bởi cài đặt tự động phát</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-yo/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-yo/strings.xml new file mode 100644 index 0000000000..6f46be1286 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-yo/strings.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Mẹ́nù</string> + <string name="mozac_clear_button_description">Paárẹ́</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Ìtọpinpin Ìdàábòbò wà ní títàn </string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Ìtọpinpin ìdàábòbò ti dènà atọpinpin</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Ìtọpinpin ìdàábòbò ti di pípa fún ìkànnì yìí</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Ìfitóniléti ìkànnì</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Ó ń gbáradì</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Àwọn àkòónú kan ti di dídénà ààtò ìfi-ara-ẹni-ṣisẹ́</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rCN/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000..3cb765dc23 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">菜单</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">清除</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">已开启跟踪保护</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">跟踪保护已拦截跟踪器</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">已关闭对此网站的跟踪保护</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">网站信息</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">正在加载</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">某些内容已被自动播放设置阻止</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rTW/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000..d1d023f3db --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values-zh-rTW/strings.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">選單</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">清除</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">追蹤保護功能已開啟</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">追蹤保護功能已封鎖追蹤器</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">已關閉針對此網站的追蹤保護功能</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">網站資訊</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">載入中</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">某些內容已由自動播放設定封鎖</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/attrs_browser_toolbar.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/attrs_browser_toolbar.xml new file mode 100644 index 0000000000..431bb6b080 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/attrs_browser_toolbar.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + +<resources> + <declare-styleable name="BrowserToolbar"> + <attr name="browserToolbarHintColor" format="color"/> + <attr name="browserToolbarTextColor" format="color"/> + <attr name="browserToolbarTextSize" format="dimension"/> + <attr name="browserToolbarSecurityIcon" format="reference"/> + <attr name="browserToolbarInsecureColor" format="color"/> + <attr name="browserToolbarSecureColor" format="color"/> + <attr name="browserToolbarMenuColor" format="color"/> + <attr name="browserToolbarSuggestionBackgroundColor" format="color" /> + <attr name="browserToolbarSuggestionForegroundColor" format="color" /> + <attr name="browserToolbarClearColor" format="color"/> + <attr name="browserToolbarTrackingProtectionAndSecurityIndicatorSeparatorColor" format="color"/> + <attr name="browserToolbarFadingEdgeSize" format="dimension" /> + <attr name="browserToolbarProgressBarGravity"> + <enum name="bottom" value="0" /> + <enum name="top" value="1" /> + </attr> + </declare-styleable> + + <declare-styleable name="BrowserToolbarSiteSecurityState"> + <attr name="state_site_secure" format="boolean"/> + </declare-styleable> + + <declare-styleable name="ActionContainer"> + <attr name="actionContainerItemSize" format="dimension" /> + </declare-styleable> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/dimens.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/dimens.xml new file mode 100644 index 0000000000..23fd755686 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/dimens.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<resources> + <dimen name="mozac_browser_toolbar_default_toolbar_height">56dp</dimen> + + <!-- DisplayToolbar --> + <dimen name="mozac_browser_toolbar_progress_bar_height">3dp</dimen> + <dimen name="mozac_browser_toolbar_icons_separator_height">24dp</dimen> + <dimen name="mozac_browser_toolbar_icons_separator_width">1dp</dimen> + <dimen name="mozac_browser_toolbar_page_action_separator_width">4dp</dimen> + <dimen name="mozac_browser_toolbar_url_fading_edge_size">24dp</dimen> + <dimen name="mozac_browser_toolbar_icon_padding">12dp</dimen> + <dimen name="mozac_browser_toolbar_icon_size">24dp</dimen> + <dimen name="mozac_browser_toolbar_menu_padding">16dp</dimen> + <dimen name="mozac_browser_toolbar_origin_padding_end">0dp</dimen> + + <!-- EditToolbar --> + <dimen name="mozac_browser_toolbar_url_horizontal_padding">8dp</dimen> + <dimen name="mozac_browser_toolbar_url_vertical_padding">0dp</dimen> + <dimen name="mozac_browser_toolbar_url_gone_margin_end">8dp</dimen> + <dimen name="mozac_browser_toolbar_cancel_padding">16dp</dimen> + + <dimen name="mozac_browser_toolbar_url_textsize">15sp</dimen> + <dimen name="mozac_browser_toolbar_title_textsize">15sp</dimen> + <dimen name="mozac_browser_toolbar_url_with_title_textsize">12sp</dimen> + + <dimen name="mozac_browser_toolbar_pageaction_size">48dp</dimen> + <dimen name="mozac_browser_toolbar_browseraction_size">48dp</dimen> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/ids.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/ids.xml new file mode 100644 index 0000000000..20e28a0c58 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/ids.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<resources> + <item name="mozac_browser_toolbar_title_view" type="id"/> + <item name="mozac_browser_toolbar_url_view" type="id"/> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/strings.xml b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/strings.xml new file mode 100644 index 0000000000..c845e189e7 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/main/res/values/strings.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<resources> + <!-- Content description (not visible, for screen readers etc.): Description for the overflow menu button in the browser toolbar. --> + <string name="mozac_browser_toolbar_menu_button">Menu</string> + <!-- Content description: For the clear URL text button. --> + <string name="mozac_clear_button_description">Clear</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, but none trackers have been blocked or detected. --> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_no_trackers_blocked">Tracking Protection is on</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection enabled, and trackers have been blocked or detected.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_on_trackers_blocked1">Tracking Protection has blocked trackers</string> + <!-- Content description: For the tracking protection toolbar icon, it is set when the site has tracking protection disabled.--> + <string name="mozac_browser_toolbar_content_description_tracking_protection_off_for_a_site1">Tracking Protection is off for this site</string> + <!-- Content description: For the site security information icon (the site security icon).--> + <string name="mozac_browser_toolbar_content_description_site_info">Site information</string> + <!-- Announcement made by the screen reader when the progress bar is shown and a page is loading --> + <string name="mozac_browser_toolbar_progress_loading">Loading</string> + <!-- Content description: For the autoplay toolbar icon, it is set when the auto play permission is blocking content playing.--> + <string name="mozac_browser_toolbar_content_description_autoplay_blocked">Some content has been blocked by the autoplay setting</string> +</resources> diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/AsyncFilterListenerTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/AsyncFilterListenerTest.kt new file mode 100644 index 0000000000..6c95c8f243 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/AsyncFilterListenerTest.kt @@ -0,0 +1,350 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2 + +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.async +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.isActive +import kotlinx.coroutines.test.runTest +import mozilla.components.concept.toolbar.AutocompleteDelegate +import mozilla.components.concept.toolbar.AutocompleteResult +import mozilla.components.support.test.mock +import mozilla.components.ui.autocomplete.AutocompleteView +import mozilla.components.ui.autocomplete.InlineAutocompleteEditText +import org.junit.Assert.assertEquals +import org.junit.Assert.fail +import org.junit.Test +import org.mockito.Mockito.atLeast +import org.mockito.Mockito.atLeastOnce +import org.mockito.Mockito.never +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import java.util.concurrent.Executor + +@ExperimentalCoroutinesApi // for runTest +class AsyncFilterListenerTest { + @Test + fun `filter listener cancels prior filter executions`() = runTest { + val urlView: AutocompleteView = mock() + val filter: suspend (String, AutocompleteDelegate) -> Unit = mock() + + val dispatcher = spy( + Executor { + it.run() + }.asCoroutineDispatcher(), + ) + + val listener = AsyncFilterListener(urlView, dispatcher, filter) + + verify(dispatcher, never()).cancelChildren() + + listener("test") + + verify(dispatcher, atLeastOnce()).cancelChildren() + } + + @Test + fun `filter delegate checks for cancellations before it runs, passes results to autocomplete view`() = runTest { + var filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + assertEquals("test", query) + delegate.applyAutocompleteResult( + AutocompleteResult( + input = "test", + text = "testing.com", + url = "http://www.testing.com", + source = "asyncTest", + totalItems = 1, + ), + ) + } + + val dispatcher = spy( + Executor { + it.run() + }.asCoroutineDispatcher(), + ) + + var didCallApply = 0 + + var listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "test" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + assertEquals("asyncTest", result.source) + assertEquals("testing.com", result.text) + assertEquals(1, result.totalItems) + didCallApply += 1 + } + + override fun noAutocompleteResult() { + fail() + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + verify(dispatcher, never()).isActive + + async { listener("test") }.await() + + // Checked if parent scope is still active. Somehow, each access to 'isActive' registers as 4? + verify(dispatcher, atLeast(4)).isActive + // Passed the result to the view's apply method exactly once. + assertEquals(1, didCallApply) + + filter = { query, delegate -> + assertEquals("moz", query) + delegate.applyAutocompleteResult( + AutocompleteResult( + input = "moz", + text = "mozilla.com", + url = "http://www.mozilla.com", + source = "asyncTestTwo", + totalItems = 2, + ), + ) + } + listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "moz" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + assertEquals("asyncTestTwo", result.source) + assertEquals("mozilla.com", result.text) + assertEquals(2, result.totalItems) + didCallApply += 1 + } + + override fun noAutocompleteResult() { + fail() + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + async { listener("moz") }.await() + + verify(dispatcher, atLeast(8)).isActive + assertEquals(2, didCallApply) + } + + @Test + fun `delegate discards stale results`() = runTest { + val filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + assertEquals("test", query) + delegate.applyAutocompleteResult( + AutocompleteResult( + input = "test", + text = "testing.com", + url = "http://www.testing.com", + source = "asyncTest", + totalItems = 1, + ), + ) + } + + val dispatcher = Executor { + it.run() + }.asCoroutineDispatcher() + + val listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "nolongertest" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + fail() + } + + override fun noAutocompleteResult() { + fail() + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + listener("test") + } + + @Test + fun `delegate discards stale lack of results`() = runTest { + val filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + assertEquals("test", query) + delegate.noAutocompleteResult("test") + } + + val dispatcher = Executor { + it.run() + }.asCoroutineDispatcher() + + val listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "nolongertest" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + fail() + } + + override fun noAutocompleteResult() { + fail() + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + listener("test") + } + + @Test + fun `delegate passes through non-stale lack of results`() = runTest { + val filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + assertEquals("test", query) + delegate.noAutocompleteResult("test") + } + + val dispatcher = Executor { + it.run() + }.asCoroutineDispatcher() + + var calledNoResults = 0 + val listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "test" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + fail() + } + + override fun noAutocompleteResult() { + calledNoResults += 1 + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + async { listener("test") }.await() + + assertEquals(1, calledNoResults) + } + + @Test + fun `delegate discards results if parent scope was cancelled`() = runTest { + var preservedDelegate: AutocompleteDelegate? = null + + val filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + preservedDelegate = delegate + assertEquals("test", query) + delegate.applyAutocompleteResult( + AutocompleteResult( + input = "test", + text = "testing.com", + url = "http://www.testing.com", + source = "asyncTest", + totalItems = 1, + ), + ) + } + + val dispatcher = Executor { + it.run() + }.asCoroutineDispatcher() + + var calledResults = 0 + val listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "test" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + assertEquals("asyncTest", result.source) + assertEquals("testing.com", result.text) + assertEquals(1, result.totalItems) + calledResults += 1 + } + + override fun noAutocompleteResult() { + fail() + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + async { + listener("test") + listener("test") + }.await() + + // This result application should be discarded, because scope has been cancelled by the second + // 'listener' call above. + preservedDelegate!!.applyAutocompleteResult( + AutocompleteResult( + input = "test", + text = "testing.com", + url = "http://www.testing.com", + source = "asyncCancelled", + totalItems = 1, + ), + ) + + assertEquals(2, calledResults) + } + + @Test + fun `delegate discards lack of results if parent scope was cancelled`() = runTest { + var preservedDelegate: AutocompleteDelegate? = null + + val filter: suspend (String, AutocompleteDelegate) -> Unit = { query, delegate -> + preservedDelegate = delegate + assertEquals("test", query) + delegate.noAutocompleteResult("test") + } + + val dispatcher = Executor { + it.run() + }.asCoroutineDispatcher() + + var calledResults = 0 + val listener = AsyncFilterListener( + object : AutocompleteView { + override val originalText: String = "test" + + override fun applyAutocompleteResult(result: InlineAutocompleteEditText.AutocompleteResult) { + fail() + } + + override fun noAutocompleteResult() { + calledResults += 1 + } + }, + dispatcher, + filter, + this.coroutineContext, + ) + + async { + listener("test") + listener("test") + }.await() + + // This "no results" call should be discarded, because scope has been cancelled by the second + // 'listener' call above. + preservedDelegate!!.noAutocompleteResult("test") + + assertEquals(2, calledResults) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/BrowserToolbarTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/BrowserToolbarTest.kt new file mode 100644 index 0000000000..d1a499e30c --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/BrowserToolbarTest.kt @@ -0,0 +1,1044 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2 + +import android.content.Context +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.View +import android.view.ViewParent +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityManager +import android.widget.ImageButton +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.inputmethod.EditorInfoCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.browser.toolbar2.display.DisplayToolbar +import mozilla.components.browser.toolbar2.display.DisplayToolbarViews +import mozilla.components.browser.toolbar2.display.MenuButton +import mozilla.components.browser.toolbar2.edit.EditToolbar +import mozilla.components.concept.toolbar.AutocompleteDelegate +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.concept.toolbar.Toolbar.SiteSecurity +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection +import mozilla.components.support.ktx.kotlin.MAX_URI_LENGTH +import mozilla.components.support.test.argumentCaptor +import mozilla.components.support.test.mock +import mozilla.components.support.test.robolectric.testContext +import mozilla.components.support.test.whenever +import mozilla.components.ui.widgets.behavior.EngineViewScrollingBehavior +import mozilla.components.ui.widgets.behavior.ViewPosition +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers +import org.mockito.Mockito.any +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.spy +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.`when` +import org.robolectric.Robolectric +import org.robolectric.Shadows.shadowOf + +@RunWith(AndroidJUnit4::class) +class BrowserToolbarTest { + + @Test + fun `display toolbar is visible by default`() { + val toolbar = BrowserToolbar(testContext) + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + } + + @Test + fun `calling editMode() makes edit toolbar visible`() { + val toolbar = BrowserToolbar(testContext) + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + + toolbar.editMode() + + assertTrue(toolbar.display.rootView.visibility == View.GONE) + assertTrue(toolbar.edit.rootView.visibility == View.VISIBLE) + } + + @Test + fun `calling displayMode() makes display toolbar visible`() { + val toolbar = BrowserToolbar(testContext) + toolbar.editMode() + + assertTrue(toolbar.display.rootView.visibility == View.GONE) + assertTrue(toolbar.edit.rootView.visibility == View.VISIBLE) + + toolbar.displayMode() + + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + } + + @Test + fun `back presses will not be handled in display mode`() { + val toolbar = BrowserToolbar(testContext) + toolbar.displayMode() + + assertFalse(toolbar.onBackPressed()) + + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + } + + @Test + fun `back presses will switch from edit mode to display mode`() { + val toolbar = BrowserToolbar(testContext) + toolbar.editMode() + + assertTrue(toolbar.display.rootView.visibility == View.GONE) + assertTrue(toolbar.edit.rootView.visibility == View.VISIBLE) + + assertTrue(toolbar.onBackPressed()) + + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + } + + @Test + fun `displayUrl will be forwarded to display toolbar immediately`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + val edit: EditToolbar = mock() + + toolbar.display = display + toolbar.edit = edit + + toolbar.url = "https://www.mozilla.org" + + verify(display).url = "https://www.mozilla.org" + verify(edit, never()).updateUrl(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean(), ArgumentMatchers.anyBoolean(), ArgumentMatchers.anyBoolean()) + } + + @Test + fun `displayUrl is truncated to prevent extreme cases from slowing down the UI`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + val edit: EditToolbar = mock() + + toolbar.display = display + toolbar.edit = edit + + toolbar.url = "a".repeat(MAX_URI_LENGTH + 1) + toolbar.url = "b".repeat(MAX_URI_LENGTH) + toolbar.url = "c".repeat(MAX_URI_LENGTH - 1) + + val urlCaptor = argumentCaptor<String>() + verify(display, times(3)).url = urlCaptor.capture() + + val capturedValues = urlCaptor.allValues + // Value was too long and should've been truncated + assertEquals("a".repeat(MAX_URI_LENGTH), capturedValues[0]) + // Values should be the same as before + assertEquals("b".repeat(MAX_URI_LENGTH), capturedValues[1]) + assertEquals("c".repeat(MAX_URI_LENGTH - 1), capturedValues[2]) + } + + @Test + fun `searchTerms is truncated in case it is greater than MAX_URI_LENGTH`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = spy(toolbar.edit) + toolbar.editMode() + + toolbar.setSearchTerms("a".repeat(MAX_URI_LENGTH + 1)) + + // Value was too long and should've been truncated + assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH) + verify(toolbar.edit).editSuggestion("a".repeat(MAX_URI_LENGTH)) + } + + @Test + fun `searchTerms is not truncated in case it is equal or less than MAX_URI_LENGTH`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = spy(toolbar.edit) + toolbar.editMode() + + toolbar.setSearchTerms("b".repeat(MAX_URI_LENGTH)) + + // Value should be the same as before + assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH) + verify(toolbar.edit).editSuggestion("b".repeat(MAX_URI_LENGTH)) + + toolbar.setSearchTerms("c".repeat(MAX_URI_LENGTH - 1)) + + // Value should be the same as before + assertEquals(toolbar.searchTerms.length, MAX_URI_LENGTH - 1) + verify(toolbar.edit).editSuggestion("c".repeat(MAX_URI_LENGTH - 1)) + } + + @Test + fun `last URL will be forwarded to edit toolbar when switching mode`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = spy(toolbar.edit) + + toolbar.url = "https://www.mozilla.org" + verify(toolbar.edit, never()).updateUrl("https://www.mozilla.org", false) + + toolbar.editMode() + + verify(toolbar.edit).updateUrl("https://www.mozilla.org", false) + } + + @Test + fun `displayProgress will send accessibility events`() { + val toolbar = BrowserToolbar(testContext) + val root = mock(ViewParent::class.java) + shadowOf(toolbar).setMyParent(root) + `when`(root.requestSendAccessibilityEvent(any(), any())).thenReturn(false) + + val shadowAccessibilityManager = shadowOf(testContext.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager) + shadowAccessibilityManager.setEnabled(true) + shadowAccessibilityManager.setTouchExplorationEnabled(true) + + toolbar.displayProgress(10) + toolbar.displayProgress(50) + toolbar.displayProgress(100) + + // make sure multiple calls to 100% does not trigger "loading" announcement + toolbar.displayProgress(100) + + val captor = ArgumentCaptor.forClass(AccessibilityEvent::class.java) + + verify(root, times(5)).requestSendAccessibilityEvent(any(), captor.capture()) + + assertEquals(AccessibilityEvent.TYPE_ANNOUNCEMENT, captor.allValues[0].eventType) + assertEquals(testContext.getString(R.string.mozac_browser_toolbar_progress_loading), captor.allValues[0].text[0]) + + assertEquals(AccessibilityEvent.TYPE_VIEW_SCROLLED, captor.allValues[1].eventType) + assertEquals(10, captor.allValues[1].scrollY) + assertEquals(100, captor.allValues[1].maxScrollY) + + assertEquals(AccessibilityEvent.TYPE_VIEW_SCROLLED, captor.allValues[2].eventType) + assertEquals(50, captor.allValues[2].scrollY) + assertEquals(100, captor.allValues[2].maxScrollY) + + assertEquals(AccessibilityEvent.TYPE_VIEW_SCROLLED, captor.allValues[3].eventType) + assertEquals(100, captor.allValues[3].scrollY) + assertEquals(100, captor.allValues[3].maxScrollY) + + assertEquals(AccessibilityEvent.TYPE_VIEW_SCROLLED, captor.allValues[4].eventType) + assertEquals(100, captor.allValues[3].scrollY) + assertEquals(100, captor.allValues[3].maxScrollY) + } + + @Test + fun `displayProgress will not send send view scrolled accessibility events if touch exploration is disabled`() { + val toolbar = BrowserToolbar(testContext) + val root = mock(ViewParent::class.java) + shadowOf(toolbar).setMyParent(root) + `when`(root.requestSendAccessibilityEvent(any(), any())).thenReturn(false) + + val shadowAccessibilityManager = shadowOf(testContext.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager) + shadowAccessibilityManager.setEnabled(true) + shadowAccessibilityManager.setTouchExplorationEnabled(false) + + toolbar.displayProgress(10) + toolbar.displayProgress(50) + toolbar.displayProgress(100) + + // make sure multiple calls to 100% does not trigger "loading" announcement + toolbar.displayProgress(100) + + val captor = ArgumentCaptor.forClass(AccessibilityEvent::class.java) + + verify(root, times(1)).requestSendAccessibilityEvent(any(), captor.capture()) + + assertEquals(AccessibilityEvent.TYPE_ANNOUNCEMENT, captor.allValues[0].eventType) + assertEquals(testContext.getString(R.string.mozac_browser_toolbar_progress_loading), captor.allValues[0].text[0]) + } + + @Test + fun `displayProgress will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + + toolbar.display = display + + toolbar.displayProgress(10) + toolbar.displayProgress(50) + toolbar.displayProgress(75) + toolbar.displayProgress(100) + + verify(display).updateProgress(10) + verify(display).updateProgress(50) + verify(display).updateProgress(75) + verify(display).updateProgress(100) + + verifyNoMoreInteractions(display) + } + + @Test + fun `internal onUrlEntered callback will be forwarded to urlChangeListener`() { + val toolbar = BrowserToolbar(testContext) + + val mockedListener = object { + var called = false + var url: String? = null + + fun invoke(url: String): Boolean { + this.called = true + this.url = url + return true + } + } + + toolbar.setOnUrlCommitListener(mockedListener::invoke) + toolbar.onUrlEntered("https://www.mozilla.org") + + assertTrue(mockedListener.called) + assertEquals("https://www.mozilla.org", mockedListener.url) + } + + /* + @Test + fun `internal onEditCancelled callback will be forwarded to editListener`() { + val toolbar = BrowserToolbar(testContext) + val listener: Toolbar.OnEditListener = mock() + toolbar.setOnEditListener(listener) + assertEquals(toolbar.edit.editListener, listener) + + toolbar.edit.views.url.onKeyPreIme( + KeyEvent.KEYCODE_BACK, + KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK) + ) + verify(listener, times(1)).onCancelEditing() + }*/ + + @Test + fun `toolbar measure will use full width and fixed 56dp height`() { + val toolbar = BrowserToolbar(testContext) + + val widthSpec = View.MeasureSpec.makeMeasureSpec(1024, View.MeasureSpec.AT_MOST) + val heightSpec = View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.AT_MOST) + + toolbar.measure(widthSpec, heightSpec) + + assertEquals(1024, toolbar.measuredWidth) + assertEquals(56, toolbar.measuredHeight) + } + + @Test + fun `toolbar will use provided height with EXACTLY measure spec`() { + val toolbar = BrowserToolbar(testContext) + + val widthSpec = View.MeasureSpec.makeMeasureSpec(1024, View.MeasureSpec.AT_MOST) + val heightSpec = View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.EXACTLY) + + toolbar.measure(widthSpec, heightSpec) + + assertEquals(1024, toolbar.measuredWidth) + assertEquals(800, toolbar.measuredHeight) + } + + @Test + fun `display and edit toolbar will use full size of browser toolbar`() { + val toolbar = BrowserToolbar(testContext) + + assertEquals(0, toolbar.display.rootView.measuredWidth) + assertEquals(0, toolbar.display.rootView.measuredHeight) + assertEquals(0, toolbar.edit.rootView.measuredWidth) + assertEquals(0, toolbar.edit.rootView.measuredHeight) + + val widthSpec = View.MeasureSpec.makeMeasureSpec(1024, View.MeasureSpec.AT_MOST) + val heightSpec = View.MeasureSpec.makeMeasureSpec(800, View.MeasureSpec.AT_MOST) + + toolbar.measure(widthSpec, heightSpec) + + assertEquals(1024, toolbar.display.rootView.measuredWidth) + assertEquals(56, toolbar.display.rootView.measuredHeight) + assertEquals(1024, toolbar.edit.rootView.measuredWidth) + assertEquals(56, toolbar.edit.rootView.measuredHeight) + } + + @Test + fun `toolbar will switch back to display mode after an URL has been entered`() { + val toolbar = BrowserToolbar(testContext) + toolbar.editMode() + + assertTrue(toolbar.display.rootView.visibility == View.GONE) + assertTrue(toolbar.edit.rootView.visibility == View.VISIBLE) + + toolbar.onUrlEntered("https://www.mozilla.org") + + assertTrue(toolbar.display.rootView.visibility == View.VISIBLE) + assertTrue(toolbar.edit.rootView.visibility == View.GONE) + } + + @Test + fun `toolbar will switch back to display mode if URL commit listener returns true`() { + val toolbar = BrowserToolbar(testContext) + toolbar.setOnUrlCommitListener { true } + toolbar.editMode() + + assertTrue(toolbar.display.rootView.isGone) + assertTrue(toolbar.edit.rootView.isVisible) + + toolbar.onUrlEntered("https://www.mozilla.org") + + assertTrue(toolbar.display.rootView.isVisible) + assertTrue(toolbar.edit.rootView.isGone) + } + + @Test + fun `toolbar will stay in edit mode if URL commit listener returns false`() { + val toolbar = BrowserToolbar(testContext) + toolbar.setOnUrlCommitListener { false } + toolbar.editMode() + + assertTrue(toolbar.display.rootView.isGone) + assertTrue(toolbar.edit.rootView.isVisible) + + toolbar.onUrlEntered("https://www.mozilla.org") + + assertTrue(toolbar.display.rootView.isGone) + assertTrue(toolbar.edit.rootView.isVisible) + } + + @Test + fun `add browser action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "Hello") { + // Do nothing + } + + toolbar.addBrowserAction(action) + + verify(display).addBrowserAction(action) + } + + @Test + fun `remove browser action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "Hello") { + // Do nothing + } + + toolbar.removeBrowserAction(action) + + verify(display).removeBrowserAction(action) + } + + @Test + fun `remove navigation action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "Hello") { + // Do nothing + } + + toolbar.removeNavigationAction(action) + + verify(display).removeNavigationAction(action) + } + + @Test + fun `remove page action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "Hello") { + // Do nothing + } + + toolbar.removePageAction(action) + + verify(display).removePageAction(action) + } + + @Test + fun `add page action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "World") { + // Do nothing + } + + toolbar.addPageAction(action) + + verify(display).addPageAction(action) + } + + @Test + fun `add edit action start will be forwarded to edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + + val edit: EditToolbar = mock() + toolbar.edit = edit + + val action = BrowserToolbar.Button(mock(), "QR code scanner") { + // Do nothing + } + + toolbar.addEditActionStart(action) + + verify(edit).addEditActionStart(action) + } + + @Test + fun `add edit action end will be forwarded to edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + + val edit: EditToolbar = mock() + toolbar.edit = edit + + val action = BrowserToolbar.Button(mock(), "QR code scanner") { + // Do nothing + } + + toolbar.addEditActionEnd(action) + + verify(edit).addEditActionEnd(action) + } + + @Test + fun `WHEN removing action end THEN it will be forwarded to the edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + + val edit: EditToolbar = mock() + toolbar.edit = edit + + val action = BrowserToolbar.Button(mock(), "QR code scanner") { + // Do nothing + } + + toolbar.removeEditActionEnd(action) + + verify(edit).removeEditActionEnd(action) + } + + @Test + fun `WHEN hideMenuButton is sent to BrowserToolbar THEN it will be forwarded to the DisplayToolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + toolbar.display = display + + toolbar.hideMenuButton() + + verify(display).hideMenuButton() + } + + @Test + fun `WHEN showMenuButton is sent to BrowserToolbar THEN it will be forwarded to the DisplayToolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + toolbar.display = display + + toolbar.showMenuButton() + + verify(display).showMenuButton() + } + + @Test + fun `WHEN showPageActionSeparator is sent to BrowserToolbar THEN it will be forwarded to the DisplayToolbar and EditToolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + val edit: EditToolbar = mock() + toolbar.display = display + toolbar.edit = edit + + toolbar.showPageActionSeparator() + + verify(display).showPageActionSeparator() + verify(edit).showPageActionSeparator() + } + + @Test + fun `WHEN hidePageActionSeparator is sent to BrowserToolbar THEN it will be forwarded to the DisplayToolbar and EditToolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + val edit: EditToolbar = mock() + toolbar.display = display + toolbar.edit = edit + + toolbar.hidePageActionSeparator() + + verify(display).hidePageActionSeparator() + verify(edit).hidePageActionSeparator() + } + + @Test + fun `WHEN setDisplayHorizontalPadding is sent to BrowserToolbar THEN it will be forwarded to the DisplayToolbar`() { + val toolbar = BrowserToolbar(testContext) + + val display: DisplayToolbar = mock() + toolbar.display = display + toolbar.edit = mock() + + toolbar.setDisplayHorizontalPadding(123) + verify(display).setHorizontalPadding(123) + + toolbar.setDisplayHorizontalPadding(0) + verify(display).setHorizontalPadding(0) + } + + @Test + fun `cast to view`() { + // Given + val toolbar = BrowserToolbar(testContext) + + // When + val view = toolbar.asView() + + // Then + assertNotNull(view) + } + + @Test + fun `URL update does not override search terms in edit mode`() { + val toolbar = BrowserToolbar(testContext) + + toolbar.display = spy(toolbar.display) + toolbar.edit = spy(toolbar.edit) + + toolbar.setSearchTerms("mozilla android") + toolbar.url = "https://www.mozilla.com" + toolbar.editMode() + verify(toolbar.display).url = "https://www.mozilla.com" + verify(toolbar.edit).updateUrl("mozilla android", false) + + toolbar.setSearchTerms("") + verify(toolbar.edit).updateUrl("", false) + + toolbar.url = "https://www.mozilla.org" + toolbar.editMode() + verify(toolbar.display).url = "https://www.mozilla.org" + verify(toolbar.edit).updateUrl("https://www.mozilla.org", false) + } + + @Test + fun `add navigation action will be forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + toolbar.display = display + + val action = BrowserToolbar.Button(mock(), "Back") { + // Do nothing + } + + toolbar.addNavigationAction(action) + + verify(display).addNavigationAction(action) + } + + @Test + fun `invalidate actions is forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + val display: DisplayToolbar = mock() + toolbar.display = display + + verify(display, never()).invalidateActions() + + toolbar.invalidateActions() + + verify(display).invalidateActions() + } + + @Test + fun `invalidate actions is forwarded to edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + val edit: EditToolbar = mock() + toolbar.edit = edit + + verify(edit, never()).invalidateActions() + + toolbar.invalidateActions() + + verify(edit).invalidateActions() + } + + @Test + fun `search terms (if set) are forwarded to edit toolbar instead of URL`() { + val toolbar = BrowserToolbar(testContext) + + toolbar.edit = spy(toolbar.edit) + + toolbar.url = "https://www.mozilla.org" + toolbar.setSearchTerms("Mozilla Firefox") + + verify(toolbar.edit, never()).updateUrl("https://www.mozilla.org") + verify(toolbar.edit, never()).updateUrl("Mozilla Firefox") + + toolbar.editMode() + + verify(toolbar.edit, never()).updateUrl("https://www.mozilla.org") + verify(toolbar.edit).updateUrl("Mozilla Firefox") + } + + @Test + fun `search terms are forwarded to edit toolbar when it is active`() { + val toolbar = BrowserToolbar(testContext) + + toolbar.edit = spy(toolbar.edit) + + toolbar.editMode() + + toolbar.setSearchTerms("Mozilla Firefox") + + verify(toolbar.edit).editSuggestion("Mozilla Firefox") + } + + @Test + fun `editListener is set on edit`() { + val toolbar = BrowserToolbar(testContext) + assertNull(toolbar.edit.editListener) + + val listener: Toolbar.OnEditListener = mock() + toolbar.setOnEditListener(listener) + + assertEquals(listener, toolbar.edit.editListener) + } + + @Test + fun `editListener is invoked when switching between modes`() { + val toolbar = BrowserToolbar(testContext) + + val listener: Toolbar.OnEditListener = mock() + toolbar.setOnEditListener(listener) + + toolbar.editMode() + + verify(listener).onStartEditing() + verifyNoMoreInteractions(listener) + + toolbar.displayMode() + + verify(listener).onStopEditing() + verifyNoMoreInteractions(listener) + } + + @Test + fun `editListener is invoked when text changes`() { + val toolbar = BrowserToolbar(testContext) + + val listener: Toolbar.OnEditListener = mock() + toolbar.setOnEditListener(listener) + + toolbar.edit.views.url.onAttachedToWindow() + + toolbar.editMode() + + toolbar.edit.views.url.setText("Hello") + toolbar.edit.views.url.setText("Hello World") + + verify(listener).onStartEditing() + verify(listener).onTextChanged("Hello") + verify(listener).onTextChanged("Hello World") + } + + @Test + fun `titleView visibility is based on being set`() { + val toolbar = BrowserToolbar(testContext) + + assertEquals(toolbar.display.views.origin.titleView.visibility, View.GONE) + toolbar.title = "Mozilla" + assertEquals(toolbar.display.views.origin.titleView.visibility, View.VISIBLE) + toolbar.title = "" + assertEquals(toolbar.display.views.origin.titleView.visibility, View.GONE) + } + + @Test + fun `titleView text is set properly`() { + val toolbar = BrowserToolbar(testContext) + + toolbar.title = "Mozilla" + assertEquals("Mozilla", toolbar.display.views.origin.titleView.text) + assertEquals("Mozilla", toolbar.title) + } + + @Test + fun `titleView fading is set properly with non-null attrs`() { + val attributeSet: AttributeSet = Robolectric.buildAttributeSet().build() + + val toolbar = BrowserToolbar(testContext, attributeSet) + val titleView = toolbar.display.views.origin.titleView + val edgeLength = testContext.resources.getDimensionPixelSize(R.dimen.mozac_browser_toolbar_url_fading_edge_size) + + assertTrue(titleView.isHorizontalFadingEdgeEnabled) + assertEquals(edgeLength, titleView.horizontalFadingEdgeLength) + } + + @Test + fun `Button constructor with drawable`() { + val buttonDefault = BrowserToolbar.Button(mock(), "imageDrawable") {} + + assertEquals(true, buttonDefault.visible()) + assertEquals(BrowserToolbar.DEFAULT_PADDING, buttonDefault.padding) + assertEquals("imageDrawable", buttonDefault.contentDescription) + + val button = BrowserToolbar.Button(mock(), "imageDrawable", visible = { false }) {} + + assertEquals(false, button.visible()) + } + + @Test + fun `ToggleButton constructor with drawable`() { + val buttonDefault = + BrowserToolbar.ToggleButton(mock(), mock(), "imageDrawable", "imageSelectedDrawable") {} + + assertEquals(true, buttonDefault.visible()) + assertEquals(BrowserToolbar.DEFAULT_PADDING, buttonDefault.padding) + + val button = BrowserToolbar.ToggleButton( + mock(), + mock(), + "imageDrawable", + "imageSelectedDrawable", + visible = { false }, + ) {} + + assertEquals(false, button.visible()) + } + + @Test + fun `ReloadPageAction visibility changes update image`() { + val reloadImage: Drawable = mock() + val stopImage: Drawable = mock() + val view: ImageButton = mock() + var reloadPageAction = BrowserToolbar.TwoStateButton(reloadImage, "reload", stopImage, "stop") {} + assertFalse(reloadPageAction.enabled) + reloadPageAction.bind(view) + verify(view).setImageDrawable(reloadImage) + verify(view).contentDescription = "reload" + + reloadPageAction = BrowserToolbar.TwoStateButton(reloadImage, "reload", stopImage, "stop", { false }) {} + reloadPageAction.bind(view) + verify(view).setImageDrawable(stopImage) + verify(view).contentDescription = "stop" + } + + @Test + fun `siteSecure updates the display`() { + val toolbar = BrowserToolbar(testContext) + toolbar.display = spy(toolbar.display) + assertEquals(SiteSecurity.INSECURE, toolbar.siteSecure) + + toolbar.siteSecure = SiteSecurity.SECURE + + verify(toolbar.display).siteSecurity = SiteSecurity.SECURE + } + + @Test + fun `siteTrackingProtection updates the display`() { + val toolbar = BrowserToolbar(testContext) + toolbar.display = spy(toolbar.display) + assertEquals(SiteTrackingProtection.OFF_GLOBALLY, toolbar.siteTrackingProtection) + + toolbar.siteTrackingProtection = SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED + + verify(toolbar.display).setTrackingProtectionState(SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED) + + toolbar.siteTrackingProtection = SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED + verifyNoMoreInteractions(toolbar.display) + } + + @Test + fun `private flag sets IME_FLAG_NO_PERSONALIZED_LEARNING on url edit view`() { + val toolbar = BrowserToolbar(testContext) + val edit = toolbar.edit + + // By default "private mode" is off. + assertEquals( + 0, + edit.views.url.imeOptions and + EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING, + ) + assertEquals(false, toolbar.private) + + // Turning on private mode sets flag + toolbar.private = true + assertNotEquals( + 0, + edit.views.url.imeOptions and + EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING, + ) + assertTrue(toolbar.private) + + // Turning private mode off again - should remove flag + toolbar.private = false + assertEquals( + 0, + edit.views.url.imeOptions and + EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING, + ) + assertEquals(false, toolbar.private) + } + + @Test + fun `setAutocompleteListener is forwarded to edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = mock() + + val filter: suspend (String, AutocompleteDelegate) -> Unit = { _, _ -> + // Do nothing + } + + toolbar.setAutocompleteListener(filter) + + verify(toolbar.edit).setAutocompleteListener(filter) + } + + @Test + fun `WHEN an attempt to refresh autocomplete suggestions is made THEN forward the call to edit toolbar`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = mock() + toolbar.setAutocompleteListener { _, _ -> } + + toolbar.refreshAutocomplete() + + verify(toolbar.edit).refreshAutocompleteSuggestion() + } + + @Test + fun `onStop is forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + toolbar.display = mock() + + toolbar.onStop() + + verify(toolbar.display).onStop() + } + + @Test + fun `dismiss menu is forwarded to display toolbar`() { + val toolbar = BrowserToolbar(testContext) + toolbar.display = mock() + val displayToolbarViews: DisplayToolbarViews = mock() + val menuButton: MenuButton = mock() + + whenever(toolbar.display.views).thenReturn(displayToolbarViews) + whenever(displayToolbarViews.menu).thenReturn(menuButton) + + toolbar.dismissMenu() + verify(menuButton).dismissMenu() + } + + @Test + fun `enable scrolling is forwarded to the toolbar behavior`() { + // Seems like real instances are needed for things to be set properly + val toolbar = BrowserToolbar(testContext) + val behavior = spy(EngineViewScrollingBehavior(testContext, null, ViewPosition.BOTTOM)) + val params = CoordinatorLayout.LayoutParams(10, 10).apply { + this.behavior = behavior + } + toolbar.layoutParams = params + + toolbar.enableScrolling() + + verify(behavior).enableScrolling() + } + + @Test + fun `disable scrolling is forwarded to the toolbar behavior`() { + // Seems like real instances are needed for things to be set properly + val toolbar = BrowserToolbar(testContext) + val behavior = spy(EngineViewScrollingBehavior(testContext, null, ViewPosition.BOTTOM)) + val params = CoordinatorLayout.LayoutParams(10, 10).apply { + this.behavior = behavior + } + toolbar.layoutParams = params + + toolbar.disableScrolling() + + verify(behavior).disableScrolling() + } + + @Test + fun `expand is forwarded to the toolbar behavior`() { + // Seems like real instances are needed for things to be set properly + val toolbar = BrowserToolbar(testContext) + val behavior = spy(EngineViewScrollingBehavior(testContext, null, ViewPosition.BOTTOM)) + val params = CoordinatorLayout.LayoutParams(10, 10).apply { + this.behavior = behavior + } + toolbar.layoutParams = params + + toolbar.expand() + + verify(behavior).forceExpand(toolbar) + } + + @Test + fun `collapse is forwarded to the toolbar behavior`() { + // Seems like real instances are needed for things to be set properly + val toolbar = BrowserToolbar(testContext) + val behavior = spy(EngineViewScrollingBehavior(testContext, null, ViewPosition.BOTTOM)) + val params = CoordinatorLayout.LayoutParams(10, 10).apply { + this.behavior = behavior + } + toolbar.layoutParams = params + + toolbar.collapse() + + verify(behavior).forceCollapse(toolbar) + } + + @Test + fun `WHEN search terms changes THEN edit listener is notified`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = spy(toolbar.edit) + toolbar.edit.editListener = mock() + + toolbar.setSearchTerms("") + toolbar.editMode() + + toolbar.setSearchTerms("test") + verify(toolbar.edit.editListener)?.onTextChanged("test") + + toolbar.setSearchTerms("") + verify(toolbar.edit.editListener)?.onTextChanged("") + } + + @Test + fun `WHEN switching to edit mode AND the cursor placement parameter is specified THEN call the correct method to place the cursor`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit = spy(toolbar.edit) + + toolbar.editMode(Toolbar.CursorPlacement.ALL) + + verify(toolbar.edit).selectAll() + + toolbar.editMode(Toolbar.CursorPlacement.END) + + verify(toolbar.edit).selectEnd() + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/DisplayToolbarTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/DisplayToolbarTest.kt new file mode 100644 index 0000000000..6a8ba9e478 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/DisplayToolbarTest.kt @@ -0,0 +1,824 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.graphics.Color +import android.os.Build +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.browser.menu.BrowserMenu +import mozilla.components.browser.menu.BrowserMenuBuilder +import mozilla.components.browser.menu.item.SimpleBrowserMenuItem +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.menu.MenuButton +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.concept.toolbar.Toolbar.SiteSecurity +import mozilla.components.concept.toolbar.Toolbar.SiteTrackingProtection +import mozilla.components.support.base.Component +import mozilla.components.support.base.facts.Action +import mozilla.components.support.base.facts.processor.CollectionProcessor +import mozilla.components.support.test.any +import mozilla.components.support.test.eq +import mozilla.components.support.test.mock +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.reset +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.robolectric.util.ReflectionHelpers +import mozilla.components.ui.icons.R as iconsR + +@RunWith(AndroidJUnit4::class) +class DisplayToolbarTest { + private fun createDisplayToolbar(): Pair<BrowserToolbar, DisplayToolbar> { + val toolbar: BrowserToolbar = mock() + val displayToolbar = DisplayToolbar( + testContext, + toolbar, + View.inflate(testContext, R.layout.mozac_browser_toolbar_displaytoolbar, null), + ) + return Pair(toolbar, displayToolbar) + } + + @Test + fun `clicking on the URL switches the toolbar to editing mode`() { + val (toolbar, displayToolbar) = createDisplayToolbar() + + val urlView = displayToolbar.views.origin.urlView + assertTrue(urlView.performClick()) + + verify(toolbar).editMode() + } + + @Test + fun `progress is forwarded to progress bar`() { + val (_, displayToolbar) = createDisplayToolbar() + + val progressView = displayToolbar.views.progress + + displayToolbar.updateProgress(0) + assertEquals(0, progressView.progress) + assertEquals(View.GONE, progressView.visibility) + + displayToolbar.updateProgress(10) + assertEquals(10, progressView.progress) + assertEquals(View.VISIBLE, progressView.visibility) + + displayToolbar.updateProgress(50) + assertEquals(50, progressView.progress) + assertEquals(View.VISIBLE, progressView.visibility) + + displayToolbar.updateProgress(75) + assertEquals(75, progressView.progress) + assertEquals(View.VISIBLE, progressView.visibility) + + displayToolbar.updateProgress(100) + assertEquals(100, progressView.progress) + assertEquals(View.GONE, progressView.visibility) + } + + @Test + fun `trackingProtectionViewColor will change the color of the trackingProtectionIconView`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.trackingProtectionIndicator.colorFilter) + + displayToolbar.colors = displayToolbar.colors.copy( + trackingProtection = Color.BLUE, + ) + + assertNotNull(displayToolbar.views.trackingProtectionIndicator.colorFilter) + assertNotNull(displayToolbar.views.trackingProtectionIndicator.trackingProtectionTint) + } + + @Test + fun `highlightView will change the color of the dot`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.highlight.colorFilter) + + displayToolbar.colors = displayToolbar.colors.copy(highlight = Color.BLUE) + + assertNotNull(displayToolbar.views.highlight.colorFilter) + assertNotNull(displayToolbar.views.highlight.highlightTint) + } + + @Test + fun `tracking protection and separator views become visible when states ON OR ACTIVE are set to siteTrackingProtection`() { + val (_, displayToolbar) = createDisplayToolbar() + + val trackingView = displayToolbar.views.trackingProtectionIndicator + val separatorView = displayToolbar.views.separator + + assertTrue(trackingView.visibility == View.GONE) + assertTrue(separatorView.visibility == View.GONE) + + displayToolbar.indicators = listOf( + DisplayToolbar.Indicators.SECURITY, + DisplayToolbar.Indicators.TRACKING_PROTECTION, + ) + displayToolbar.url = "https://www.mozilla.org" + displayToolbar.displayIndicatorSeparator = true + displayToolbar.setTrackingProtectionState(SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED) + + assertTrue(trackingView.isVisible) + assertTrue(separatorView.isVisible) + + displayToolbar.setTrackingProtectionState(SiteTrackingProtection.OFF_GLOBALLY) + + assertTrue(trackingView.visibility == View.GONE) + assertTrue(separatorView.visibility == View.GONE) + + displayToolbar.setTrackingProtectionState(SiteTrackingProtection.ON_TRACKERS_BLOCKED) + + assertTrue(trackingView.isVisible) + assertTrue(separatorView.isVisible) + } + + @Test + fun `setTrackingProtectionIcons will forward to TrackingProtectionIconView`() { + val (_, displayToolbar) = createDisplayToolbar() + + displayToolbar.indicators = listOf(DisplayToolbar.Indicators.TRACKING_PROTECTION) + displayToolbar.setTrackingProtectionState(SiteTrackingProtection.ON_NO_TRACKERS_BLOCKED) + + val oldTrackingProtectionIcon = displayToolbar.views.trackingProtectionIndicator.drawable + assertNotNull(oldTrackingProtectionIcon) + + val drawable1 = + testContext.getDrawable(TrackingProtectionIconView.DEFAULT_ICON_ON_NO_TRACKERS_BLOCKED)!! + val drawable2 = + testContext.getDrawable(TrackingProtectionIconView.DEFAULT_ICON_ON_TRACKERS_BLOCKED)!! + val drawable3 = + testContext.getDrawable(TrackingProtectionIconView.DEFAULT_ICON_OFF_FOR_A_SITE)!! + + displayToolbar.icons = displayToolbar.icons.copy( + trackingProtectionTrackersBlocked = drawable1, + trackingProtectionNothingBlocked = drawable2, + trackingProtectionException = drawable3, + ) + + assertNotEquals( + oldTrackingProtectionIcon, + displayToolbar.views.trackingProtectionIndicator.drawable, + ) + + assertEquals(drawable2, displayToolbar.views.trackingProtectionIndicator.drawable) + + displayToolbar.setTrackingProtectionState(SiteTrackingProtection.ON_TRACKERS_BLOCKED) + + assertNotEquals( + oldTrackingProtectionIcon, + displayToolbar.views.trackingProtectionIndicator.drawable, + ) + + assertEquals( + drawable1, + displayToolbar.views.trackingProtectionIndicator.drawable, + ) + } + + @Test + fun `setHighlight will forward to HighlightView`() { + val (_, displayToolbar) = createDisplayToolbar() + + val oldPermissionIcon = displayToolbar.views.highlight.drawable + assertNotNull(oldPermissionIcon) + + val drawable1 = testContext.getDrawable(HighlightView.DEFAULT_ICON)!! + + displayToolbar.indicators = listOf(DisplayToolbar.Indicators.HIGHLIGHT) + displayToolbar.icons = displayToolbar.icons.copy( + highlight = drawable1, + ) + + assertNotEquals( + oldPermissionIcon, + displayToolbar.views.highlight.drawable, + ) + + displayToolbar.setHighlight(Toolbar.Highlight.PERMISSIONS_CHANGED) + + assertNotEquals( + oldPermissionIcon, + displayToolbar.views.highlight.drawable, + ) + } + + @Test + fun `menu view is gone by default`() { + val (_, displayToolbar) = createDisplayToolbar() + + val menuView = displayToolbar.views.menu + + assertNotNull(menuView) + assertEquals(View.GONE, menuView.impl.visibility) + } + + @Test + fun `menu view becomes visible once a menu builder is set`() { + val (_, displayToolbar) = createDisplayToolbar() + + val menuView = displayToolbar.views.menu + + assertNotNull(menuView) + + assertEquals(View.GONE, menuView.impl.visibility) + + displayToolbar.menuBuilder = BrowserMenuBuilder(emptyList()) + + assertEquals(View.VISIBLE, menuView.impl.visibility) + + displayToolbar.menuBuilder = null + + assertEquals(View.GONE, menuView.impl.visibility) + } + + @Test + fun `no menu builder is set by default`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.menuBuilder) + } + + @Test + fun `menu builder will be used to create and show menu when button is clicked`() { + val (_, displayToolbar) = createDisplayToolbar() + val menuView = displayToolbar.views.menu + + val menuBuilder = mock(BrowserMenuBuilder::class.java) + val menu = mock(BrowserMenu::class.java) + doReturn(menu).`when`(menuBuilder).build(testContext) + + displayToolbar.menuBuilder = menuBuilder + + verify(menuBuilder, never()).build(testContext) + verify(menu, never()).show(menuView.impl) + + menuView.impl.performClick() + + verify(menuBuilder).build(testContext) + verify(menu).show(eq(menuView.impl), any(), any(), anyBoolean(), any()) + verify(menu, never()).invalidate() + + displayToolbar.invalidateActions() + + verify(menu).invalidate() + } + + @Test + fun `browser action gets added as view to toolbar`() { + val contentDescription = "Mozilla" + + val (_, displayToolbar) = createDisplayToolbar() + + assertEquals(0, displayToolbar.views.browserActions.childCount) + + val action = BrowserToolbar.Button(mock(), contentDescription) {} + displayToolbar.addBrowserAction(action) + + assertEquals(1, displayToolbar.views.browserActions.childCount) + + val view = displayToolbar.views.browserActions.getChildAt(0) + assertEquals(contentDescription, view.contentDescription) + } + + @Test + fun `clicking browser action view triggers listener of action`() { + var callbackExecuted = false + + val action = BrowserToolbar.Button(mock(), "Button") { + callbackExecuted = true + } + + val (_, displayToolbar) = createDisplayToolbar() + displayToolbar.addBrowserAction(action) + + assertEquals(1, displayToolbar.views.browserActions.childCount) + val view = displayToolbar.views.browserActions.getChildAt(0) + + assertNotNull(view) + + assertFalse(callbackExecuted) + + view?.performClick() + + assertTrue(callbackExecuted) + } + + @Test + fun `browser action can be removed`() { + val contentDescription = "to-be-removed" + + val (_, displayToolbar) = createDisplayToolbar() + + val action = BrowserToolbar.Button(mock(), contentDescription) {} + // Removing action which was never added has no effect + displayToolbar.removeBrowserAction(action) + + displayToolbar.addBrowserAction(action) + assertEquals(1, displayToolbar.views.browserActions.childCount) + + displayToolbar.removeBrowserAction(action) + assertEquals(0, displayToolbar.views.browserActions.childCount) + } + + @Test + fun `navigation action can be removed`() { + val contentDescription = "to-be-removed" + + val (_, displayToolbar) = createDisplayToolbar() + + val action = BrowserToolbar.Button(mock(), contentDescription) {} + // Removing action which was never added has no effect + displayToolbar.removeNavigationAction(action) + + displayToolbar.addNavigationAction(action) + assertEquals(1, displayToolbar.views.navigationActions.childCount) + + displayToolbar.removeNavigationAction(action) + assertEquals(0, displayToolbar.views.navigationActions.childCount) + } + + @Test + fun `page action can be removed`() { + val contentDescription = "to-be-removed" + + val (_, displayToolbar) = createDisplayToolbar() + + val action = BrowserToolbar.Button(mock(), contentDescription) {} + // Removing action which was never added has no effect + displayToolbar.removePageAction(action) + + displayToolbar.addPageAction(action) + assertEquals(1, displayToolbar.views.pageActions.childCount) + + displayToolbar.removePageAction(action) + assertEquals(0, displayToolbar.views.pageActions.childCount) + } + + @Test + fun `page actions will be added as view to the toolbar`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertEquals(0, displayToolbar.views.pageActions.childCount) + + val action = BrowserToolbar.Button(mock(), "Reader Mode") {} + displayToolbar.addPageAction(action) + + assertEquals(1, displayToolbar.views.pageActions.childCount) + val view = displayToolbar.views.pageActions.getChildAt(0) + assertEquals("Reader Mode", view.contentDescription) + } + + @Test + fun `clicking a page action view will execute the listener of the action`() { + var listenerExecuted = false + + val action = BrowserToolbar.Button(mock(), "Reload") { + listenerExecuted = true + } + + val (_, displayToolbar) = createDisplayToolbar() + displayToolbar.addPageAction(action) + + assertFalse(listenerExecuted) + + assertEquals(1, displayToolbar.views.pageActions.childCount) + val view = displayToolbar.views.pageActions.getChildAt(0) + + assertNotNull(view) + view!!.performClick() + + assertTrue(listenerExecuted) + } + + @Test + fun `navigation actions will be added as view to the toolbar`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertEquals(0, displayToolbar.views.navigationActions.childCount) + + displayToolbar.addNavigationAction(BrowserToolbar.Button(mock(), "Back") {}) + displayToolbar.addNavigationAction(BrowserToolbar.Button(mock(), "Forward") {}) + + assertEquals(2, displayToolbar.views.navigationActions.childCount) + } + + @Test + fun `clicking on navigation action will execute listener of the action`() { + val (_, displayToolbar) = createDisplayToolbar() + + var listenerExecuted = false + val action = BrowserToolbar.Button(mock(), "Back") { + listenerExecuted = true + } + + displayToolbar.addNavigationAction(action) + + assertFalse(listenerExecuted) + + assertEquals(1, displayToolbar.views.navigationActions.childCount) + val view = displayToolbar.views.navigationActions.getChildAt(0) + view.performClick() + + assertTrue(listenerExecuted) + } + + @Test + fun `view of not visible navigation action gets removed after invalidating`() { + val (_, displayToolbar) = createDisplayToolbar() + + var shouldActionBeDisplayed = true + + val action = BrowserToolbar.Button( + mock(), + "Back", + visible = { shouldActionBeDisplayed }, + ) { /* Do nothing */ } + + displayToolbar.addNavigationAction(action) + + assertEquals(1, displayToolbar.views.navigationActions.childCount) + + shouldActionBeDisplayed = false + displayToolbar.invalidateActions() + + assertEquals(0, displayToolbar.views.navigationActions.childCount) + + shouldActionBeDisplayed = true + displayToolbar.invalidateActions() + + assertEquals(1, displayToolbar.views.navigationActions.childCount) + } + + @Test + fun `toolbar should call bind with view argument on action after invalidating`() { + val (_, displayToolbar) = createDisplayToolbar() + + val action = spy(BrowserToolbar.Button(mock(), "Reload") {}) + + displayToolbar.addPageAction(action) + + assertEquals(1, displayToolbar.views.pageActions.childCount) + val view = displayToolbar.views.pageActions.getChildAt(0) + + verify(action, never()).bind(view!!) + + displayToolbar.invalidateActions() + + verify(action).bind(view) + } + + @Test + fun `page action will not be added if visible lambda of action returns false`() { + val (_, displayToolbar) = createDisplayToolbar() + + val visibleAction = BrowserToolbar.Button(mock(), "Reload") {} + val invisibleAction = BrowserToolbar.Button( + mock(), + "Reader Mode", + visible = { false }, + ) {} + + displayToolbar.addPageAction(visibleAction) + displayToolbar.addPageAction(invisibleAction) + + assertEquals(1, displayToolbar.views.pageActions.childCount) + + val view = displayToolbar.views.pageActions.getChildAt(0) + assertEquals("Reload", view.contentDescription) + } + + @Test + fun `browser action will not be added if visible lambda of action returns false`() { + val (_, displayToolbar) = createDisplayToolbar() + + val visibleAction = BrowserToolbar.Button(mock(), "Tabs") {} + val invisibleAction = BrowserToolbar.Button( + mock(), + "Settings", + visible = { false }, + ) {} + + displayToolbar.addBrowserAction(visibleAction) + displayToolbar.addBrowserAction(invisibleAction) + + assertEquals(1, displayToolbar.views.browserActions.childCount) + + val view = displayToolbar.views.browserActions.getChildAt(0) + assertEquals("Tabs", view.contentDescription) + } + + @Test + fun `navigation action will not be added if visible lambda of action returns false`() { + val (_, displayToolbar) = createDisplayToolbar() + + val visibleAction = BrowserToolbar.Button(mock(), "Forward") {} + val invisibleAction = BrowserToolbar.Button( + mock(), + "Back", + visible = { false }, + ) {} + + displayToolbar.addNavigationAction(visibleAction) + displayToolbar.addNavigationAction(invisibleAction) + + assertEquals(1, displayToolbar.views.navigationActions.childCount) + + val view = displayToolbar.views.navigationActions.getChildAt(0) + assertEquals("Forward", view.contentDescription) + } + + @Test + fun `url background will be added and removed from display layout`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.background.drawable) + + displayToolbar.setUrlBackground( + ContextCompat.getDrawable( + testContext, + iconsR.drawable.mozac_ic_broken_lock, + ), + ) + + assertNotNull(displayToolbar.views.background.drawable) + + displayToolbar.setUrlBackground(null) + + assertNull(displayToolbar.views.background.drawable) + } + + @Test + fun `titleView does not display when there is no title text`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertTrue(displayToolbar.views.origin.titleView.isGone) + + displayToolbar.title = "Hello World" + + assertTrue(displayToolbar.views.origin.titleView.isVisible) + } + + @Test + fun `toolbar only switches to editing mode if onUrlClicked returns true`() { + val (toolbar, displayToolbar) = createDisplayToolbar() + + displayToolbar.views.origin.urlView.performClick() + + verify(toolbar).editMode() + + reset(toolbar) + displayToolbar.onUrlClicked = { false } + displayToolbar.views.origin.urlView.performClick() + + verify(toolbar, never()).editMode() + + reset(toolbar) + displayToolbar.onUrlClicked = { true } + displayToolbar.views.origin.urlView.performClick() + + verify(toolbar).editMode() + } + + @Test + fun `urlView delegates long click when set`() { + val (_, displayToolbar) = createDisplayToolbar() + + var longUrlClicked = false + + displayToolbar.setOnUrlLongClickListener { + longUrlClicked = true + false + } + + assertFalse(longUrlClicked) + displayToolbar.views.origin.urlView.performLongClick() + assertTrue(longUrlClicked) + } + + @Test + fun `urlView longClickListener can be unset`() { + val (_, displayToolbar) = createDisplayToolbar() + + var longClicked = false + displayToolbar.setOnUrlLongClickListener { + longClicked = true + true + } + + displayToolbar.views.origin.urlView.performLongClick() + assertTrue(longClicked) + longClicked = false + + displayToolbar.setOnUrlLongClickListener(null) + displayToolbar.views.origin.urlView.performLongClick() + + assertFalse(longClicked) + } + + @Test + fun `iconView changes site secure state when site security changes`() { + val (_, displayToolbar) = createDisplayToolbar() + assertEquals(SiteSecurity.INSECURE, displayToolbar.views.securityIndicator.siteSecurity) + + displayToolbar.siteSecurity = SiteSecurity.SECURE + + assertEquals(SiteSecurity.SECURE, displayToolbar.views.securityIndicator.siteSecurity) + + displayToolbar.siteSecurity = SiteSecurity.INSECURE + + assertEquals(SiteSecurity.INSECURE, displayToolbar.views.securityIndicator.siteSecurity) + } + + @Test + fun `securityIconColor is set when securityIconColor changes`() { + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.securityIndicator.colorFilter) + + displayToolbar.colors = displayToolbar.colors.copy( + securityIconSecure = Color.BLUE, + securityIconInsecure = Color.BLUE, + ) + + assertNotNull(displayToolbar.views.securityIndicator.colorFilter) + } + + @Test + fun `color filter is set with transparent when securityIconColor changes to transparent and api version is lower than 23`() { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 22) + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.securityIndicator.colorFilter) + + displayToolbar.colors = displayToolbar.colors.copy( + securityIconSecure = Color.TRANSPARENT, + securityIconInsecure = Color.TRANSPARENT, + ) + + assertNotNull(displayToolbar.views.securityIndicator.colorFilter) + } + + @Test + fun `color filter is cleared when securityIconColor changes to transparent and api version is bigger than 22`() { + ReflectionHelpers.setStaticField(Build.VERSION::class.java, "SDK_INT", 23) + + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.securityIndicator.colorFilter) + + displayToolbar.colors = displayToolbar.colors.copy( + securityIconSecure = Color.TRANSPARENT, + securityIconInsecure = Color.TRANSPARENT, + ) + + assertNull(displayToolbar.views.securityIndicator.colorFilter) + } + + @Test + fun `clicking menu button emits facts with additional extras from builder set`() { + CollectionProcessor.withFactCollection { facts -> + val (_, displayToolbar) = createDisplayToolbar() + val menuView = displayToolbar.views.menu + + val menuBuilder = BrowserMenuBuilder( + listOf(SimpleBrowserMenuItem("Mozilla")), + mapOf( + "customTab" to true, + "test" to "23", + ), + ) + displayToolbar.menuBuilder = menuBuilder + + assertEquals(0, facts.size) + + menuView.impl.performClick() + + assertEquals(1, facts.size) + + val fact = facts[0] + + assertEquals(Component.BROWSER_TOOLBAR, fact.component) + assertEquals(Action.CLICK, fact.action) + assertEquals("menu", fact.item) + assertNull(fact.value) + + assertNotNull(fact.metadata) + + val metadata = fact.metadata!! + assertEquals(2, metadata.size) + assertTrue(metadata.containsKey("customTab")) + assertTrue(metadata.containsKey("test")) + assertEquals(true, metadata["customTab"]) + assertEquals("23", metadata["test"]) + } + } + + @Test + fun `clicking on site security indicator invokes listener`() { + var listenerInvoked = false + + val (_, displayToolbar) = createDisplayToolbar() + + assertNull(displayToolbar.views.securityIndicator.background) + + displayToolbar.setOnSiteSecurityClickedListener { + listenerInvoked = true + } + + assertNotNull(displayToolbar.views.securityIndicator.background) + + displayToolbar.views.securityIndicator.performClick() + + assertTrue(listenerInvoked) + + listenerInvoked = false + + displayToolbar.setOnSiteSecurityClickedListener { } + + assertNotNull(displayToolbar.views.securityIndicator.background) + + displayToolbar.views.securityIndicator.performClick() + + assertFalse(listenerInvoked) + + displayToolbar.setOnSiteSecurityClickedListener(null) + + assertNull(displayToolbar.views.securityIndicator.background) + } + + @Test + fun `Security icon has proper content description`() { + val (_, displayToolbar) = createDisplayToolbar() + val siteSecurityIconView = displayToolbar.views.securityIndicator + + assertNotNull(siteSecurityIconView.contentDescription) + assertEquals( + testContext.getString(R.string.mozac_browser_toolbar_content_description_site_info), + siteSecurityIconView.contentDescription, + ) + } + + @Test + fun `Backgrounding the app dismisses menu if already open`() { + var wasDismissed = false + val (_, displayToolbar) = createDisplayToolbar() + val menuView = displayToolbar.views.menu + menuView.impl.register( + object : MenuButton.Observer { + override fun onDismiss() { + wasDismissed = true + } + }, + ) + menuView.menuBuilder = BrowserMenuBuilder(emptyList()) + menuView.impl.performClick() + + displayToolbar.onStop() + + assertTrue(wasDismissed) + } + + @Test + fun `set a dismiss lambda on the menu button`() { + var wasDismissed = false + val (_, displayToolbar) = createDisplayToolbar() + displayToolbar.setMenuDismissAction { wasDismissed = true } + val menuView = displayToolbar.views.menu + menuView.menuBuilder = BrowserMenuBuilder(emptyList()) + menuView.impl.performClick() + + menuView.dismissMenu() + assertTrue(wasDismissed) + } + + @Test + fun `url formatter used if provided`() { + val (_, displayToolbar) = createDisplayToolbar() + displayToolbar.url = "https://mozilla.org" + assertEquals(displayToolbar.url, displayToolbar.views.origin.url) + + displayToolbar.urlFormatter = { it.replace("https://".toRegex(), "") } + displayToolbar.url = "https://mozilla.org" + assertEquals("mozilla.org", displayToolbar.views.origin.url) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/HighlightViewTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/HighlightViewTest.kt new file mode 100644 index 0000000000..e339b98538 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/HighlightViewTest.kt @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import androidx.core.view.isVisible +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.Toolbar.Highlight.NONE +import mozilla.components.concept.toolbar.Toolbar.Highlight.PERMISSIONS_CHANGED +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify + +@RunWith(AndroidJUnit4::class) +class HighlightViewTest { + + @Test + fun `after setting tint, can get trackingProtectionTint`() { + val view = HighlightView(testContext) + view.setTint(android.R.color.black) + assertEquals(android.R.color.black, view.highlightTint) + } + + @Test + fun `setting status will trigger an icon updated`() { + val view = HighlightView(testContext) + + view.state = PERMISSIONS_CHANGED + + assertEquals(PERMISSIONS_CHANGED, view.state) + assertTrue(view.isVisible) + assertNotNull(view.drawable) + assertEquals( + view.contentDescription, + testContext.getString(R.string.mozac_browser_toolbar_content_description_autoplay_blocked), + ) + + view.state = NONE + + assertEquals(NONE, view.state) + assertNull(view.drawable) + assertFalse(view.isVisible) + assertNull(view.contentDescription) + } + + @Test + fun `setIcons will trigger an icon updated`() { + val view = spy(HighlightView(testContext)) + + view.setIcon( + testContext.getDrawable( + TrackingProtectionIconView.DEFAULT_ICON_ON_NO_TRACKERS_BLOCKED, + )!!, + ) + + verify(view).updateIcon() + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/MenuButtonTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/MenuButtonTest.kt new file mode 100644 index 0000000000..ada49fd88b --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/MenuButtonTest.kt @@ -0,0 +1,156 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.graphics.Color +import android.view.View +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.browser.menu.BrowserMenu +import mozilla.components.browser.menu.BrowserMenuBuilder +import mozilla.components.browser.menu.BrowserMenuHighlight +import mozilla.components.browser.menu.ext.getHighlight +import mozilla.components.browser.menu.item.BrowserMenuHighlightableItem +import mozilla.components.browser.menu.item.SimpleBrowserMenuItem +import mozilla.components.concept.menu.MenuController +import mozilla.components.concept.menu.candidate.DecorativeTextMenuCandidate +import mozilla.components.concept.menu.candidate.TextMenuCandidate +import mozilla.components.support.test.any +import mozilla.components.support.test.mock +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.doReturn +import org.mockito.Mockito.never +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@RunWith(AndroidJUnit4::class) +class MenuButtonTest { + @Mock private lateinit var menuBuilder: BrowserMenuBuilder + + @Mock private lateinit var menuController: MenuController + + @Mock private lateinit var menu: BrowserMenu + + @Mock private lateinit var menuButtonInternal: mozilla.components.browser.menu.view.MenuButton + private lateinit var menuButton: MenuButton + + @Before + fun setup() { + MockitoAnnotations.openMocks(this) + `when`(menuBuilder.build(testContext)).thenReturn(menu) + `when`(menuButtonInternal.context).thenReturn(testContext) + + menuButton = MenuButton(menuButtonInternal) + } + + @Test + fun `menu button is visible only if menu builder attached`() { + verify(menuButtonInternal).visibility = View.GONE + + `when`(menuButtonInternal.menuBuilder).thenReturn(mock()) + assertTrue(menuButton.shouldBeVisible()) + + `when`(menuButtonInternal.menuBuilder).thenReturn(null) + assertFalse(menuButton.shouldBeVisible()) + } + + @Suppress("Deprecation") + @Test + fun `menu button sets onDismiss action`() { + val action = {} + menuButton.setMenuDismissAction(action) + + verify(menuButtonInternal).onDismiss = action + } + + @Test + fun `icon displays dot if low highlighted item is present in menu`() { + verify(menuButtonInternal, never()).invalidateBrowserMenu() + verify(menuButtonInternal, never()).setHighlight(any()) + + var isHighlighted = false + val highlight = BrowserMenuHighlight.LowPriority(Color.YELLOW) + val highlightMenuBuilder = spy( + BrowserMenuBuilder( + listOf( + BrowserMenuHighlightableItem( + label = "Test", + startImageResource = 0, + highlight = highlight, + isHighlighted = { isHighlighted }, + ), + ), + ), + ) + doReturn(menu).`when`(highlightMenuBuilder).build(testContext) + + menuButton.menuBuilder = highlightMenuBuilder + `when`(menuButtonInternal.menuBuilder).thenReturn(highlightMenuBuilder) + menuButton.invalidateMenu() + + verify(menuButtonInternal).setHighlight(null) + + isHighlighted = true + menuButton.invalidateMenu() + + assertEquals(highlight, highlightMenuBuilder.items.getHighlight()) + verify(menuButtonInternal).setHighlight(highlight) + } + + @Test + fun `invalidateMenu should invalidate the internal menu`() { + `when`(menuButtonInternal.menuController).thenReturn(null) + `when`(menuButtonInternal.menuBuilder).thenReturn(mock()) + verify(menuButtonInternal, never()).invalidateBrowserMenu() + + menuButton.invalidateMenu() + + verify(menuButtonInternal).invalidateBrowserMenu() + } + + @Test + fun `invalidateMenu should do nothing if using the menu controller`() { + `when`(menuButtonInternal.menuController).thenReturn(menuController) + `when`(menuButtonInternal.menuBuilder).thenReturn(null) + verify(menuButtonInternal, never()).invalidateBrowserMenu() + + menuButton.invalidateMenu() + + verify(menuButtonInternal, never()).invalidateBrowserMenu() + } + + @Test + fun `invalidateMenu should automatically upgrade menu items if both builder and controller are present`() { + val onClick = {} + `when`(menuButtonInternal.menuController).thenReturn(menuController) + `when`(menuButtonInternal.menuBuilder).thenReturn( + BrowserMenuBuilder( + listOf( + SimpleBrowserMenuItem("Item 1", listener = onClick), + SimpleBrowserMenuItem("Item 2"), + ), + ), + ) + verify(menuButtonInternal, never()).invalidateBrowserMenu() + + menuButton.invalidateMenu() + + verify(menuButtonInternal, never()).invalidateBrowserMenu() + verify(menuController).submitList( + listOf( + TextMenuCandidate("Item 1", onClick = onClick), + DecorativeTextMenuCandidate("Item 2"), + ), + ) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconViewTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconViewTest.kt new file mode 100644 index 0000000000..1386c17e29 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/display/TrackingProtectionIconViewTest.kt @@ -0,0 +1,43 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.display + +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.drawable.AnimatedVectorDrawable +import android.graphics.drawable.Drawable +import androidx.test.ext.junit.runners.AndroidJUnit4 +import mozilla.components.support.test.mock +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class TrackingProtectionIconViewTest { + + @Test + fun `After setting tint, can get trackingProtectionTint`() { + val view = TrackingProtectionIconView(testContext) + view.setTint(android.R.color.black) + assertEquals(android.R.color.black, view.trackingProtectionTint) + } + + @Test + fun `colorFilter is cleared on animatable drawables`() { + val view = TrackingProtectionIconView(testContext) + view.trackingProtectionTint = android.R.color.black + + val drawable = mock<Drawable>() + val animatedDrawable = mock<AnimatedVectorDrawable>() + + view.setOrClearColorFilter(drawable) + assertEquals(PorterDuffColorFilter(android.R.color.black, PorterDuff.Mode.SRC_ATOP), view.colorFilter) + + view.setOrClearColorFilter(animatedDrawable) + assertNotEquals(PorterDuffColorFilter(android.R.color.black, PorterDuff.Mode.SRC_ATOP), view.colorFilter) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/edit/EditToolbarTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/edit/EditToolbarTest.kt new file mode 100644 index 0000000000..a371126a16 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/edit/EditToolbarTest.kt @@ -0,0 +1,290 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.edit + +import android.view.KeyEvent +import android.view.View +import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.browser.toolbar2.R +import mozilla.components.concept.toolbar.AutocompleteDelegate +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.support.base.Component +import mozilla.components.support.base.facts.Action +import mozilla.components.support.base.facts.processor.CollectionProcessor +import mozilla.components.support.test.mock +import mozilla.components.support.test.robolectric.testContext +import mozilla.components.ui.autocomplete.InlineAutocompleteEditText +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Test +import org.junit.runner.RunWith +import java.util.concurrent.CountDownLatch + +@ExperimentalCoroutinesApi // for runTest +@RunWith(AndroidJUnit4::class) +class EditToolbarTest { + private fun createEditToolbar(): Pair<BrowserToolbar, EditToolbar> { + val toolbar: BrowserToolbar = mock() + val displayToolbar = EditToolbar( + testContext, + toolbar, + View.inflate(testContext, R.layout.mozac_browser_toolbar_edittoolbar, null), + ) + return Pair(toolbar, displayToolbar) + } + + @Test + fun `entered text is forwarded to async autocomplete filter`() = runTest { + val toolbar = BrowserToolbar(testContext) + + toolbar.edit.views.url.onAttachedToWindow() + + val latch = CountDownLatch(1) + var invokedWithParams: List<Any?>? = null + toolbar.setAutocompleteListener { p1, p2 -> + invokedWithParams = listOf(p1, p2) + latch.countDown() + } + + toolbar.edit.views.url.setText("Hello") + + // Autocomplete filter will be invoked on a worker thread. + // Serialize here for the sake of tests. + latch.await() + + assertEquals("Hello", invokedWithParams!![0]) + assertTrue(invokedWithParams!![1] is AutocompleteDelegate) + } + + @Test + fun `GIVEN existing user input WHEN a call to refresh autocomplete suggestions is made THEN retart the autocomplete functionality with the current text`() { + val toolbar = BrowserToolbar(testContext) + toolbar.edit.views.url.onAttachedToWindow() + // Fake existing user input. + toolbar.edit.views.url.setText("Test") + val latch = CountDownLatch(1) + var invokedWithParams: List<Any?>? = null + // Only now enable the autocomplete functionality. + toolbar.setAutocompleteListener { p1, p2 -> + invokedWithParams = listOf(p1, p2) + latch.countDown() + } + + toolbar.refreshAutocomplete() + + // Autocomplete filter will be invoked on a worker thread. + // Serialize here for the sake of tests. + latch.await() + assertEquals("Test", invokedWithParams!![0]) + assertTrue(invokedWithParams!![1] is AutocompleteDelegate) + } + + @Test + fun `focus change is forwarded to listener`() { + var listenerInvoked = false + var value = false + + val toolbar = BrowserToolbar(testContext) + toolbar.edit.setOnEditFocusChangeListener { hasFocus -> + listenerInvoked = true + value = hasFocus + } + + // Switch to editing mode and focus view. + toolbar.editMode() + toolbar.edit.views.url.requestFocus() + + assertTrue(listenerInvoked) + assertTrue(value) + + // Switch back to display mode + listenerInvoked = false + toolbar.displayMode() + + assertTrue(listenerInvoked) + assertFalse(value) + } + + @Test + fun `entering text emits facts`() { + CollectionProcessor.withFactCollection { facts -> + val toolbar = BrowserToolbar(testContext) + toolbar.edit.views.url.onAttachedToWindow() + + assertEquals(0, facts.size) + + toolbar.edit.views.url.setText("https://www.mozilla.org") + toolbar.edit.views.url.dispatchKeyEvent( + KeyEvent( + System.currentTimeMillis(), + System.currentTimeMillis(), + KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_ENTER, + 0, + ), + ) + + assertEquals(2, facts.size) + + val factDetail = facts[0] + assertEquals(Component.UI_AUTOCOMPLETE, factDetail.component) + assertEquals(Action.IMPLEMENTATION_DETAIL, factDetail.action) + assertEquals("onTextChanged", factDetail.item) + assertEquals("InlineAutocompleteEditText", factDetail.value) + + val fact = facts[1] + assertEquals(Component.BROWSER_TOOLBAR, fact.component) + assertEquals(Action.COMMIT, fact.action) + assertEquals("toolbar", fact.item) + assertNull(fact.value) + + val metadata = fact.metadata + assertNotNull(metadata!!) + assertEquals(1, metadata.size) + assertTrue(metadata.contains("autocomplete")) + assertTrue(metadata["autocomplete"] is Boolean) + assertFalse(metadata["autocomplete"] as Boolean) + } + } + + @Test + fun `entering text emits facts with autocomplete metadata`() { + CollectionProcessor.withFactCollection { facts -> + val toolbar = BrowserToolbar(testContext) + toolbar.edit.views.url.onAttachedToWindow() + + assertEquals(0, facts.size) + + toolbar.edit.views.url.setText("https://www.mozilla.org") + + // Fake autocomplete + toolbar.edit.views.url.autocompleteResult = InlineAutocompleteEditText.AutocompleteResult( + text = "hello world", + source = "test-source", + totalItems = 100, + ) + + toolbar.edit.views.url.dispatchKeyEvent( + KeyEvent( + System.currentTimeMillis(), + System.currentTimeMillis(), + KeyEvent.ACTION_DOWN, + KeyEvent.KEYCODE_ENTER, + 0, + ), + ) + + assertEquals(2, facts.size) + + val factDetail = facts[0] + assertEquals(Component.UI_AUTOCOMPLETE, factDetail.component) + assertEquals(Action.IMPLEMENTATION_DETAIL, factDetail.action) + assertEquals("onTextChanged", factDetail.item) + assertEquals("InlineAutocompleteEditText", factDetail.value) + + val factCommit = facts[1] + assertEquals(Component.BROWSER_TOOLBAR, factCommit.component) + assertEquals(Action.COMMIT, factCommit.action) + assertEquals("toolbar", factCommit.item) + assertNull(factCommit.value) + + val metadata = factCommit.metadata + assertNotNull(metadata!!) + assertEquals(2, metadata.size) + + assertTrue(metadata.contains("autocomplete")) + assertTrue(metadata["autocomplete"] is Boolean) + assertTrue(metadata["autocomplete"] as Boolean) + + assertTrue(metadata.contains("source")) + assertEquals("test-source", metadata["source"]) + } + } + + @Test + fun `clearView gone on init`() { + val (_, editToolbar) = createEditToolbar() + val clearView = editToolbar.views.clear + assertTrue(clearView.visibility == View.GONE) + } + + @Test + fun `clearView visible on updateUrl`() { + val (_, editToolbar) = createEditToolbar() + val clearView = editToolbar.views.clear + + editToolbar.updateUrl("TestUrl", false) + assertTrue(clearView.visibility == View.VISIBLE) + } + + @Test + fun `WHEN shouldAppend is set to true updateUrl should append text`() { + val (_, editToolbar) = createEditToolbar() + + // Initial state + editToolbar.updateUrl(url = "what ") + + // Simulate text update with voice input + val actual = editToolbar.updateUrl(url = "is this", shouldAppend = true, shouldHighlight = true) + val expected = "what is this" + + assertEquals(expected, actual) + assertEquals(expected, editToolbar.views.url.text.toString()) + assertEquals(5, editToolbar.views.url.selectionStart) + assertEquals(12, editToolbar.views.url.selectionEnd) + } + + @Test + fun `setIconClickListener sets a click listener on the icon view`() { + val (_, editToolbar) = createEditToolbar() + val iconView = editToolbar.views.icon + assertFalse(iconView.hasOnClickListeners()) + editToolbar.setIconClickListener { /* noop */ } + assertTrue(iconView.hasOnClickListeners()) + } + + @Test + fun `clearView clears text in urlView`() { + val (_, editToolbar) = createEditToolbar() + val clearView = editToolbar.views.clear + + editToolbar.views.url.setText("https://www.mozilla.org") + assertTrue(editToolbar.views.url.text.isNotBlank()) + + assertNotNull(clearView) + clearView.performClick() + assertTrue(editToolbar.views.url.text.isBlank()) + } + + @Test + fun `editSuggestion sets text in urlView`() { + val (_, editToolbar) = createEditToolbar() + val url = editToolbar.views.url + + url.setText("https://www.mozilla.org") + assertEquals("https://www.mozilla.org", url.text.toString()) + + var callbackCalled = false + + editToolbar.editListener = object : Toolbar.OnEditListener { + override fun onTextChanged(text: String) { + callbackCalled = true + } + } + + editToolbar.editSuggestion("firefox") + + assertEquals("firefox", url.text.toString()) + assertTrue(callbackCalled) + assertEquals("firefox".length, url.selectionStart) + assertTrue(url.hasFocus()) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/internal/ActionContainerTest.kt b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/internal/ActionContainerTest.kt new file mode 100644 index 0000000000..e79c804f9e --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/java/mozilla/components/browser/toolbar2/internal/ActionContainerTest.kt @@ -0,0 +1,99 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.browser.toolbar2.internal + +import android.view.View +import mozilla.components.browser.toolbar2.BrowserToolbar +import mozilla.components.concept.toolbar.Toolbar +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class ActionContainerTest { + private lateinit var actionContainer: ActionContainer + private lateinit var browserAction: Toolbar.Action + + @Before + fun setUp() { + browserAction = BrowserToolbar.Button( + imageDrawable = mock(), + contentDescription = "Test", + visible = { true }, + autoHide = { true }, + weight = { 2 }, + listener = mock(), + ) + actionContainer = ActionContainer(testContext) + } + + @Test + fun `GIVEN multiple actions with different weights WHEN calculateInsertionIndex is called THEN action is placed at right index`() { + actionContainer.addAction( + BrowserToolbar.Button( + imageDrawable = mock(), + contentDescription = "Share", + visible = { true }, + weight = { 1 }, + listener = mock(), + ), + ) + actionContainer.addAction( + BrowserToolbar.Button( + imageDrawable = mock(), + contentDescription = "Reload", + visible = { true }, + weight = { 3 }, + listener = mock(), + ), + ) + val newAction = + BrowserToolbar.Button( + imageDrawable = mock(), + contentDescription = "Translation", + visible = { true }, + weight = { 2 }, + listener = mock(), + ) + + val insertionIndex = actionContainer.calculateInsertionIndex(newAction) + + assertEquals("The insertion index should be", 1, insertionIndex) + } + + @Test + fun `WHEN addAction is called THEN child views are increased`() { + actionContainer.addAction(browserAction) + + assertEquals(1, actionContainer.childCount) + } + + @Test + fun `WHEN removeAction is called THEN child views are decreased`() { + actionContainer.addAction(browserAction) + actionContainer.removeAction(browserAction) + + assertEquals(0, actionContainer.childCount) + } + + @Test + fun `WHEN invalidateAction is called THEN action visibility is reconsidered`() { + val browserToolbarAction = BrowserToolbar.Button( + imageDrawable = mock(), + contentDescription = "Translation", + visible = { false }, + weight = { 2 }, + listener = mock(), + ) + actionContainer.addAction(browserToolbarAction) + actionContainer.invalidateActions() + + assertEquals(View.GONE, actionContainer.visibility) + } +} diff --git a/mobile/android/android-components/components/browser/toolbar2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/mobile/android/android-components/components/browser/toolbar2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 0000000000..cf1c399ea8 --- /dev/null +++ b/mobile/android/android-components/components/browser/toolbar2/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1,2 @@ +mock-maker-inline +// This allows mocking final classes (classes are final by default in Kotlin) diff --git a/mobile/android/android-components/components/compose/cfr/src/main/java/mozilla/components/compose/cfr/CFRPopupLayout.kt b/mobile/android/android-components/components/compose/cfr/src/main/java/mozilla/components/compose/cfr/CFRPopupLayout.kt new file mode 100644 index 0000000000..4585c0303d --- /dev/null +++ b/mobile/android/android-components/components/compose/cfr/src/main/java/mozilla/components/compose/cfr/CFRPopupLayout.kt @@ -0,0 +1,160 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.compose.cfr + +import android.view.View +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.material.Button +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView + +typealias DismissAction = () -> Unit + +/** + * A layout for displaying a [CFRPopup] anchored by [anchorContent]. + * + * @param showCFR Whether to display the CFR. + * @param properties [CFRPopupProperties] allowing to customize the popup appearance and behavior. + * @param onCFRShown Invoked when the CFR is displayed. + * @param onDismiss Invoked when the CFR is dismissed. Returns true if the dismissal was + * explicit (e.g. clicked via the "X" button). + * @param text [Text] block containing the CFR's message. + * @param action Optional Composable displayed below [text]. Provides a [DismissAction] if the CFR needs + * to be dismissed after the action is invoked. + * @param anchorContent The Composable to anchor the CFR to. + */ +@Composable +fun CFRPopupLayout( + showCFR: Boolean, + properties: CFRPopupProperties, + onCFRShown: () -> Unit, + onDismiss: (Boolean) -> Unit, + text: @Composable () -> Unit, + action: @Composable (dismissCFR: DismissAction) -> Unit = {}, + anchorContent: @Composable () -> Unit, +) { + var hasDismissedCFR by rememberSaveable { mutableStateOf(false) } + + Box( + modifier = Modifier.height(intrinsicSize = IntrinsicSize.Min), + ) { + if (showCFR && !hasDismissedCFR) { + LaunchedEffect(Unit) { + onCFRShown() + } + + var popup: CFRPopup? = null + + val invokeDismiss: DismissAction = { + if (!hasDismissedCFR) { + popup?.dismiss() + } + popup = null + } + + AndroidView( + modifier = Modifier.fillMaxSize(), + factory = { context -> + View(context).also { + popup = CFRPopup( + anchor = it, + properties = properties, + onDismiss = { dismissFromButton -> + onDismiss(dismissFromButton) + hasDismissedCFR = true + }, + text = text, + action = { + action(invokeDismiss) + }, + ) + } + }, + onRelease = { + invokeDismiss() + }, + update = { + popup?.dismiss() + popup?.show() + }, + ) + } + + anchorContent() + } +} + +/** + * This is to validate the sizing of the underlying AndroidView. The current implementation of CFRs + * via [CFRPopupFullscreenLayout] do not render in previews. + */ +@Preview +@Composable +private fun CFRPopupLayoutPreview() { + var cfrVisible by remember { mutableStateOf(true) } + + Column( + modifier = Modifier + .fillMaxSize() + .background(color = Color.LightGray), + ) { + CFRPopupLayout( + showCFR = cfrVisible, + properties = CFRPopupProperties(), + onCFRShown = {}, + onDismiss = { cfrVisible = false }, + text = { + Text(text = "This is a CFR in Compose") + }, + action = { + TextButton(onClick = { cfrVisible = false }) { + Text(text = "Dismiss") + } + }, + ) { + Box(modifier = Modifier.size(300.dp)) { + Text( + text = "This is the thing the CFR is anchored to", + modifier = Modifier.align(alignment = Alignment.Center), + ) + } + } + + Spacer(modifier = Modifier.height(60.dp)) + + Box(modifier = Modifier.size(100.dp)) { + Text( + text = "This is just another element", + modifier = Modifier.align(alignment = Alignment.Center), + ) + } + + Spacer(modifier = Modifier.height(60.dp)) + + Button(onClick = { cfrVisible = true }) { + Text(text = "Show CFR") + } + } +} diff --git a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationEngineState.kt b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationEngineState.kt index 1885c650a4..faa1513ec9 100644 --- a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationEngineState.kt +++ b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationEngineState.kt @@ -10,6 +10,7 @@ package mozilla.components.concept.engine.translate * @property detectedLanguages Detected information about preferences and page information. * @property error If an error state occurred or an error was reported. * @property isEngineReady If the translation engine is primed for use or will need to be loaded. +* @property hasVisibleChange If the browser has visibly started showing the translation. * @property requestedTranslationPair The language pair to translate. Usually populated after first request. */ @@ -17,6 +18,7 @@ data class TranslationEngineState( val detectedLanguages: DetectedLanguages? = null, val error: String? = null, val isEngineReady: Boolean? = false, + val hasVisibleChange: Boolean? = false, val requestedTranslationPair: TranslationPair? = null, ) diff --git a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationOperation.kt b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationOperation.kt index 0f9b62029f..28dfd8b80c 100644 --- a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationOperation.kt +++ b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/translate/TranslationOperation.kt @@ -36,6 +36,13 @@ enum class TranslationOperation { FETCH_PAGE_SETTINGS, /** + * Fetch the translations offer setting. + * Note: this request is also encompassed in [FETCH_PAGE_SETTINGS], but intended for checking + * fetching for global settings or when only this setting is needed. + */ + FETCH_OFFER_SETTING, + + /** * Fetch the user preference on whether to offer, always translate, or never translate for * all supported language settings. */ diff --git a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/webextension/WebExtensionDelegate.kt b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/webextension/WebExtensionDelegate.kt index fce18e3863..a2e8b18699 100644 --- a/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/webextension/WebExtensionDelegate.kt +++ b/mobile/android/android-components/components/concept/engine/src/main/java/mozilla/components/concept/engine/webextension/WebExtensionDelegate.kt @@ -49,6 +49,13 @@ interface WebExtensionDelegate { fun onReady(extension: WebExtension) = Unit /** + * Invoked when optional permissions for a web extension have changed. + * + * @param extension The [WebExtension] for which permissions have changed. + */ + fun onOptionalPermissionsChanged(extension: WebExtension) = Unit + + /** * Invoked when a web extension in private browsing allowed is set. * * @param extension the modified [WebExtension] instance. diff --git a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/example_mdn.json b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/example_mdn.json index d08b78f9b7..4e6b1d6a98 100644 --- a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/example_mdn.json +++ b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/example_mdn.json @@ -5,33 +5,42 @@ "display": "standalone", "background_color": "#ffffff", "description": "A simply readable Hacker News app.", - "icons": [{ - "src": "images/touch/homescreen48.png", - "sizes": "48x48", - "type": "image/png" - }, { - "src": "images/touch/homescreen72.png", - "sizes": "72x72", - "type": "image/png" - }, { - "src": "images/touch/homescreen96.png", - "sizes": "96x96", - "type": "image/png" - }, { - "src": "images/touch/homescreen144.png", - "sizes": "144x144", - "type": "image/png" - }, { - "src": "images/touch/homescreen168.png", - "sizes": "168x168", - "type": "image/png" - }, { - "src": "images/touch/homescreen192.png", - "sizes": "192x192", - "type": "image/png" - }], - "related_applications": [{ - "platform": "play", - "url": "https://play.google.com/store/apps/details?id=cheeaun.hackerweb" - }] + "icons": [ + { + "src": "images/touch/homescreen48.png", + "sizes": "48x48", + "type": "image/png" + }, + { + "src": "images/touch/homescreen72.png", + "sizes": "72x72", + "type": "image/png" + }, + { + "src": "images/touch/homescreen96.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "images/touch/homescreen144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "images/touch/homescreen168.png", + "sizes": "168x168", + "type": "image/png" + }, + { + "src": "images/touch/homescreen192.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "related_applications": [ + { + "platform": "play", + "url": "https://play.google.com/store/apps/details?id=cheeaun.hackerweb" + } + ] } diff --git a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/spec_typical.json b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/spec_typical.json index 3f180353eb..82aeb2c95f 100644 --- a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/spec_typical.json +++ b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/spec_typical.json @@ -4,17 +4,21 @@ "name": "Super Racer 3000", "description": "The ultimate futuristic racing game from the future!", "short_name": "Racer3K", - "icons": [{ - "src": "icon/lowres.webp", - "sizes": "64x64", - "type": "image/webp" - },{ - "src": "icon/lowres.png", - "sizes": "64x64" - }, { - "src": "icon/hd_hi", - "sizes": "128x128" - }], + "icons": [ + { + "src": "icon/lowres.webp", + "sizes": "64x64", + "type": "image/webp" + }, + { + "src": "icon/lowres.png", + "sizes": "64x64" + }, + { + "src": "icon/hd_hi", + "sizes": "128x128" + } + ], "scope": "/racer/", "start_url": "/racer/start.html", "display": "fullscreen", @@ -26,26 +30,34 @@ "scope": "/racer/", "update_via_cache": "none" }, - "screenshots": [{ - "src": "screenshots/in-game-1x.jpg", - "sizes": "640x480", - "type": "image/jpeg" - },{ - "src": "screenshots/in-game-2x.jpg", - "sizes": "1280x920", - "type": "image/jpeg" - }], - "related_applications": [{ - "platform": "play", - "url": "https://play.google.com/store/apps/details?id=com.example.app1", - "id": "com.example.app1", - "min_version": "2", - "fingerprints": [{ - "type": "sha256_cert", - "value": "92:5A:39:05:C5:B9:EA:BC:71:48:5F:F2" - }] - }, { - "platform": "itunes", - "url": "https://itunes.apple.com/app/example-app1/id123456789" - }] + "screenshots": [ + { + "src": "screenshots/in-game-1x.jpg", + "sizes": "640x480", + "type": "image/jpeg" + }, + { + "src": "screenshots/in-game-2x.jpg", + "sizes": "1280x920", + "type": "image/jpeg" + } + ], + "related_applications": [ + { + "platform": "play", + "url": "https://play.google.com/store/apps/details?id=com.example.app1", + "id": "com.example.app1", + "min_version": "2", + "fingerprints": [ + { + "type": "sha256_cert", + "value": "92:5A:39:05:C5:B9:EA:BC:71:48:5F:F2" + } + ] + }, + { + "platform": "itunes", + "url": "https://itunes.apple.com/app/example-app1/id123456789" + } + ] } diff --git a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/twitter_mobile.json b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/twitter_mobile.json index 142ce0317e..2f661ffc34 100644 --- a/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/twitter_mobile.json +++ b/mobile/android/android-components/components/concept/engine/src/test/resources/manifests/twitter_mobile.json @@ -1 +1,28 @@ -{"background_color":"#ffffff","description":"It's what's happening. From breaking news and entertainment, sports and politics, to big events and everyday interests.","display":"standalone","gcm_sender_id":"49625052041","gcm_user_visible_only":true,"icons":[{"src":"https://abs.twimg.com/responsive-web/web/icon-default.604e2486a34a2f6e1.png","sizes":"192x192","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/web/icon-default.604e2486a34a2f6e1.png","sizes":"512x512","type":"image/png"}],"name":"Twitter","share_target":{"action":"compose/tweet","params":{"title":"title","text":"text","url":"url"}},"short_name":"Twitter","start_url":"/","theme_color":"#ffffff","scope":"/"} +{ + "background_color": "#ffffff", + "description": "It's what's happening. From breaking news and entertainment, sports and politics, to big events and everyday interests.", + "display": "standalone", + "gcm_sender_id": "49625052041", + "gcm_user_visible_only": true, + "icons": [ + { + "src": "https://abs.twimg.com/responsive-web/web/icon-default.604e2486a34a2f6e1.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "https://abs.twimg.com/responsive-web/web/icon-default.604e2486a34a2f6e1.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "name": "Twitter", + "share_target": { + "action": "compose/tweet", + "params": { "title": "title", "text": "text", "url": "url" } + }, + "short_name": "Twitter", + "start_url": "/", + "theme_color": "#ffffff", + "scope": "/" +} diff --git a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt index fe46cc5b90..e7c0b1650e 100644 --- a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt +++ b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt @@ -46,6 +46,9 @@ sealed class AccountEvent { sealed class DeviceCommandIncoming { /** A command to open a list of tabs on the current device */ class TabReceived(val from: Device?, val entries: List<TabData>) : DeviceCommandIncoming() + + /** A command to close one or more tabs that are open on the current device */ + class TabsClosed(val from: Device?, val urls: List<String>) : DeviceCommandIncoming() } /** @@ -54,6 +57,9 @@ sealed class DeviceCommandIncoming { sealed class DeviceCommandOutgoing { /** A command to open a tab on another device */ class SendTab(val title: String, val url: String) : DeviceCommandOutgoing() + + /** A command to close one or more tabs that are open on another device */ + class CloseTab(val urls: List<String>) : DeviceCommandOutgoing() } /** diff --git a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/Devices.kt b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/Devices.kt index 94b022ce20..876ab86eb6 100644 --- a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/Devices.kt +++ b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/Devices.kt @@ -158,6 +158,7 @@ data class DeviceConfig( */ enum class DeviceCapability { SEND_TAB, + CLOSE_TABS, } /** diff --git a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/OAuthAccount.kt b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/OAuthAccount.kt index 7737d4bc36..7ef087c86e 100644 --- a/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/OAuthAccount.kt +++ b/mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/OAuthAccount.kt @@ -40,6 +40,17 @@ data class MigratingAccountInfo( ) /** + * User data provided by the web content as a means of delivering the session token to the + * application + */ +data class UserData( + val sessionToken: String, + val email: String, + val uid: String, + val verified: Boolean, +) + +/** * Representing all the possible entry points into FxA * * These entry points will be reflected in the authentication URL and will be tracked @@ -111,6 +122,14 @@ interface OAuthAccount : AutoCloseable { suspend fun getProfile(ignoreCache: Boolean = false): Profile? /** + * Sets the user data given by the web content finishing the OAuth flow. + * This should only be used by user agents that need the session token + * + * @param userData: The user data provided by the web content, including the session token + */ + suspend fun setUserData(userData: UserData) + + /** * Authenticates the current account using the [code] and [state] parameters obtained via the * OAuth flow initiated by [beginOAuthFlow]. * diff --git a/mobile/android/android-components/components/feature/accounts-push/build.gradle b/mobile/android/android-components/components/feature/accounts-push/build.gradle index c87fa7582a..17bc5d8313 100644 --- a/mobile/android/android-components/components/feature/accounts-push/build.gradle +++ b/mobile/android/android-components/components/feature/accounts-push/build.gradle @@ -37,6 +37,7 @@ tasks.withType(KotlinCompile).configureEach { } dependencies { + implementation project(':browser-state') implementation project(':service-firefox-accounts') implementation project(':support-ktx') implementation project(':support-base') @@ -47,7 +48,9 @@ dependencies { implementation ComponentsDependencies.androidx_lifecycle_process implementation ComponentsDependencies.kotlin_coroutines + testImplementation project(':concept-engine') testImplementation project(':support-test') + testImplementation project(':support-test-libstate') testImplementation ComponentsDependencies.androidx_test_core testImplementation ComponentsDependencies.androidx_test_junit diff --git a/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsFeature.kt b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsFeature.kt new file mode 100644 index 0000000000..8767064867 --- /dev/null +++ b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsFeature.kt @@ -0,0 +1,93 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.accounts.push + +import androidx.annotation.VisibleForTesting +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.ProcessLifecycleOwner +import mozilla.components.browser.state.action.TabListAction +import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.sync.AccountEvent +import mozilla.components.concept.sync.AccountEventsObserver +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceCommandIncoming +import mozilla.components.concept.sync.DeviceConstellation +import mozilla.components.service.fxa.manager.FxaAccountManager + +/** + * A feature for closing tabs on this device from other devices + * in the [DeviceConstellation]. + * + * This feature receives commands to close tabs using the [FxaAccountManager]. + * + * See [CloseTabsUseCases] for the ability to close tabs that are open on + * other devices from this device. + * + * @param browserStore The [BrowserStore] that holds the currently open tabs. + * @param accountManager The account manager. + * @param owner The Android lifecycle owner for the observers. Defaults to + * the [ProcessLifecycleOwner]. + * @param autoPause Whether or not the observer should automatically be + * paused/resumed with the bound lifecycle. + * @param onTabsClosed The callback invoked when one or more tabs are closed. + */ +class CloseTabsFeature( + private val browserStore: BrowserStore, + private val accountManager: FxaAccountManager, + private val owner: LifecycleOwner = ProcessLifecycleOwner.get(), + private val autoPause: Boolean = false, + onTabsClosed: (Device?, List<String>) -> Unit, +) { + @VisibleForTesting internal val observer = TabsClosedEventsObserver { device, urls -> + val tabsToRemove = getTabsToRemove(urls) + if (tabsToRemove.isNotEmpty()) { + browserStore.dispatch(TabListAction.RemoveTabsAction(tabsToRemove.map { it.id })) + onTabsClosed(device, tabsToRemove.map { it.content.url }) + } + } + + /** + * Begins observing the [accountManager] for "tabs closed" events. + */ + fun observe() { + accountManager.registerForAccountEvents(observer, owner, autoPause) + } + + private fun getTabsToRemove(remotelyClosedUrls: List<String>): List<TabSessionState> { + // The user might have the same URL open in multiple tabs on this device, and might want + // to remotely close some or all of those tabs. Synced tabs don't carry enough + // information to know which duplicates the user meant to close, so we use a heuristic: + // if a URL appears N times in the remotely closed URLs list, we'll close up to + // N instances of that URL. + val countsByUrl = remotelyClosedUrls.groupingBy { it }.eachCount() + return browserStore.state.tabs + .groupBy { it.content.url } + .asSequence() + .mapNotNull { (url, tabs) -> + countsByUrl[url]?.let { count -> tabs.take(count) } + } + .flatten() + .toList() + } +} + +internal class TabsClosedEventsObserver( + internal val onTabsClosed: (Device?, List<String>) -> Unit, +) : AccountEventsObserver { + override fun onEvents(events: List<AccountEvent>) { + // Group multiple commands from the same device, so that we can close + // more tabs at once. + events.asSequence() + .filterIsInstance<AccountEvent.DeviceCommandIncoming>() + .map { it.command } + .filterIsInstance<DeviceCommandIncoming.TabsClosed>() + .groupingBy { it.from } + .fold(emptyList<String>()) { urls, command -> urls + command.urls } + .forEach { (device, urls) -> + onTabsClosed(device, urls) + } + } +} diff --git a/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsUseCases.kt b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsUseCases.kt new file mode 100644 index 0000000000..845ae27a98 --- /dev/null +++ b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/CloseTabsUseCases.kt @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.accounts.push + +import androidx.annotation.VisibleForTesting +import androidx.annotation.WorkerThread +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceCapability +import mozilla.components.concept.sync.DeviceCommandOutgoing +import mozilla.components.concept.sync.DeviceConstellation +import mozilla.components.service.fxa.manager.FxaAccountManager + +/** + * Use cases for closing tabs that are open on other devices in the [DeviceConstellation]. + * + * The use cases send commands to close tabs using the [FxaAccountManager]. + * + * See [CloseTabsFeature] for the ability to close tabs on this device from + * other devices. + * + * @param accountManager The account manager. + */ +class CloseTabsUseCases(private val accountManager: FxaAccountManager) { + /** + * Closes a tab that's currently open on another device. + * + * @param deviceId The ID of the device on which the tab is currently open. + * @param url The URL of the tab to close. + * @return Whether the command to close the tab was sent to the device. + */ + @WorkerThread + suspend fun close(deviceId: String, url: String): Boolean { + filterCloseTabsDevices(accountManager) { constellation, devices -> + val device = devices.firstOrNull { it.id == deviceId } + device?.let { + return constellation.sendCommandToDevice( + device.id, + DeviceCommandOutgoing.CloseTab(listOf(url)), + ) + } + } + + return false + } +} + +@VisibleForTesting +internal inline fun filterCloseTabsDevices( + accountManager: FxaAccountManager, + block: (DeviceConstellation, Collection<Device>) -> Unit, +) { + val constellation = accountManager.authenticatedAccount()?.deviceConstellation() ?: return + + constellation.state()?.let { state -> + state.otherDevices.filter { + it.capabilities.contains(DeviceCapability.CLOSE_TABS) + }.let { devices -> + block(constellation, devices) + } + } +} diff --git a/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/SendTabFeature.kt b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/SendTabFeature.kt index 4f049a790b..931dcf59a6 100644 --- a/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/SendTabFeature.kt +++ b/mobile/android/android-components/components/feature/accounts-push/src/main/java/mozilla/components/feature/accounts/push/SendTabFeature.kt @@ -24,7 +24,7 @@ import mozilla.components.support.base.log.logger.Logger * * See [SendTabUseCases] for the ability to send tabs to other devices. * - * @param accountManager Firefox account manager. + * @param accountManager Account manager. * @param owner Android lifecycle owner for the observers. Defaults to the [ProcessLifecycleOwner] * so that we can always observe events throughout the application lifecycle. * @param autoPause whether or not the observer should automatically be @@ -38,7 +38,7 @@ class SendTabFeature( onTabsReceived: (Device?, List<TabData>) -> Unit, ) { init { - val observer = EventsObserver(onTabsReceived) + val observer = TabReceivedEventsObserver(onTabsReceived) // Observe the account for all account events, although we'll ignore // non send-tab command events. @@ -46,10 +46,10 @@ class SendTabFeature( } } -internal class EventsObserver( +internal class TabReceivedEventsObserver( private val onTabsReceived: (Device?, List<TabData>) -> Unit, ) : AccountEventsObserver { - private val logger = Logger("EventsObserver") + private val logger = Logger("TabReceivedEventsObserver") override fun onEvents(events: List<AccountEvent>) { events.asSequence() diff --git a/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsFeatureTest.kt b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsFeatureTest.kt new file mode 100644 index 0000000000..7b18681dce --- /dev/null +++ b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsFeatureTest.kt @@ -0,0 +1,136 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.accounts.push + +import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceCapability +import mozilla.components.concept.sync.DeviceType +import mozilla.components.support.test.any +import mozilla.components.support.test.eq +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.mock +import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.mockito.Mockito.never +import org.mockito.Mockito.verify + +class CloseTabsFeatureTest { + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + + private val device123 = Device( + id = "123", + displayName = "Charcoal", + deviceType = DeviceType.DESKTOP, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = listOf(DeviceCapability.CLOSE_TABS), + subscriptionExpired = true, + subscription = null, + ) + + @Test + fun `GIVEN a notification to close multiple URLs WHEN all URLs are open in tabs THEN all tabs are closed and the callback is invoked`() { + val urls = listOf( + "https://mozilla.org", + "https://getfirefox.com", + "https://example.org", + "https://getthunderbird.com", + ) + val browserStore = BrowserStore( + BrowserState( + tabs = urls.map { createTab(it) }, + ), + ) + val callback: (Device?, List<String>) -> Unit = mock() + val feature = CloseTabsFeature( + browserStore, + accountManager = mock(), + owner = mock(), + onTabsClosed = callback, + ) + + feature.observer.onTabsClosed(device123, urls) + + browserStore.waitUntilIdle() + + assertTrue(browserStore.state.tabs.isEmpty()) + verify(callback).invoke(eq(device123), eq(urls)) + } + + @Test + fun `GIVEN a notification to close a URL WHEN the URL is not open in a tab THEN the callback is not invoked`() { + val browserStore = BrowserStore() + val callback: (Device?, List<String>) -> Unit = mock() + val feature = CloseTabsFeature( + browserStore, + accountManager = mock(), + owner = mock(), + onTabsClosed = callback, + ) + + feature.observer.onTabsClosed(device123, listOf("https://mozilla.org")) + + browserStore.waitUntilIdle() + + verify(callback, never()).invoke(any(), any()) + } + + @Test + fun `GIVEN a notification to close duplicate URLs WHEN the duplicate URLs are open in tabs THEN the number of tabs closed matches the number of URLs and the callback is invoked`() { + val browserStore = BrowserStore( + BrowserState( + tabs = listOf( + createTab("https://mozilla.org", id = "1"), + createTab("https://mozilla.org", id = "2"), + createTab("https://getfirefox.com", id = "3"), + createTab("https://getfirefox.com", id = "4"), + createTab("https://getfirefox.com", id = "5"), + createTab("https://getthunderbird.com", id = "6"), + createTab("https://example.org", id = "7"), + ), + ), + ) + val callback: (Device?, List<String>) -> Unit = mock() + val feature = CloseTabsFeature( + browserStore, + accountManager = mock(), + owner = mock(), + onTabsClosed = callback, + ) + + feature.observer.onTabsClosed( + device123, + listOf( + "https://mozilla.org", + "https://getfirefox.com", + "https://getfirefox.com", + "https://example.org", + "https://example.org", + ), + ) + + browserStore.waitUntilIdle() + + assertEquals(listOf("2", "5", "6"), browserStore.state.tabs.map { it.id }) + verify(callback).invoke( + eq(device123), + eq( + listOf( + "https://mozilla.org", + "https://getfirefox.com", + "https://getfirefox.com", + "https://example.org", + ), + ), + ) + } +} diff --git a/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsUseCasesTest.kt b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsUseCasesTest.kt new file mode 100644 index 0000000000..4aae8c84f6 --- /dev/null +++ b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/CloseTabsUseCasesTest.kt @@ -0,0 +1,100 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.accounts.push + +import mozilla.components.concept.sync.ConstellationState +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceCapability +import mozilla.components.concept.sync.DeviceConstellation +import mozilla.components.concept.sync.DeviceType +import mozilla.components.concept.sync.OAuthAccount +import mozilla.components.service.fxa.manager.FxaAccountManager +import mozilla.components.support.test.any +import mozilla.components.support.test.mock +import mozilla.components.support.test.rule.MainCoroutineRule +import mozilla.components.support.test.rule.runTestOnMain +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` + +class CloseTabsUseCasesTest { + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + + private val device123 = Device( + id = "123", + displayName = "Charcoal", + deviceType = DeviceType.DESKTOP, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = listOf(DeviceCapability.CLOSE_TABS), + subscriptionExpired = true, + subscription = null, + ) + + private val device1234 = Device( + id = "1234", + displayName = "Ruby", + deviceType = DeviceType.DESKTOP, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = emptyList(), + subscriptionExpired = true, + subscription = null, + ) + + private val manager: FxaAccountManager = mock() + private val account: OAuthAccount = mock() + private val constellation: DeviceConstellation = mock() + private val state: ConstellationState = mock() + + @Before + fun setUp() { + `when`(manager.authenticatedAccount()).thenReturn(account) + `when`(account.deviceConstellation()).thenReturn(constellation) + `when`(constellation.state()).thenReturn(state) + } + + @Test + fun `GIVEN a list of devices WHEN one device supports the close tabs command THEN filtering returns that device`() { + val deviceIds = mutableListOf<String>() + `when`(state.otherDevices).thenReturn(listOf(device123, device1234)) + filterCloseTabsDevices(manager) { _, devices -> + deviceIds.addAll(devices.map { it.id }) + } + + assertEquals(listOf("123"), deviceIds) + } + + @Test + fun `GIVEN a constellation with one capable device WHEN sending a close tabs command to that device THEN the command is sent`() = runTestOnMain { + val useCases = CloseTabsUseCases(manager) + + `when`(state.otherDevices).thenReturn(listOf(device123)) + `when`(constellation.sendCommandToDevice(any(), any())) + .thenReturn(true) + + useCases.close("123", "http://example.com") + + verify(constellation).sendCommandToDevice(any(), any()) + } + + @Test + fun `GIVEN a constellation with one incapable device WHEN sending a close tabs command to that device THEN the command is not sent`() = runTestOnMain { + val useCases = CloseTabsUseCases(manager) + + `when`(state.otherDevices).thenReturn(listOf(device1234)) + `when`(constellation.sendCommandToDevice(any(), any())) + .thenReturn(false) + + useCases.close("1234", "http://example.com") + + verify(constellation, never()).sendCommandToDevice(any(), any()) + } +} diff --git a/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/EventsObserverTest.kt b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/TabReceivedEventsObserverTest.kt index 6de8ff42f6..1b8128d4ba 100644 --- a/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/EventsObserverTest.kt +++ b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/TabReceivedEventsObserverTest.kt @@ -15,11 +15,11 @@ import org.junit.Test import org.mockito.Mockito.times import org.mockito.Mockito.verify -class EventsObserverTest { +class TabReceivedEventsObserverTest { @Test fun `events are delivered successfully`() { val callback: (Device?, List<TabData>) -> Unit = mock() - val observer = EventsObserver(callback) + val observer = TabReceivedEventsObserver(callback) val events = listOf(AccountEvent.DeviceCommandIncoming(command = DeviceCommandIncoming.TabReceived(mock(), mock()))) observer.onEvents(events) @@ -34,7 +34,7 @@ class EventsObserverTest { @Test fun `only TabReceived commands are delivered`() { val callback: (Device?, List<TabData>) -> Unit = mock() - val observer = EventsObserver(callback) + val observer = TabReceivedEventsObserver(callback) val events = listOf( AccountEvent.ProfileUpdated, AccountEvent.DeviceCommandIncoming(command = DeviceCommandIncoming.TabReceived(mock(), mock())), diff --git a/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/TabsClosedEventsObserverTest.kt b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/TabsClosedEventsObserverTest.kt new file mode 100644 index 0000000000..8d51d0b812 --- /dev/null +++ b/mobile/android/android-components/components/feature/accounts-push/src/test/java/mozilla/components/feature/accounts/push/TabsClosedEventsObserverTest.kt @@ -0,0 +1,183 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.feature.accounts.push + +import mozilla.components.concept.sync.AccountEvent +import mozilla.components.concept.sync.Device +import mozilla.components.concept.sync.DeviceCapability +import mozilla.components.concept.sync.DeviceCommandIncoming +import mozilla.components.concept.sync.DeviceType +import mozilla.components.support.test.any +import mozilla.components.support.test.eq +import mozilla.components.support.test.mock +import org.junit.Test +import org.mockito.Mockito.times +import org.mockito.Mockito.verify + +class TabsClosedEventsObserverTest { + private val device123 = Device( + id = "123", + displayName = "Charcoal", + deviceType = DeviceType.DESKTOP, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = listOf(DeviceCapability.CLOSE_TABS), + subscriptionExpired = true, + subscription = null, + ) + + private val device1234 = Device( + id = "1234", + displayName = "Emerald", + deviceType = DeviceType.MOBILE, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = listOf(DeviceCapability.CLOSE_TABS), + subscriptionExpired = true, + subscription = null, + ) + + private val device12345 = Device( + id = "12345", + displayName = "Sapphire", + deviceType = DeviceType.MOBILE, + isCurrentDevice = false, + lastAccessTime = null, + capabilities = listOf(DeviceCapability.CLOSE_TABS), + subscriptionExpired = true, + subscription = null, + ) + + @Test + fun `GIVEN a tabs closed command WHEN the observer is notified THEN the callback is invoked`() { + val callback: (Device?, List<String>) -> Unit = mock() + val observer = TabsClosedEventsObserver(callback) + val events = listOf( + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + null, + listOf("https://mozilla.org"), + ), + ), + ) + + observer.onEvents(events) + + verify(callback).invoke(eq(null), eq(listOf("https://mozilla.org"))) + } + + @Test + fun `GIVEN a tabs closed command from a device WHEN the observer is notified THEN the callback is invoked`() { + val callback: (Device?, List<String>) -> Unit = mock() + val observer = TabsClosedEventsObserver(callback) + val events = listOf( + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://mozilla.org"), + ), + ), + ) + + observer.onEvents(events) + + verify(callback).invoke(eq(device123), eq(listOf("https://mozilla.org"))) + } + + @Test + fun `GIVEN multiple commands WHEN the observer is notified THEN the callback is only invoked for the tabs closed commands`() { + val callback: (Device?, List<String>) -> Unit = mock() + val observer = TabsClosedEventsObserver(callback) + val events = listOf( + AccountEvent.ProfileUpdated, + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://mozilla.org"), + ), + ), + ) + + observer.onEvents(events) + + verify(callback, times(1)).invoke(eq(device123), eq(listOf("https://mozilla.org"))) + } + + @Test + fun `GIVEN multiple tabs closed commands from the same device WHEN the observer is notified THEN the callback is invoked once`() { + val callback: (Device?, List<String>) -> Unit = mock() + val observer = TabsClosedEventsObserver(callback) + val events = listOf( + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://mozilla.org", "https://getfirefox.com"), + ), + ), + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://example.org"), + ), + ), + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://getthunderbird.com"), + ), + ), + ) + + observer.onEvents(events) + + verify(callback, times(1)).invoke( + eq(device123), + eq( + listOf( + "https://mozilla.org", + "https://getfirefox.com", + "https://example.org", + "https://getthunderbird.com", + ), + ), + ) + } + + @Test + fun `GIVEN multiple tabs closed commands from different devices WHEN the observer is notified THEN the callback is invoked once per device`() { + val callback: (Device?, List<String>) -> Unit = mock() + val observer = TabsClosedEventsObserver(callback) + val events = listOf( + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + null, + listOf("https://mozilla.org"), + ), + ), + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device123, + listOf("https://mozilla.org"), + ), + ), + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device1234, + listOf("https://mozilla.org"), + ), + ), + AccountEvent.DeviceCommandIncoming( + command = DeviceCommandIncoming.TabsClosed( + device12345, + listOf("https://mozilla.org"), + ), + ), + ) + + observer.onEvents(events) + + verify(callback, times(4)).invoke(any(), eq(listOf("https://mozilla.org"))) + } +} diff --git a/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/background.js b/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/background.js index b90f57154a..e8cf40ba8d 100644 --- a/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/background.js +++ b/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/background.js @@ -10,12 +10,12 @@ let port = browser.runtime.connectNative(WEB_CHANNEL_BACKGROUND_MESSAGING_ID); /* Handle messages from native application, register content script for specific url. */ -port.onMessage.addListener( event => { - if(event.type == "overrideFxAServer"){ +port.onMessage.addListener(event => { + if (event.type == "overrideFxAServer") { browser.contentScripts.register({ - "matches": [ event.url+"/*" ], - "js": [{file: "fxawebchannel.js"}], - "runAt": "document_start" + matches: [event.url + "/*"], + js: [{ file: "fxawebchannel.js" }], + runAt: "document_start", }); port.disconnect(); } diff --git a/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/fxawebchannel.js b/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/fxawebchannel.js index 2f5934dff1..16614d3069 100644 --- a/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/fxawebchannel.js +++ b/mobile/android/android-components/components/feature/accounts/src/main/assets/extensions/fxawebchannel/fxawebchannel.js @@ -10,16 +10,18 @@ let port = browser.runtime.connectNative("mozacWebchannel"); /* Handle messages from native application, dispatch them to FxA via an event. */ -port.onMessage.addListener((event) => { - window.dispatchEvent(new CustomEvent('WebChannelMessageToContent', { - detail: JSON.stringify(event) - })); +port.onMessage.addListener(event => { + window.dispatchEvent( + new CustomEvent("WebChannelMessageToContent", { + detail: JSON.stringify(event), + }) + ); }); /* Handle messages from FxA. Messages are posted to the native application for processing. */ -window.addEventListener('WebChannelMessageToChrome', function (e) { +window.addEventListener("WebChannelMessageToChrome", function (e) { const detail = JSON.parse(e.detail); port.postMessage(detail); }); diff --git a/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeature.kt b/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeature.kt index 60913282b7..b244eb0de8 100644 --- a/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeature.kt +++ b/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeature.kt @@ -38,10 +38,15 @@ class FirefoxAccountsAuthFeature( * @param context [Context] The application context * @param entrypoint [FxAEntryPoint] The Firefox Accounts feature/entrypoint that is launching * authentication + * @param scopes [Set<String>] The oAuth scopes being requested */ - fun beginAuthentication(context: Context, entrypoint: FxAEntryPoint) { + fun beginAuthentication( + context: Context, + entrypoint: FxAEntryPoint, + scopes: Set<String> = emptySet(), + ) { beginAuthenticationAsync(context) { - accountManager.beginAuthentication(entrypoint = entrypoint) + accountManager.beginAuthentication(entrypoint = entrypoint, authScopes = scopes) } } @@ -50,15 +55,17 @@ class FirefoxAccountsAuthFeature( * @param context [Context] The application context * @param pairingUrl [String] The pairing URL retrieved from the QR scanner * @param entrypoint [FxAEntryPoint] The Firefox Accounts feature/entrypoint that is launching + * @param scopes [Set<String>] The oAuth scopes being requested * authentication */ fun beginPairingAuthentication( context: Context, pairingUrl: String, entrypoint: FxAEntryPoint, + scopes: Set<String> = emptySet(), ) { beginAuthenticationAsync(context) { - accountManager.beginAuthentication(pairingUrl, entrypoint = entrypoint) + accountManager.beginAuthentication(pairingUrl, entrypoint = entrypoint, scopes) } } diff --git a/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FxaWebChannelFeature.kt b/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FxaWebChannelFeature.kt index f5554c99e4..377d6b0d93 100644 --- a/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FxaWebChannelFeature.kt +++ b/mobile/android/android-components/components/feature/accounts/src/main/java/mozilla/components/feature/accounts/FxaWebChannelFeature.kt @@ -20,6 +20,7 @@ import mozilla.components.concept.engine.webextension.MessageHandler import mozilla.components.concept.engine.webextension.Port import mozilla.components.concept.engine.webextension.WebExtensionRuntime import mozilla.components.concept.sync.AuthType +import mozilla.components.concept.sync.UserData import mozilla.components.lib.state.ext.flowScoped import mozilla.components.service.fxa.FxaAuthData import mozilla.components.service.fxa.ServerConfig @@ -157,6 +158,7 @@ class FxaWebChannelFeature( WebChannelCommand.CAN_LINK_ACCOUNT -> processCanLinkAccountCommand(messageId) WebChannelCommand.FXA_STATUS -> processFxaStatusCommand(accountManager, messageId, fxaCapabilities) WebChannelCommand.OAUTH_LOGIN -> processOauthLoginCommand(accountManager, payload) + WebChannelCommand.LOGIN -> processLoginCommand(accountManager, payload) } response?.let { port.postMessage(it) } } @@ -195,6 +197,7 @@ class FxaWebChannelFeature( enum class WebChannelCommand { CAN_LINK_ACCOUNT, + LOGIN, OAUTH_LOGIN, FXA_STATUS, } @@ -222,6 +225,12 @@ class FxaWebChannelFeature( private const val COMMAND_STATUS = "fxaccounts:fxa_status" /** + * Gets triggered when the web content is signed in/up, but not necessarily verified + * it passes in its payload the session token the web content is holding on to + */ + private const val COMMAND_LOGIN = "fxaccounts:login" + + /** * Handles the [COMMAND_CAN_LINK_ACCOUNT] event from the web-channel. * Currently this always response with 'ok=true'. * On Fx Desktop, this event prompts a possible "another user was previously logged in on @@ -329,6 +338,32 @@ class FxaWebChannelFeature( } /** + * Handles the [COMMAND_LOGIN] event from the web-channel + */ + private fun processLoginCommand(accountManager: FxaAccountManager, payload: JSONObject): JSONObject? { + val sessionToken: String + val email: String + val uid: String + val verified: Boolean + + try { + val data = payload.getJSONObject("data") + sessionToken = data.getString("sessionToken") + email = data.getString("email") + uid = data.getString("uid") + verified = data.getBoolean("verified") + } catch (e: JSONException) { + logger.error("Error while processing WebChannel login command", e) + return null + } + val userData = UserData(sessionToken, email, uid, verified) + CoroutineScope(Dispatchers.Main).launch { + accountManager.setUserData(userData) + } + return null + } + + /** * Handles the [COMMAND_OAUTH_LOGIN] event from the web-channel. */ private fun processOauthLoginCommand(accountManager: FxaAccountManager, payload: JSONObject): JSONObject? { @@ -368,6 +403,7 @@ class FxaWebChannelFeature( COMMAND_CAN_LINK_ACCOUNT -> WebChannelCommand.CAN_LINK_ACCOUNT COMMAND_OAUTH_LOGIN -> WebChannelCommand.OAUTH_LOGIN COMMAND_STATUS -> WebChannelCommand.FXA_STATUS + COMMAND_LOGIN -> WebChannelCommand.LOGIN else -> { logger.warn("Unrecognized WebChannel command: $this") null diff --git a/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeatureTest.kt b/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeatureTest.kt index a32681e8fe..ef7f78b336 100644 --- a/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeatureTest.kt +++ b/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FirefoxAccountsAuthFeatureTest.kt @@ -17,8 +17,8 @@ import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.DeviceConfig import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.FxAEntryPoint -import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile +import mozilla.components.service.fxa.FirefoxAccount import mozilla.components.service.fxa.FxaAuthData import mozilla.components.service.fxa.ServerConfig import mozilla.components.service.fxa.StorageWrapper @@ -45,13 +45,13 @@ internal class TestableStorageWrapper( manager: FxaAccountManager, accountEventObserverRegistry: ObserverRegistry<AccountEventsObserver>, serverConfig: ServerConfig, - private val block: () -> OAuthAccount = { - val account: OAuthAccount = mock() + private val block: () -> FirefoxAccount = { + val account: FirefoxAccount = mock() `when`(account.deviceConstellation()).thenReturn(mock()) account }, ) : StorageWrapper(manager, accountEventObserverRegistry, serverConfig) { - override fun obtainAccount(): OAuthAccount = block() + override fun obtainAccount(): FirefoxAccount = block() } // Same as the actual account manager, except we get to control how FirefoxAccountShaped instances @@ -63,7 +63,7 @@ class TestableFxaAccountManager( config: ServerConfig, scopes: Set<String>, coroutineContext: CoroutineContext, - block: () -> OAuthAccount = { mock() }, + block: () -> FirefoxAccount = { mock() }, ) : FxaAccountManager(context, config, DeviceConfig("test", DeviceType.MOBILE, setOf()), null, scopes, null, coroutineContext) { private val testableStorageWrapper = TestableStorageWrapper(this, accountEventObserverRegistry, serverConfig, block) override fun getStorageWrapper(): StorageWrapper { @@ -252,7 +252,7 @@ class FirefoxAccountsAuthFeatureTest { private suspend fun prepareAccountManagerForSuccessfulAuthentication( coroutineContext: CoroutineContext, ): TestableFxaAccountManager { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") `when`(mockAccount.deviceConstellation()).thenReturn(mock()) @@ -279,7 +279,7 @@ class FirefoxAccountsAuthFeatureTest { private suspend fun prepareAccountManagerForFailedAuthentication( coroutineContext: CoroutineContext, ): TestableFxaAccountManager { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") `when`(mockAccount.getProfile(anyBoolean())).thenReturn(profile) diff --git a/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FxaWebChannelFeatureTest.kt b/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FxaWebChannelFeatureTest.kt index 809ed7a703..3a49633f61 100644 --- a/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FxaWebChannelFeatureTest.kt +++ b/mobile/android/android-components/components/feature/accounts/src/test/java/mozilla/components/feature/accounts/FxaWebChannelFeatureTest.kt @@ -19,6 +19,7 @@ import mozilla.components.concept.engine.webextension.WebExtension import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile +import mozilla.components.concept.sync.UserData import mozilla.components.service.fxa.FxaAuthData import mozilla.components.service.fxa.ServerConfig import mozilla.components.service.fxa.SyncEngine @@ -701,6 +702,56 @@ class FxaWebChannelFeatureTest { assertTrue(FxaWebChannelFeature.isCommunicationAllowed("http://localhost", "http://localhost")) } + @Test + fun `COMMAND_LOGIN must be processed and sets the user's data`() = runTest { + val accountManager: FxaAccountManager = mock() // syncConfig is null by default (is not configured) + val engineSession: EngineSession = mock() + val ext: WebExtension = mock() + val port: Port = mock() + val messageHandler = argumentCaptor<MessageHandler>() + + WebExtensionController.installedExtensions[FxaWebChannelFeature.WEB_CHANNEL_EXTENSION_ID] = ext + + val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, null, emptySet(), accountManager) + webchannelFeature.start() + shadowOf(getMainLooper()).idle() + + verify(ext).registerContentMessageHandler( + eq(engineSession), + eq(FxaWebChannelFeature.WEB_CHANNEL_MESSAGING_ID), + messageHandler.capture(), + ) + messageHandler.value.onPortConnected(port) + + // Action: signin + verifyLogin("sessiontoken123", "foo@bar.com", "uid123", false, messageHandler.value, accountManager) + } + + @Test + fun `COMMAND_LOGIN invalid json sends back`() = runTest { + val accountManager: FxaAccountManager = mock() // syncConfig is null by default (is not configured) + val engineSession: EngineSession = mock() + val ext: WebExtension = mock() + val port: Port = mock() + val messageHandler = argumentCaptor<MessageHandler>() + + WebExtensionController.installedExtensions[FxaWebChannelFeature.WEB_CHANNEL_EXTENSION_ID] = ext + + val webchannelFeature = prepareFeatureForTest(ext, port, engineSession, null, emptySet(), accountManager) + webchannelFeature.start() + shadowOf(getMainLooper()).idle() + + verify(ext).registerContentMessageHandler( + eq(engineSession), + eq(FxaWebChannelFeature.WEB_CHANNEL_MESSAGING_ID), + messageHandler.capture(), + ) + messageHandler.value.onPortConnected(port) + + // Action: signin + verifyLogin("sessiontoken123", "foo@bar.com", "uid123", false, messageHandler.value, accountManager) + } + private fun JSONObject.getSupportedEngines(): List<String> { val engines = this.getJSONObject("message") .getJSONObject("data") @@ -798,6 +849,41 @@ class FxaWebChannelFeatureTest { ) } + private suspend fun verifyLogin(sessionToken: String, email: String, uid: String, verified: Boolean, messageHandler: MessageHandler, accountManager: FxaAccountManager) { + val jsonToWebChannel = jsonLogin(sessionToken, email, uid, verified) + val port = mock<Port>() + whenever(port.senderUrl()).thenReturn("https://foo.bar/email") + messageHandler.onPortMessage(jsonToWebChannel, port) + + val expectedUserData = UserData( + sessionToken = sessionToken, + email = email, + uid = uid, + verified = verified, + ) + shadowOf(getMainLooper()).idle() + + verify(accountManager).setUserData(expectedUserData) + } + + private fun jsonLogin(sessionToken: String, email: String, uid: String, verified: Boolean): JSONObject { + return JSONObject( + """{ + "message":{ + "command": "fxaccounts:login", + "messageId":123, + "data":{ + "email":"$email", + "sessionToken":"$sessionToken", + "uid":"$uid", + "verified":$verified + } + } + } + """.trimIndent(), + ) + } + private fun prepareFeatureForTest( ext: WebExtension = mock(), port: Port = mock(), diff --git a/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt b/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt index d3e12a0171..723d3e6eb1 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt +++ b/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt @@ -252,9 +252,9 @@ class AddonManager( permissions = permissions, origins = origins, onSuccess = { ext -> - val enabledAddon = addon.copy(installedState = toInstalledState(ext)) + val updatedAddon = Addon.newFromWebExtension(ext, toInstalledState(ext)) completePendingAddonAction(pendingAction) - onSuccess(enabledAddon) + onSuccess(updatedAddon) }, onError = { completePendingAddonAction(pendingAction) @@ -296,9 +296,9 @@ class AddonManager( permissions = permissions, origins = origins, onSuccess = { ext -> - val enabledAddon = addon.copy(installedState = toInstalledState(ext)) + val updatedAddon = Addon.newFromWebExtension(ext, toInstalledState(ext)) completePendingAddonAction(pendingAction) - onSuccess(enabledAddon) + onSuccess(updatedAddon) }, onError = { completePendingAddonAction(pendingAction) diff --git a/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/PermissionsDialogFragment.kt b/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/PermissionsDialogFragment.kt index 92e555e722..a19a5a61f5 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/PermissionsDialogFragment.kt +++ b/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/ui/PermissionsDialogFragment.kt @@ -153,9 +153,10 @@ class PermissionsDialogFragment : AddonDialogFragment() { }, addon.translateName(requireContext()), ) - rootView.findViewById<TextView>(R.id.optional_or_required_text).text = buildOptionalOrRequiredText() - val listPermissions = buildPermissionsList() + rootView.findViewById<TextView>(R.id.optional_or_required_text).text = + buildOptionalOrRequiredText(listPermissions.isNotEmpty()) + val permissionsRecyclerView = rootView.findViewById<RecyclerView>(R.id.permissions) val positiveButton = rootView.findViewById<Button>(R.id.allow_button) val negativeButton = rootView.findViewById<Button>(R.id.deny_button) @@ -217,7 +218,10 @@ class PermissionsDialogFragment : AddonDialogFragment() { } @VisibleForTesting - internal fun buildOptionalOrRequiredText(): String { + internal fun buildOptionalOrRequiredText(hasPermissions: Boolean): String { + if (!hasPermissions) { + return "" + } val optionalOrRequiredText = if (forOptionalPermissions) { getString(R.string.mozac_feature_addons_optional_permissions_dialog_subtitle) } else { diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-be/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-be/strings.xml index 30c37d9ad9..ac9b647423 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-be/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-be/strings.xml @@ -88,6 +88,8 @@ <string name="mozac_feature_addons_rating">Ацэнка</string> <!-- A link that points to the detail page of the add-on. --> <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Падрабязней аб гэтым дадатку</string> + <!-- A link that points to the detail page of the extension. --> + <string name="mozac_feature_addons_more_info_link_2">Падрабязней аб гэтым пашырэнні</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Налады</string> <!-- Indicates the add-on is enabled. --> @@ -148,16 +150,24 @@ <string name="mozac_feature_addons_user_rating_count_2">Водгукі: %1$s</string> <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> <string name="mozac_feature_addons_rating_content_description" moz:removedIn="124" tools:ignore="UnusedResources">%1$.02f/5</string> + <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars. --> + <string name="mozac_feature_addons_rating_content_description_2">Ацэнка: %1$.02f з 5</string> <!-- This is the title of page where all the add-ons are listed--> <string name="mozac_feature_addons_addons">Дадаткі</string> <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Менеджар дадаткаў</string> <!-- The title of the "crash" notification in the add-ons manager --> <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Дадаткі часова адключаны</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Пашырэнні часова адключаны</string> <!-- The content of the "crash" notification in the add-ons manager --> <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Адзін або некалькі дадатковых кампанентаў перасталі працаваць, што зрабіла вашу сістэму нестабільнай.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Адно або некалькі пашырэнняў перасталі працаваць, што зрабіла вашу сістэму нестабільнай.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Перазапусціць дадаткі</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Перазапусціць пашырэнні</string> <!-- Button in the add-ons manager that opens AMO in a tab --> <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Знайсці больш дадаткаў</string> <!-- Button in the extensions manager that opens AMO in a tab --> @@ -238,6 +248,8 @@ <string name="mozac_feature_addons_unsupported_caption_2">1 пашырэнне</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">Дадаткаў: %1$s</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s пашырэнняў</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Даведацца больш</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> @@ -256,6 +268,8 @@ <string name="mozac_feature_addons_installed_dialog_title">%1$s было дададзена ў %2$s</string> <!-- Text shown in the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Адкрыць яго ў меню</string> + <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> + <string name="mozac_feature_addons_installed_dialog_description_2">Доступ да %1$s з меню %2$s.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">Добра, зразумела</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-br/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-br/strings.xml index 2fb0506106..2f02310fe1 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-br/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-br/strings.xml @@ -76,8 +76,6 @@ <string name="mozac_feature_addons_version">Handelv</string> <!-- The author of an add-on. --> <string name="mozac_feature_addons_author">Aozer</string> - <!-- The authors of an add-on. --> - <string name="mozac_feature_addons_authors" moz:removedIn="123" tools:ignore="UnusedResources">Aozerien</string> <!-- The last date that the add-on was updated. --> <string name="mozac_feature_addons_last_updated">Hizivadur diwezhañ</string> <!-- The developer website (Homepage) of the add-on. --> @@ -94,8 +92,6 @@ <string name="mozac_feature_addons_settings">Arventennoù</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Gweredekaet</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Diweredekaet</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Aotren er Merdeiñ Prevez</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -104,8 +100,6 @@ <string name="mozac_feature_addons_not_allowed_in_private_browsing">N’eo ket aotreet er prenestroù prevez</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Gweredekaet</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Diweredekaet</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Staliet</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -140,22 +134,26 @@ <string name="mozac_feature_addons_permissions_dialog_deny">Nac’hañ</string> <!-- This is a button to cancel the add-on installation . --> <string name="mozac_feature_addons_permissions_dialog_cancel">Nullañ</string> - <!-- Accessibility content description to install add-on button. --> - <string name="mozac_feature_addons_install_addon_content_description" tools:ignore="UnusedResources" moz:removedIn="124">Staliañ an askouezh</string> <!-- Accessibility content description to install add-on button. %1$s is the add-on name. --> <string name="mozac_feature_addons_install_addon_content_description_2">Staliañ %1$s</string> <!-- This is the label of a button to cancel an ongoing add-on installation. --> <string name="mozac_feature_addons_install_addon_dialog_cancel">Nullañ</string> <!-- Indicates how many users have rated an add-on. %1$s will be replaced with number of reviews --> <string name="mozac_feature_addons_user_rating_count_2">Burutelladennoù: %1$s</string> - <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> - <string name="mozac_feature_addons_rating_content_description" moz:removedIn="124" tools:ignore="UnusedResources">%1$.02f/5</string> + <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars. --> + <string name="mozac_feature_addons_rating_content_description_2">Notenn: %1$.02f war 5</string> <!-- This is the title of page where all the add-ons are listed--> <string name="mozac_feature_addons_addons">Askouezhioù</string> <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Ardoer an askouezhioù</string> <!-- The title of the "crash" notification in the add-ons manager --> <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Diweredekaet eo an askouezhioù evit ar mare</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Diweredekaet eo an askouezhioù evit ar mare</string> + <!-- The content of the "crash" notification in the add-ons manager --> + <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Un enlugellad pe meur a hini o deus sac’het, ar pezh a ya da zistabilaat ho reizhiad.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Un askouezh pe meur a hini o deus sac’het, ar pezh a ya da zistabilaat ho reizhiad.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Adloc’hañ an askouezhioù</string> <!-- Button to re-enable the extensions in the "crash" notification --> @@ -200,6 +198,8 @@ <string name="mozac_extension_install_progress_caption">O pellgargañ hag o wiriañ an askouezh…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ne cʼhaller ket kaout roll an askouezhioù!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Ne cʼhaller ket kaout roll an enlugelladoù!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">N’eo ket bet kavet an droidigezh, nag evit ar yezh %1$s nag evit ar yezh dre ziouer %2$s</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -208,12 +208,20 @@ <string name="mozac_feature_addons_failed_to_install">Cʼhwitadenn war staliadur %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Staliadur an askouezh c’hwitet.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Staliadur an askouezh c’hwitet.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">An askouezh-mañ n’hall ket bezañ pellgarget en abeg d’ur fazi kennask.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">An askouezh-mañ n’hall ket bezañ pellgarget en abeg d’ur fazi kennask.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">An askouezh-mañ n’hall ket bezañ staliet rak kontronet eo war ar seblant.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">An askouezh-mañ n\'hall ket bezañ staliet rak kontronet eo war ar seblant.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">An askouezh-mañ n’hall ket bezañ staliet rak n’eo ket bet gwiriet.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">An askouezh-mañ n\'hall ket bezañ staliet rak n\'eo ket bet gwiriet.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">%1$s n’hall ket bezañ staliet rak ne glot ket gant %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -260,10 +268,8 @@ <string name="mozac_feature_addons_updater_dialog_status">Stad:</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_title">Ouzhpennet eo bet %1$s da %2$s.</string> - <!-- Text shown in the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Digeriñ anezhañ el lañser</string> - <!-- Confirmation button text for the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">Mat eo, komprenet am eus</string> + <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> + <string name="mozac_feature_addons_installed_dialog_description_2">Haezit %1$s adalek lañser %2$s.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button_2">Mat eo</string> <!-- "Learn more" link displayed below an add-on status message. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-cak/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-cak/strings.xml index 12c845c568..c12647a733 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-cak/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-cak/strings.xml @@ -87,13 +87,15 @@ <!-- The rating of the add-on. --> <string name="mozac_feature_addons_rating">Kejqalem</string> <!-- A link that points to the detail page of the add-on. --> - <string name="mozac_feature_addons_more_info_link">Ch\'aqa\' chik chi rij re tz\'aqat re\'</string> + <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Ch\'aqa\' chik chi rij re tz\'aqat re\'</string> + <!-- A link that points to the detail page of the extension. --> + <string name="mozac_feature_addons_more_info_link_2">Ch\'aqa\' chik chi rij re k\'amal re\'</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Taq nuk\'ulem</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Tzijïl</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off">Chupül</string> + <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Chupül</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Tiya\' q\'ij chi re pa ichinan okem pa k\'amaya\'l</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -103,7 +105,7 @@ <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Tzijon</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled">Chupun</string> + <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Chupun</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Xyak</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -155,13 +157,21 @@ <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Kinuk\'samajel taq Tz\'aqat</string> <!-- The title of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_title_text">Echupun jumej ri taq tz\'aqat</string> + <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Echupun jumej ri taq tz\'aqat</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Echupun jumej ri taq k\'amal</string> <!-- The content of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_content_text">Jun o ka\'i\' oxi\' taq tz\'aqat xkiq\'ät kisamaj, ri nub\'än chi man jikil ta ri q\'inoj.</string> + <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Jun o ka\'i\' oxi\' taq tz\'aqat xkiq\'ät kisamaj, ri nub\'än chi man jikil ta ri q\'inoj.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Jun o ka\'i\' oxi\' taq k\'amal xkiq\'ät kisamaj, ri nub\'än chi man jikil ta ri q\'inoj.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> - <string name="mozac_feature_addons_manager_notification_restart_button">Ketzij chik ri taq tz\'aqat</string> + <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Ketzij chik ri taq tz\'aqat</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Ketzij chik k\'amal</string> <!-- Button in the add-ons manager that opens AMO in a tab --> - <string name="mozac_feature_addons_find_more_addons_button_text">Kekanöx ch\'aqa\' chik taq tz\'aqat</string> + <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Kekanöx ch\'aqa\' chik taq tz\'aqat</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">Ke\'ilitäj ch\'aqa\' chik taq k\'amal</string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">Tiya\' q\'ij</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -173,13 +183,15 @@ <!-- The content of the notification displayed when an add-on needs a new permission--> <string name="mozac_feature_addons_updater_notification_content_singular">Najowäx jun k\'ak\'a\' ya\'oj q\'ij</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_updater_notification_channel">Kik\'exoj tz\'aqat</string> + <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Kik\'exoj tz\'aqat</string> + <!-- Name of the "notification channel" used for displaying a notification for updating an extension. See https://developer.android.com/training/notify-user/channels --> + <string name="mozac_feature_addons_updater_notification_channel_2">Kik\'exoj k\'amal</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_supported_checker_notification_channel">K\'amonel tojtob\'äl tz\'aqat</string> + <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">K\'amonel tojtob\'äl tz\'aqat</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> - <string name="mozac_feature_addons_supported_checker_notification_title">K\'ak\'a\' tz\'aqat wachel</string> + <string name="mozac_feature_addons_supported_checker_notification_title" tools:ignore="UnusedResources">K\'ak\'a\' tz\'aqat wachel</string> <!-- The tile of the notification, this will be shown to the user when more than one newly supported add-ons are available.--> - <string name="mozac_feature_addons_supported_checker_notification_title_plural">K\'ak\'a\' taq tz\'aqat wachel</string> + <string name="mozac_feature_addons_supported_checker_notification_title_plural" tools:ignore="UnusedResources">K\'ak\'a\' taq tz\'aqat wachel</string> <!-- The content of the notification, this will be shown to the user when one newly supported add-on is available. %1$s is the add-on name and %2$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_one">Titz\'aqatisäx %1$s pa %2$s</string> <!-- The content of the notification, this will be shown to the user when two newly supported add-ons are available. %1$s is the first add-on name. %2$s is the second add-on name. %3$s is the app name (in most cases Firefox). --> @@ -187,13 +199,17 @@ <!-- The content of the notification, this will be shown to the user when more than two newly supported add-ons are available. %1$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_more_than_two">Ketz\'aqatisäx pa %1$s</string> <!-- This is the caption for not yet supported screen caption --> - <string name="mozac_feature_addons_not_yet_supported_caption">Nib\'an k\'ak\'a\' chi re ri runa\'ob\'al rutz\'aqat Firefox. Re taq tz\'aqat re\' yekokisaj taq ruchi\' ri man kik\'amon ta ki\' rik\'in ri Firefox 75 & ch\'aqa\' chik e nima\'q.</string> + <string name="mozac_feature_addons_not_yet_supported_caption" moz:removedIn="126" tools:ignore="UnusedResources">Nib\'an k\'ak\'a\' chi re ri runa\'ob\'al rutz\'aqat Firefox. Re taq tz\'aqat re\' yekokisaj taq ruchi\' ri man kik\'amon ta ki\' rik\'in ri Firefox 75 & ch\'aqa\' chik e nima\'q.</string> <!-- This is the caption for not yet supported screen caption --> <string name="mozac_feature_addons_not_yet_supported_caption2">Wakami niqanük\' tob\'äl kichin nab\'ey cha\'oj taq K\'amal Echilab\'en.</string> <!-- This is the caption for the add-on installation progress overlay --> - <string name="mozac_add_on_install_progress_caption">Niqasäx chuqa\' ninik\'öx tz\'aqat…</string> + <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Niqasäx chuqa\' ninik\'öx tz\'aqat…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Niqasäx chuqa\' ninik\'öx k\'amal…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> - <string name="mozac_feature_addons_failed_to_query_add_ons">¡Xsach toq xk\'utüx Tz\'aqat!</string> + <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">¡Xsach toq xk\'utüx Tz\'aqat!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">¡Xsach toq xk\'utüx K\'amal!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Man xilitäj ta ri tzalq\'omanïk richin ri %1$s chuqa\' ni xa ta ri %2$s ch\'ab\'äl k\'o</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -201,13 +217,21 @@ <!-- Text shown after failed to install an add-on. %1$s is the add-on name. --> <string name="mozac_feature_addons_failed_to_install">Xsach toq xyak ri %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> - <string name="mozac_feature_addons_failed_to_install_generic">Xsach toq niyak re tz\'aqat re\'.</string> + <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Xsach toq niyak re tz\'aqat re\'.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Xsach toq niyak re k\'amal re\'.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> - <string name="mozac_feature_addons_failed_to_install_network_error">Man xqasäx ta re tz\'aqat re ruma man pa rub\'eyal taq ri rokem.</string> + <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">Man xqasäx ta re tz\'aqat re ruma man pa rub\'eyal taq ri rokem.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">Man xqasäx ta re k\'amal re ruma man pa rub\'eyal taq ri rokem.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> - <string name="mozac_feature_addons_failed_to_install_corrupt_error">Man xyak ta kan re tz\'aqat xa ke xa man ütz ta.</string> + <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Man xyak ta kan re tz\'aqat xa ke xa man ütz ta.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">Man xyak ta kan re k\'amal xa ke xa man ütz ta.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> - <string name="mozac_feature_addons_failed_to_install_not_signed_error">Man xyak ta kan re jun rutz\'aqat re\' ruma chi man nik\'on ta.</string> + <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Man xyak ta kan re jun rutz\'aqat re\' ruma chi man nik\'on ta.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">Man xyak ta kan re jun k\'amal re\' ruma chi man nik\'on ta.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">Man xyak ta ri %1$s ruma man nuk\'äm ta ri\' rik\'in %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -231,9 +255,13 @@ <!-- Label shown to indicate that the add-on was migrated from a previous version of the app. %1$s is the app name most of the case it will be Firefox. --> <string name="mozac_feature_addons_migrated_from_a_previous_version_label" tools:ignore="UnusedResources">Re tz\'aqat re\' xk\'am pe pa jun kan ruwäch %1$s</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter. --> - <string name="mozac_feature_addons_unsupported_caption">1 tz\'aqat</string> + <string name="mozac_feature_addons_unsupported_caption" moz:removedIn="126" tools:ignore="UnusedResources">1 tz\'aqat</string> + <!-- Text shown in not yet supported add-ons section. --> + <string name="mozac_feature_addons_unsupported_caption_2">1 k\'amal</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> - <string name="mozac_feature_addons_unsupported_caption_plural">%1$s taq tz\'aqat</string> + <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">%1$s taq tz\'aqat</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s taq k\'amal</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Tetamäx ch\'aqa\' chik</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-eo/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-eo/strings.xml index 19c630e4a9..f61b58e7cd 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-eo/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-eo/strings.xml @@ -87,13 +87,15 @@ <!-- The rating of the add-on. --> <string name="mozac_feature_addons_rating">Taksado</string> <!-- A link that points to the detail page of the add-on. --> - <string name="mozac_feature_addons_more_info_link">Pli da informo pri tiu ĉi aldonaĵo</string> + <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Pli da informo pri tiu ĉi aldonaĵo</string> + <!-- A link that points to the detail page of the extension. --> + <string name="mozac_feature_addons_more_info_link_2">Pli da informo pri tiu ĉi etendaĵo</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Agordoj</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Ŝaltita</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off">Malŝaltita</string> + <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Malŝaltita</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Permesi en privata retumo</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -103,7 +105,7 @@ <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Aktiva</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled">Malaktiva</string> + <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Malaktiva</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Instalita</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -155,13 +157,21 @@ <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Administrilo de aldonaĵoj</string> <!-- The title of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_title_text">La aldonaĵoj estas provizore malaktivigitaj</string> + <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">La aldonaĵoj estas provizore malaktivigitaj</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">La etendaĵoj estas provizore malaktivigitaj</string> <!-- The content of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_content_text">Unu aŭ pli da aldonaĵoj ĉesis funkcii, kaj tio igas vian sistemon nestabila.</string> + <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Unu aŭ pli da aldonaĵoj ĉesis funkcii, kaj tio igas vian sistemon nestabila.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Unu aŭ pli da etendaĵoj ĉesis funkcii, kaj tio igas vian sistemon nestabila.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> - <string name="mozac_feature_addons_manager_notification_restart_button">Restartigi aldonaĵojn</string> + <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Restartigi aldonaĵojn</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Restartigi etendaĵojn</string> <!-- Button in the add-ons manager that opens AMO in a tab --> - <string name="mozac_feature_addons_find_more_addons_button_text">Serĉi pli da aldonaĵoj</string> + <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Serĉi pli da aldonaĵoj</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">Serĉi pli da etendaĵoj</string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">Permesi</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -173,13 +183,15 @@ <!-- The content of the notification displayed when an add-on needs a new permission--> <string name="mozac_feature_addons_updater_notification_content_singular">Nova permeso postulata</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_updater_notification_channel">Ĝisdatigoj de aldonaĵoj</string> + <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Ĝisdatigoj de aldonaĵoj</string> + <!-- Name of the "notification channel" used for displaying a notification for updating an extension. See https://developer.android.com/training/notify-user/channels --> + <string name="mozac_feature_addons_updater_notification_channel_2">Ĝisdatigoj por etendaĵoj</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_supported_checker_notification_channel">Kontrolo de subtenataj aldonaĵoj</string> + <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">Kontrolo de subtenataj aldonaĵoj</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> - <string name="mozac_feature_addons_supported_checker_notification_title">Nova aldonaĵo disponebla</string> + <string name="mozac_feature_addons_supported_checker_notification_title" tools:ignore="UnusedResources">Nova aldonaĵo disponebla</string> <!-- The tile of the notification, this will be shown to the user when more than one newly supported add-ons are available.--> - <string name="mozac_feature_addons_supported_checker_notification_title_plural">Novaj aldonaĵoj disponeblaj</string> + <string name="mozac_feature_addons_supported_checker_notification_title_plural" tools:ignore="UnusedResources">Novaj aldonaĵoj disponeblaj</string> <!-- The content of the notification, this will be shown to the user when one newly supported add-on is available. %1$s is the add-on name and %2$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_one">Aldoni %1$s al %2$s</string> <!-- The content of the notification, this will be shown to the user when two newly supported add-ons are available. %1$s is the first add-on name. %2$s is the second add-on name. %3$s is the app name (in most cases Firefox). --> @@ -187,13 +199,17 @@ <!-- The content of the notification, this will be shown to the user when more than two newly supported add-ons are available. %1$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_more_than_two">Aldoni ilin al %1$s</string> <!-- This is the caption for not yet supported screen caption --> - <string name="mozac_feature_addons_not_yet_supported_caption">La teknologio de aldonaĵoj de Firefox moderniĝas. Tiuj ĉi aldonaĵoj uzas teknologiojn kiuj ne kongruas kun Firefox 75 kaj ĝiaj postaj versioj.</string> + <string name="mozac_feature_addons_not_yet_supported_caption" moz:removedIn="126" tools:ignore="UnusedResources">La teknologio de aldonaĵoj de Firefox moderniĝas. Tiuj ĉi aldonaĵoj uzas teknologiojn kiuj ne kongruas kun Firefox 75 kaj ĝiaj postaj versioj.</string> <!-- This is the caption for not yet supported screen caption --> <string name="mozac_feature_addons_not_yet_supported_caption2">Ni nun kreas la unuan liston kun elektitaj rekomenditaj etendaĵoj.</string> <!-- This is the caption for the add-on installation progress overlay --> - <string name="mozac_add_on_install_progress_caption">Aldonaĵo elŝutata kaj kontrolata…</string> + <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Aldonaĵo elŝutata kaj kontrolata…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Etendaĵo elŝutata kaj kontrolata…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> - <string name="mozac_feature_addons_failed_to_query_add_ons">Ne eblis akiri la liston de aldonaĵoj!</string> + <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ne eblis akiri la liston de aldonaĵoj!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Ne eblis akiri la liston de etendaĵoj!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Traduko netrovita, nek por la lokaĵaro %1$s nek por la norma lingvo %2$s</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -201,13 +217,21 @@ <!-- Text shown after failed to install an add-on. %1$s is the add-on name. --> <string name="mozac_feature_addons_failed_to_install">Malsukcesa instalo de %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> - <string name="mozac_feature_addons_failed_to_install_generic">Malsukcesa instalo de tiu ĉi aldonaĵo.</string> + <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Malsukcesa instalo de tiu ĉi aldonaĵo.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Malsukcesa instalo de tiu ĉi etendaĵo.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> - <string name="mozac_feature_addons_failed_to_install_network_error">La aldonaĵo ne povis esti elŝutita pro eraro en la konekto.</string> + <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">La aldonaĵo ne povis esti elŝutita pro eraro en la konekto.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">La etendaĵo ne povis esti elŝutita pro eraro en la konekto.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> - <string name="mozac_feature_addons_failed_to_install_corrupt_error">Tiu ĉi aldonaĵo ne povis esti instalita ĉar ĝi aspektas difektite.</string> + <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Tiu ĉi aldonaĵo ne povis esti instalita ĉar ĝi aspektas difektite.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">Tiu ĉi etendaĵo ne povis esti instalita ĉar ĝi aspektas difektite.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> - <string name="mozac_feature_addons_failed_to_install_not_signed_error">Tiu ĉi aldonaĵo ne povis esti instalita ĉar ĝi ne estas kontrolita.</string> + <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Tiu ĉi aldonaĵo ne povis esti instalita ĉar ĝi ne estas kontrolita.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">Tiu ĉi etendaĵo ne povis esti instalita ĉar ĝi ne estis kontrolita.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">%1$s ne povi esti instalita ĉar ĝi ne kongruas kun %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -231,9 +255,13 @@ <!-- Label shown to indicate that the add-on was migrated from a previous version of the app. %1$s is the app name most of the case it will be Firefox. --> <string name="mozac_feature_addons_migrated_from_a_previous_version_label" tools:ignore="UnusedResources">Tiu ĉi aldonaĵo migris el antaŭa versio de %1$s</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter. --> - <string name="mozac_feature_addons_unsupported_caption">1 aldonaĵo</string> + <string name="mozac_feature_addons_unsupported_caption" moz:removedIn="126" tools:ignore="UnusedResources">1 aldonaĵo</string> + <!-- Text shown in not yet supported add-ons section. --> + <string name="mozac_feature_addons_unsupported_caption_2">1 etendaĵo</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> - <string name="mozac_feature_addons_unsupported_caption_plural">%1$s aldonaĵoj</string> + <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">%1$s aldonaĵoj</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s etendaĵoj</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Pli da informo</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-eu/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-eu/strings.xml index 44fdf12323..f7af45b7ea 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-eu/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-eu/strings.xml @@ -87,13 +87,15 @@ <!-- The rating of the add-on. --> <string name="mozac_feature_addons_rating">Puntuazioa</string> <!-- A link that points to the detail page of the add-on. --> - <string name="mozac_feature_addons_more_info_link">Gehiago gehigarri honi buruz</string> + <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Gehiago gehigarri honi buruz</string> + <!-- A link that points to the detail page of the extension. --> + <string name="mozac_feature_addons_more_info_link_2">Gehiago hedapen honi buruz</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Ezarpenak</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Aktibatuta</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off">Desaktibatuta</string> + <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Desaktibatuta</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Baimendu nabigatze pribatuan</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -103,7 +105,7 @@ <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Gaituta</string> <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled">Desgaituta</string> + <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Desgaituta</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Instalatuta</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -155,13 +157,21 @@ <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Gehigarrien kudeatzailea</string> <!-- The title of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_title_text">Gehigarriak aldi baterako desgaitu dira</string> + <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak aldi baterako desgaitu dira</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Hedapenak aldi baterako desgaitu dira</string> <!-- The content of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_content_text">Gehigarri bat edo gehiago matxuratu egin dira, zure sistema desegonkortuz.</string> + <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarri bat edo gehiago matxuratu egin dira, zure sistema desegonkortuz.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Hedapen bat edo gehiago matxuratu egin dira, zure sistema desegonkortuz.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> - <string name="mozac_feature_addons_manager_notification_restart_button">Berrabiarazi gehigarriak</string> + <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Berrabiarazi gehigarriak</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Berrabiarazi hedapenak</string> <!-- Button in the add-ons manager that opens AMO in a tab --> - <string name="mozac_feature_addons_find_more_addons_button_text">Bilatu gehigarri gehiago</string> + <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Bilatu gehigarri gehiago</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">Bilatu hedapen gehiago</string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">Baimendu</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -173,13 +183,15 @@ <!-- The content of the notification displayed when an add-on needs a new permission--> <string name="mozac_feature_addons_updater_notification_content_singular">Baimen berri bat behar da</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_updater_notification_channel">Gehigarrien eguneraketak</string> + <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarrien eguneraketak</string> + <!-- Name of the "notification channel" used for displaying a notification for updating an extension. See https://developer.android.com/training/notify-user/channels --> + <string name="mozac_feature_addons_updater_notification_channel_2">Hedapenen eguneraketak</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_supported_checker_notification_channel">Onartutako gehigarrien egiaztatzailea</string> + <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">Onartutako gehigarrien egiaztatzailea</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> - <string name="mozac_feature_addons_supported_checker_notification_title">Gehigarri berria erabilgarri</string> + <string name="mozac_feature_addons_supported_checker_notification_title" tools:ignore="UnusedResources">Gehigarri berria erabilgarri</string> <!-- The tile of the notification, this will be shown to the user when more than one newly supported add-ons are available.--> - <string name="mozac_feature_addons_supported_checker_notification_title_plural">Gehigarri berriak erabilgarri</string> + <string name="mozac_feature_addons_supported_checker_notification_title_plural" tools:ignore="UnusedResources">Gehigarri berriak erabilgarri</string> <!-- The content of the notification, this will be shown to the user when one newly supported add-on is available. %1$s is the add-on name and %2$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_one">Gehitu %1$s %2$s(e)ra</string> <!-- The content of the notification, this will be shown to the user when two newly supported add-ons are available. %1$s is the first add-on name. %2$s is the second add-on name. %3$s is the app name (in most cases Firefox). --> @@ -187,13 +199,17 @@ <!-- The content of the notification, this will be shown to the user when more than two newly supported add-ons are available. %1$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_more_than_two">Gehitu hauek %1$s(e)ra</string> <!-- This is the caption for not yet supported screen caption --> - <string name="mozac_feature_addons_not_yet_supported_caption">Firefoxen gehigarrien teknologia modernizatzen ari da. Ondorengo gehigarriek Firefox 75 eta berriagoekin bateragarriak ez diren framework-ak erabiltzen dituzte.</string> + <string name="mozac_feature_addons_not_yet_supported_caption" moz:removedIn="126" tools:ignore="UnusedResources">Firefoxen gehigarrien teknologia modernizatzen ari da. Ondorengo gehigarriek Firefox 75 eta berriagoekin bateragarriak ez diren framework-ak erabiltzen dituzte.</string> <!-- This is the caption for not yet supported screen caption --> <string name="mozac_feature_addons_not_yet_supported_caption2">Gomendatutako hedapenen hasierako hautapena emateko euskarria eraikitzen ari gara une honetan.</string> <!-- This is the caption for the add-on installation progress overlay --> - <string name="mozac_add_on_install_progress_caption">Gehigarria deskargatzen eta egiaztatzen…</string> + <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarria deskargatzen eta egiaztatzen…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Hedapena deskargatzen eta egiaztatzen…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> - <string name="mozac_feature_addons_failed_to_query_add_ons">Ezin izan dira gehigarriak kontsultatu!</string> + <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ezin izan dira gehigarriak kontsultatu!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Ezin izan dira hedapenak kontsultatu!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Ez da itzulpenik aurkitu, ez %1$s hizkuntzarentzat ez eta %2$s hizkuntza lehenetsiarentzat</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -201,13 +217,21 @@ <!-- Text shown after failed to install an add-on. %1$s is the add-on name. --> <string name="mozac_feature_addons_failed_to_install">Ezin izan da %1$s instalatu</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> - <string name="mozac_feature_addons_failed_to_install_generic">Ezin izan da gehigarri hau instalatu.</string> + <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Ezin izan da gehigarri hau instalatu.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Ezin izan da hedapen hau instalatu.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> - <string name="mozac_feature_addons_failed_to_install_network_error">Ezin izan da gehigarri hau deskargatu konexio-akats bat dela-eta.</string> + <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">Ezin izan da gehigarri hau deskargatu konexio-akats bat dela-eta.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">Ezin izan da hedapen hau deskargatu konexio-akats bat dela-eta.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> - <string name="mozac_feature_addons_failed_to_install_corrupt_error">Ezin izan da gehigarri hau instalatu hondatuta dagoela dirudielako.</string> + <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Ezin izan da gehigarri hau instalatu hondatuta dagoela dirudielako.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">Ezin izan da hedapen hau instalatu hondatuta dagoela dirudielako.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> - <string name="mozac_feature_addons_failed_to_install_not_signed_error">Ezin izan da gehigarri hau instalatu egiaztatu gabea delako.</string> + <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Ezin izan da gehigarri hau instalatu egiaztatu gabea delako.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">Ezin izan da hedapen hau instalatu egiaztatu gabea delako.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">Ezin da %1$s instalatu ez delako %2$s %3$s bertsioarekin bateragarria.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -231,9 +255,13 @@ <!-- Label shown to indicate that the add-on was migrated from a previous version of the app. %1$s is the app name most of the case it will be Firefox. --> <string name="mozac_feature_addons_migrated_from_a_previous_version_label" tools:ignore="UnusedResources">Gehigarri hau %1$s(r)en aurreko bertsio batetik migratu da</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter. --> - <string name="mozac_feature_addons_unsupported_caption">Gehigarri 1</string> + <string name="mozac_feature_addons_unsupported_caption" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarri 1</string> + <!-- Text shown in not yet supported add-ons section. --> + <string name="mozac_feature_addons_unsupported_caption_2">Hedapen bat</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> - <string name="mozac_feature_addons_unsupported_caption_plural">%1$s gehigarri</string> + <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">%1$s gehigarri</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s hedapen</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Argibide gehiago</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-it/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-it/strings.xml index 2c0f38c37d..e6e37d0846 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-it/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-it/strings.xml @@ -76,8 +76,6 @@ <string name="mozac_feature_addons_version">Versione</string> <!-- The author of an add-on. --> <string name="mozac_feature_addons_author">Autore</string> - <!-- The authors of an add-on. --> - <string name="mozac_feature_addons_authors" moz:removedIn="123" tools:ignore="UnusedResources">Autori</string> <!-- The last date that the add-on was updated. --> <string name="mozac_feature_addons_last_updated">Ultimo aggiornamento</string> <!-- The developer website (Homepage) of the add-on. --> @@ -94,8 +92,6 @@ <string name="mozac_feature_addons_settings">Impostazioni</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Attiva</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Disattivata</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Consenti in navigazione anonima</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -103,13 +99,11 @@ <!-- This is displayed when the add-on is not allowed to run in private browsing. --> <string name="mozac_feature_addons_not_allowed_in_private_browsing">Disattivata in finestre anonime</string> <!-- Indicates the add-on is enabled. --> - <string name="mozac_feature_addons_enabled">Attivi</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Disattivato</string> + <string name="mozac_feature_addons_enabled">Attive</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> - <string name="mozac_feature_addons_installed_section">Installata</string> + <string name="mozac_feature_addons_installed_section">Installate</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> - <string name="mozac_feature_addons_recommended_section">Consigliati</string> + <string name="mozac_feature_addons_recommended_section">Consigliate</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the not yet supported section. --> <string name="mozac_feature_addons_unsupported_section">Non ancora supportato</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the not yet available section. --> @@ -140,16 +134,12 @@ <string name="mozac_feature_addons_permissions_dialog_deny">Nega</string> <!-- This is a button to cancel the add-on installation . --> <string name="mozac_feature_addons_permissions_dialog_cancel">Annulla</string> - <!-- Accessibility content description to install add-on button. --> - <string name="mozac_feature_addons_install_addon_content_description" tools:ignore="UnusedResources" moz:removedIn="124">Installa componente aggiuntivo</string> <!-- Accessibility content description to install add-on button. %1$s is the add-on name. --> <string name="mozac_feature_addons_install_addon_content_description_2">Installa %1$s</string> <!-- This is the label of a button to cancel an ongoing add-on installation. --> <string name="mozac_feature_addons_install_addon_dialog_cancel">Annulla</string> <!-- Indicates how many users have rated an add-on. %1$s will be replaced with number of reviews --> <string name="mozac_feature_addons_user_rating_count_2">Recensioni: %1$s</string> - <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> - <string name="mozac_feature_addons_rating_content_description" moz:removedIn="124" tools:ignore="UnusedResources">%1$.02f/5</string> <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars. --> <string name="mozac_feature_addons_rating_content_description_2">Valutazione: %1$.02f su 5</string> <!-- This is the title of page where all the add-ons are listed--> @@ -278,13 +268,9 @@ <string name="mozac_feature_addons_updater_dialog_status">Stato:</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_title">%1$s è stato aggiunto a %2$s</string> - <!-- Text shown in the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Apri nel menu</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_description_2">Accedi a %1$s dal menu di %2$s.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">OK</string> - <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button_2">OK</string> <!-- "Learn more" link displayed below an add-on status message. --> <string name="mozac_feature_addons_status_learn_more">Ulteriori informazioni</string> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-kab/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-kab/strings.xml index d154ecb99c..20100e7ce9 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-kab/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-kab/strings.xml @@ -76,8 +76,6 @@ <string name="mozac_feature_addons_version">Lqem</string> <!-- The author of an add-on. --> <string name="mozac_feature_addons_author">Ameskar</string> - <!-- The authors of an add-on. --> - <string name="mozac_feature_addons_authors" moz:removedIn="123" tools:ignore="UnusedResources">Imeskaren</string> <!-- The last date that the add-on was updated. --> <string name="mozac_feature_addons_last_updated">Aleqqem aneggaru</string> <!-- The developer website (Homepage) of the add-on. --> @@ -88,20 +86,20 @@ <string name="mozac_feature_addons_rating">Tizmilin</string> <!-- A link that points to the detail page of the add-on. --> <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Ugar γef uzegrir-agi</string> + <!-- A link that points to the detail page of the extension. --> + <string name="mozac_feature_addons_more_info_link_2">Ugar ɣef usiɣzef-a</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Iɣewwaṛen</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Yermed</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Yensa</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Sireg di tunigin tusligt</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_run_in_private_browsing">Selkem di tunigin tusligt</string> + <!-- This is displayed when the add-on is not allowed to run in private browsing. --> + <string name="mozac_feature_addons_not_allowed_in_private_browsing">Ur yettusireg ara deg yisfuyla usligen</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Irmed</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Yensa</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Ibded</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -136,24 +134,24 @@ <string name="mozac_feature_addons_permissions_dialog_deny">Gdel</string> <!-- This is a button to cancel the add-on installation . --> <string name="mozac_feature_addons_permissions_dialog_cancel">Sefsex</string> - <!-- Accessibility content description to install add-on button. --> - <string name="mozac_feature_addons_install_addon_content_description" tools:ignore="UnusedResources" moz:removedIn="124">Asebded n uzegrir</string> <!-- Accessibility content description to install add-on button. %1$s is the add-on name. --> <string name="mozac_feature_addons_install_addon_content_description_2">Sebded %1$s</string> <!-- This is the label of a button to cancel an ongoing add-on installation. --> <string name="mozac_feature_addons_install_addon_dialog_cancel">Sefsex</string> <!-- Indicates how many users have rated an add-on. %1$s will be replaced with number of reviews --> <string name="mozac_feature_addons_user_rating_count_2">Cegger: %1$s</string> - <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> - <string name="mozac_feature_addons_rating_content_description" moz:removedIn="124" tools:ignore="UnusedResources">%1$.02f/55</string> <!-- This is the title of page where all the add-ons are listed--> <string name="mozac_feature_addons_addons">Izegrar</string> <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Amsefrak n yizegrar</string> <!-- The title of the "crash" notification in the add-ons manager --> <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Azegrir yensa i kra n wakud</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Isiɣzaf nsan i kra n wakud</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Ales asenker n yizegrar</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Ales asenker n yisiɣzaf</string> <!-- Button in the add-ons manager that opens AMO in a tab --> <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Aff-d ugar n izegrar</string> <!-- Button in the extensions manager that opens AMO in a tab --> @@ -170,6 +168,8 @@ <string name="mozac_feature_addons_updater_notification_content_singular">Tasiregt tamaynut tlaq</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Ileqman n uzegrir</string> + <!-- Name of the "notification channel" used for displaying a notification for updating an extension. See https://developer.android.com/training/notify-user/channels --> + <string name="mozac_feature_addons_updater_notification_channel_2">Ileqman n yisiɣzaf</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">Amsenqed n izegrar imṣaḍan</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> @@ -188,6 +188,8 @@ <string name="mozac_feature_addons_not_yet_supported_caption2">Aql-aɣ nbennu Tallelt i taggayt tamezwarut akked isiɣzaf ihullen.</string> <!-- This is the caption for the add-on installation progress overlay --> <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Azdam akked usenqed n uzegrir…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Asader d usenqed n usiɣzef…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tuttra n izegrar ur teddi ara!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> @@ -250,10 +252,8 @@ <string name="mozac_feature_addons_updater_dialog_status">Addaden:</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_title">%1$s yettwarna ɣer %2$s</string> - <!-- Text shown in the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Ldi-t deg wumuɣ</string> - <!-- Confirmation button text for the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">Ih, awi-t-id</string> + <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> + <string name="mozac_feature_addons_installed_dialog_description_2">Kcem ɣer %1$s seg wumuɣ %2$s.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button_2">IH</string> <!-- "Learn more" link displayed below an add-on status message. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-ko/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-ko/strings.xml index 60f62641ed..ce90feb55f 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-ko/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-ko/strings.xml @@ -65,7 +65,7 @@ <!-- Description for proxy permission. --> <string name="mozac_feature_addons_permissions_proxy_description">브라우저 프록시 설정 제어</string> <!-- Description for sessions permission. --> - <string name="mozac_feature_addons_permissions_sessions_description">최근에 닫힌 탭에 접근</string> + <string name="mozac_feature_addons_permissions_sessions_description">최근에 닫은 탭에 접근</string> <!-- Description for tab_hide permission. --> <string name="mozac_feature_addons_permissions_tab_hide_description">브라우저 탭 숨기기 및 표시</string> <!-- Description for top_sites permission. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-nn-rNO/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-nn-rNO/strings.xml index 0497c14100..841f8a0fc4 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-nn-rNO/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-nn-rNO/strings.xml @@ -76,8 +76,6 @@ <string name="mozac_feature_addons_version">Versjon</string> <!-- The author of an add-on. --> <string name="mozac_feature_addons_author">Utviklar</string> - <!-- The authors of an add-on. --> - <string name="mozac_feature_addons_authors" moz:removedIn="123" tools:ignore="UnusedResources">Utviklarar</string> <!-- The last date that the add-on was updated. --> <string name="mozac_feature_addons_last_updated">Sist oppdatert</string> <!-- The developer website (Homepage) of the add-on. --> @@ -94,8 +92,6 @@ <string name="mozac_feature_addons_settings">Innstillingar</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">På</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off" moz:removedIn="125" tools:ignore="UnusedResources">Av</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Tillat i privat nettlesing</string> <!-- Indicates the add-on is allowed in private browsing mode. --> @@ -104,8 +100,6 @@ <string name="mozac_feature_addons_not_allowed_in_private_browsing">Ikkje tillate i private vindauge</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Påslått</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled" moz:removedIn="125" tools:ignore="UnusedResources">Avslått</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Installert</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -140,16 +134,12 @@ <string name="mozac_feature_addons_permissions_dialog_deny">Avvis</string> <!-- This is a button to cancel the add-on installation . --> <string name="mozac_feature_addons_permissions_dialog_cancel">Avbryt</string> - <!-- Accessibility content description to install add-on button. --> - <string name="mozac_feature_addons_install_addon_content_description" tools:ignore="UnusedResources" moz:removedIn="124">Installer tillegg</string> <!-- Accessibility content description to install add-on button. %1$s is the add-on name. --> <string name="mozac_feature_addons_install_addon_content_description_2">Installer %1$s</string> <!-- This is the label of a button to cancel an ongoing add-on installation. --> <string name="mozac_feature_addons_install_addon_dialog_cancel">Avbryt</string> <!-- Indicates how many users have rated an add-on. %1$s will be replaced with number of reviews --> <string name="mozac_feature_addons_user_rating_count_2">Omtalar: %1$s</string> - <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> - <string name="mozac_feature_addons_rating_content_description" moz:removedIn="124" tools:ignore="UnusedResources">%1$.02f/5</string> <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars. --> <string name="mozac_feature_addons_rating_content_description_2">Vurdering: %1$.02f av 5</string> <!-- This is the title of page where all the add-ons are listed--> @@ -162,6 +152,8 @@ <string name="mozac_feature_extensions_manager_notification_title_text">Utvidinga er mellombels deaktivert</string> <!-- The content of the "crash" notification in the add-ons manager --> <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">Eitt eller fleire tillegg slutta å verke, noko som gjorde systemet ditt ustabilt.</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Ei eller fleire utvidingar slutta å fungere, noko som gjorde systemet ditt ustabilt.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Start tillegga på nytt</string> <!-- Button to re-enable the extensions in the "crash" notification --> @@ -202,8 +194,12 @@ <string name="mozac_feature_addons_not_yet_supported_caption2">Vi utviklar for tida støtte for eit første utval av tilrådde utvidingar.</string> <!-- This is the caption for the add-on installation progress overlay --> <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Lastar ned og stadfestar tiillegget…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Lastar ned og stadfestar utvidinga…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Mislykka førespurnad om tlleggsprogram!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Mislykka førespurnad etter utvidingar!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Fann ikkje omsettinga for språket %2$s, eller for standardspråket %1$s</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -212,12 +208,20 @@ <string name="mozac_feature_addons_failed_to_install">Klarte ikkje å installere %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Klarte ikkje å installere dette tillegget.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Klarte ikkje å installere denne utvidinga.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">Klarte ikkje å laste ned tillegget på grunn av ein tilkoplingsfeil.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">Klarte ikkje å laste ned utvidinga på grunn av ein tilkoplingsfeil.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Klarte ikkje å installere dette tillegget fordi det ser ut til å vere skada.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">Klarte ikkje å installere denne utvidinga fordi ho ser ut til å vere skada.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Klarte ikkje å installere dette tillegget fordi det ikkje er stadfesta.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">Klarte ikkje å installere denne utvidinga fordi ho ikkje har blitt stadfesta.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">Klarte ikkje å installere %1$s fordi den ikkje er kompatibel med %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -264,13 +268,9 @@ <string name="mozac_feature_addons_updater_dialog_status">Status:</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_title">%1$s er lagt til i %2$s</string> - <!-- Text shown in the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Opne det i menyen</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_description_2">Få tilgang til %1$s frå %2$s-menyen.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">Ok, eg forstår</string> - <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button_2">OK</string> <!-- "Learn more" link displayed below an add-on status message. --> <string name="mozac_feature_addons_status_learn_more">Les meir</string> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-sc/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-sc/strings.xml index d3dbbca241..5106df89be 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-sc/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-sc/strings.xml @@ -74,8 +74,6 @@ <string name="mozac_feature_addons_version">Versione</string> <!-- The author of an add-on. --> <string name="mozac_feature_addons_author">Autoria</string> - <!-- The authors of an add-on. --> - <string name="mozac_feature_addons_authors" moz:removedIn="123" tools:ignore="UnusedResources">Autoria</string> <!-- The last date that the add-on was updated. --> <string name="mozac_feature_addons_last_updated">Ùrtima atualizatzione</string> <!-- The developer website (Homepage) of the add-on. --> @@ -85,21 +83,17 @@ <!-- The rating of the add-on. --> <string name="mozac_feature_addons_rating">Valutatzione</string> <!-- A link that points to the detail page of the add-on. --> - <string name="mozac_feature_addons_more_info_link">Àteru in pitzus de custu cumplementu</string> + <string name="mozac_feature_addons_more_info_link" moz:removedIn="126" tools:ignore="UnusedResources">Àteru in pitzus de custu cumplementu</string> <!-- The settings of the add-on. --> <string name="mozac_feature_addons_settings">Cunfiguratzione</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_settings_on">Ativu</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_settings_off">Disativadu</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_allow_in_private_browsing">Permite in sa navigatzione privada</string> <!-- Indicates the add-on is allowed in private browsing mode. --> <string name="mozac_feature_addons_settings_run_in_private_browsing">Esecuta in sa navigatzione privada</string> <!-- Indicates the add-on is enabled. --> <string name="mozac_feature_addons_enabled">Ativadu</string> - <!-- Indicates the add-on is disabled. --> - <string name="mozac_feature_addons_disabled">Disativadu</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the installed section. --> <string name="mozac_feature_addons_installed_section">Installadu</string> <!-- This is displayed in a page where the user can see the installed and recommended(not installed yet) add-ons, this string indicates the recommended section. --> @@ -134,24 +128,28 @@ <string name="mozac_feature_addons_permissions_dialog_deny">Refuda</string> <!-- This is a button to cancel the add-on installation . --> <string name="mozac_feature_addons_permissions_dialog_cancel">Annulla</string> - <!-- Accessibility content description to install add-on button. --> - <string name="mozac_feature_addons_install_addon_content_description">Installa su cumplementu</string> <!-- This is the label of a button to cancel an ongoing add-on installation. --> <string name="mozac_feature_addons_install_addon_dialog_cancel">Annulla</string> <!-- Indicates how many users have rated an add-on. %1$s will be replaced with number of reviews --> <string name="mozac_feature_addons_user_rating_count_2">Retzensiones: %1$s</string> - <!-- Accessibility content description for the amount of stars that add-on has, where %1$.02f will be the amount of stars and / separator and 5 the maximum number of stars e.g (2/5, 4.5/5 or 5/5) . --> - <string name="mozac_feature_addons_rating_content_description">%1$.02f/5</string> <!-- This is the title of page where all the add-ons are listed--> <string name="mozac_feature_addons_addons">Cumplementos</string> <!-- Label for add-ons sub menu item for add-ons manager--> <string name="mozac_feature_addons_addons_manager">Gestore de cumplementos</string> <!-- The title of the "crash" notification in the add-ons manager --> - <string name="mozac_feature_addons_manager_notification_title_text">Is cumplementos sunt istados disativados in manera temporànea</string> + <string name="mozac_feature_addons_manager_notification_title_text" moz:removedIn="126" tools:ignore="UnusedResources">Is cumplementos sunt istados disativados in manera temporànea</string> + <!-- The title of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_title_text">Is estensiones sunt disativadas in manera temporànea</string> + <!-- The content of the "crash" notification in the extensions manager --> + <string name="mozac_feature_extensions_manager_notification_content_text">Una o prus estensiones ant tzessadu de funtzionare, e cumpromitent s\'istabilidade de su sistema.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> - <string name="mozac_feature_addons_manager_notification_restart_button">Torra a aviare is cumplementos</string> + <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Torra a aviare is cumplementos</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Torra a aviare is estensiones</string> <!-- Button in the add-ons manager that opens AMO in a tab --> - <string name="mozac_feature_addons_find_more_addons_button_text">Agata àteros cumplementos</string> + <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Agata àteros cumplementos</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">Agata àteras estensiones</string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">Permite</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -163,23 +161,27 @@ <!-- The content of the notification displayed when an add-on needs a new permission--> <string name="mozac_feature_addons_updater_notification_content_singular">Permissu nou rechestu</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_updater_notification_channel">Atualizatziones de cumplementos</string> + <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Atualizatziones de cumplementos</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> - <string name="mozac_feature_addons_supported_checker_notification_channel">Verificadore de cumplementos cumpatìbiles</string> + <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">Verificadore de cumplementos cumpatìbiles</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> - <string name="mozac_feature_addons_supported_checker_notification_title">Cumplementu nou cumpatìbile</string> + <string name="mozac_feature_addons_supported_checker_notification_title" tools:ignore="UnusedResources">Cumplementu nou cumpatìbile</string> <!-- The tile of the notification, this will be shown to the user when more than one newly supported add-ons are available.--> - <string name="mozac_feature_addons_supported_checker_notification_title_plural">Cumplementos noos a disponimentu</string> + <string name="mozac_feature_addons_supported_checker_notification_title_plural" tools:ignore="UnusedResources">Cumplementos noos a disponimentu</string> <!-- The content of the notification, this will be shown to the user when one newly supported add-on is available. %1$s is the add-on name and %2$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_one">Agiunghe %1$s a %2$s</string> <!-- The content of the notification, this will be shown to the user when two newly supported add-ons are available. %1$s is the first add-on name. %2$s is the second add-on name. %3$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_two">Agiunghe %1$s e %2$s a %3$s</string> <!-- The content of the notification, this will be shown to the user when more than two newly supported add-ons are available. %1$s is the app name (in most cases Firefox). --> <string name="mozac_feature_addons_supported_checker_notification_content_more_than_two">Agiunghe·ddos a %1$s</string> + <!-- This is the caption for not yet supported screen caption --> + <string name="mozac_feature_addons_not_yet_supported_caption2">Semus traballende pro frunire una seletzione initziale de estensiones cussigiadas.</string> <!-- This is the caption for the add-on installation progress overlay --> - <string name="mozac_add_on_install_progress_caption">Iscarrighende e verifichende su cumplementu…</string> + <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Iscarrighende e verifichende su cumplementu…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> - <string name="mozac_feature_addons_failed_to_query_add_ons">Impossìbile otènnere sa lista de cumplementos.</string> + <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Impossìbile otènnere sa lista de cumplementos.</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Impossìbile otènnere sa lista de estensiones.</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Nissuna tradutzione agatada, ne pro su %1$s nen pro sa lìngua predefinida %2$s</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -187,13 +189,13 @@ <!-- Text shown after failed to install an add-on. %1$s is the add-on name. --> <string name="mozac_feature_addons_failed_to_install">Faddina in s’installatzione de %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> - <string name="mozac_feature_addons_failed_to_install_generic">Faddina in s’installatzione de custu cumplementu.</string> + <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Faddina in s’installatzione de custu cumplementu.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> - <string name="mozac_feature_addons_failed_to_install_network_error">Impossìbile iscarrigare custu cumplementu pro more de una faddina in sa connessione.</string> + <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">Impossìbile iscarrigare custu cumplementu pro more de una faddina in sa connessione.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> - <string name="mozac_feature_addons_failed_to_install_corrupt_error">Custu cumplementu non si podet installare ca paret corrùmpidu.</string> + <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Custu cumplementu non si podet installare ca paret corrùmpidu.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> - <string name="mozac_feature_addons_failed_to_install_not_signed_error">Custu cumplementu non si podet installare ca no est averiguadu.</string> + <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Custu cumplementu non si podet installare ca no est averiguadu.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">%1$s non si podet installare ca no est cumpatìbile cun %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -215,9 +217,11 @@ <!-- Text shown after failed to remove an add-on. %1$s is the add-on name. --> <string name="mozac_feature_addons_failed_to_remove" tools:ignore="UnusedResources">Faddina in s’eliminatzione de %1$s</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter. --> - <string name="mozac_feature_addons_unsupported_caption">1 cumplementu</string> + <string name="mozac_feature_addons_unsupported_caption" moz:removedIn="126" tools:ignore="UnusedResources">1 cumplementu</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> - <string name="mozac_feature_addons_unsupported_caption_plural">%1$s cumplementos</string> + <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">%1$s cumplementos</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s estensiones</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Àteras informatziones</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> @@ -234,10 +238,6 @@ <string name="mozac_feature_addons_updater_dialog_status">Istadu:</string> <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> <string name="mozac_feature_addons_installed_dialog_title">%1$s agiuntu a %2$s</string> - <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. --> - <string name="mozac_feature_addons_installed_dialog_description">Aberi·ddu dae su menù</string> - <!-- Confirmation button text for the dialog when add-on installation is completed. --> - <string name="mozac_feature_addons_installed_dialog_okay_button">AB, cumprèndidu</string> <!-- "Learn more" link displayed below an add-on status message. --> <string name="mozac_feature_addons_status_learn_more">Àteras informatziones</string> <!-- Status message below an add-on in the add-ons manager when this add-on has been blocklisted. %1$s is the add-on name. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-si/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-si/strings.xml index 6eb142ef1b..202cf37277 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-si/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-si/strings.xml @@ -162,8 +162,12 @@ <string name="mozac_feature_addons_manager_notification_content_text" moz:removedIn="126" tools:ignore="UnusedResources">ඔබගේ පද්ධතිය අස්ථායී කරමින් එක්කහුවක් හෝ කිහිපයක් නතර විය.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">එක්කහු යළි අරඹන්න</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">දිගු යළි අරඹන්න</string> <!-- Button in the add-ons manager that opens AMO in a tab --> <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">තවත් එක්කහු සොයාගන්න</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">තවත් දිගු සොයන්න</string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">ඉඩ දෙන්න</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -196,6 +200,8 @@ <string name="mozac_feature_addons_not_yet_supported_caption2">දැනට නිර්දේශිත දිගුවල ප්රාරම්භ තේරීමක් සඳහා සහාය තනමින් සිටියි.</string> <!-- This is the caption for the add-on installation progress overlay --> <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">එක්කහුව බාගැනෙමින් හා සත්යාපනය වෙමින්…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">දිගුව බාගැනෙමින් හා සත්යාපනය වෙමින්…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">එක්කහු විමසීමට අසමත් විය!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> @@ -206,6 +212,8 @@ <string name="mozac_feature_addons_failed_to_install">%1$s ස්ථාපනයට අසමත් විය</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">එක්කහුව ස්ථාපනයට අසමත් විය.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">මෙම දිගුව ස්ථාපනයට අසමත් විය.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">සම්බන්ධතාවයට බාධා වීමක් නිසා එක්කහුව බාගැනීමට නොහැකි විය.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> diff --git a/mobile/android/android-components/components/feature/addons/src/main/res/values-su/strings.xml b/mobile/android/android-components/components/feature/addons/src/main/res/values-su/strings.xml index 359ceede95..85eb4e0865 100644 --- a/mobile/android/android-components/components/feature/addons/src/main/res/values-su/strings.xml +++ b/mobile/android/android-components/components/feature/addons/src/main/res/values-su/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" xmlns:moz="http://schemas.android.com/apk/res-auto"> <!-- Description for privacy add-on permission. --> - <string name="mozac_feature_addons_permissions_privacy_description">Bca jeung ropéa setélan pripasi</string> + <string name="mozac_feature_addons_permissions_privacy_description">Baca jeung ropéa setélan pripasi</string> <!-- Description for all_urls add-on permission. --> <string name="mozac_feature_addons_permissions_all_urls_description">Aksés data anjeun pikeun sakabéh raramatloka</string> <!-- Description for giving an add-on access to users's data on one site. %1$s will be replaced by the DNS host name for which a web extension is requesting access (e.g., www.mozilla.org). --> @@ -83,7 +83,7 @@ <!-- The developer website (Homepage) of the add-on. --> <string name="mozac_feature_addons_home_page">Tepas</string> <!-- A link where users can find more information about add-ons permissions. --> - <string name="mozac_feature_addons_learn_more">Leuwih jéntré ngeunaan idin</string> + <string name="mozac_feature_addons_learn_more">Leuwih jéntré ngeunaan pedaran idin</string> <!-- The rating of the add-on. --> <string name="mozac_feature_addons_rating">Peunteun</string> <!-- A link that points to the detail page of the add-on. --> @@ -166,8 +166,12 @@ <string name="mozac_feature_extensions_manager_notification_content_text">Aya émboh nu mugen, ngabalukarkeun sistem anjeun teu stabil.</string> <!-- Button to re-enable the add-ons in the "crash" notification --> <string name="mozac_feature_addons_manager_notification_restart_button" moz:removedIn="126" tools:ignore="UnusedResources">Balikan deui émboh</string> + <!-- Button to re-enable the extensions in the "crash" notification --> + <string name="mozac_feature_extensions_manager_notification_restart_button">Jalankeun deui éksténsi</string> <!-- Button in the add-ons manager that opens AMO in a tab --> <string name="mozac_feature_addons_find_more_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Panggihan émboh lianna</string> + <!-- Button in the extensions manager that opens AMO in a tab --> + <string name="mozac_feature_addons_find_more_extensions_button_text">Téangan leuwih réa éksténsi </string> <!-- The label of the allow button, this will be shown to the user when an add-on needs new permissions, with the button the user will indicate that they want to accept the new permissions and update the add-on--> <string name="mozac_feature_addons_updater_notification_allow_button">Idinan</string> <!-- The label of the deny button on a notification, this will be shown to the user when an add-on needs new permissions. Indicates the user denies the new permissions and prevents the add-on from be updated--> @@ -180,6 +184,8 @@ <string name="mozac_feature_addons_updater_notification_content_singular">Perlu idin anyar</string> <!-- Name of the "notification channel" used for displaying a notification for updating an add-on. See https://developer.android.com/training/notify-user/channels --> <string name="mozac_feature_addons_updater_notification_channel" moz:removedIn="126" tools:ignore="UnusedResources">Apdét add-on</string> + <!-- Name of the "notification channel" used for displaying a notification for updating an extension. See https://developer.android.com/training/notify-user/channels --> + <string name="mozac_feature_addons_updater_notification_channel_2">Apdet éksténsi</string> <!-- Name of the "notification channel" used for displaying a notification for new supported add-ons. See https://developer.android.com/training/notify-user/channels --> <string name="mozac_feature_addons_supported_checker_notification_channel" tools:ignore="UnusedResources">Pamariksa add-on nu didukung</string> <!-- The tile of the notification, this will be shown to the user when one newly supported add-on is available.--> @@ -198,8 +204,12 @@ <string name="mozac_feature_addons_not_yet_supported_caption2">Kami ayeuna ngawangun dukungan pikeun pilihan awal Éksténsi nu Disarankeun.</string> <!-- This is the caption for the add-on installation progress overlay --> <string name="mozac_add_on_install_progress_caption" moz:removedIn="126" tools:ignore="UnusedResources">Ngeundeur jeung verifikasi add-on…</string> + <!-- This is the caption for the extension installation progress overlay --> + <string name="mozac_extension_install_progress_caption">Ngeundeur jeung verifikasi add-on…</string> <!-- Error shown when something unexpected happened while trying to get the add-on list from the server --> <string name="mozac_feature_addons_failed_to_query_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Gagal pikeun pamundut Add-on!</string> + <!-- Error shown when something unexpected happened while trying to get the extension list from the server --> + <string name="mozac_feature_addons_failed_to_query_extensions">Gagal pikeun pamundut Add-on!</string> <!-- Error shown when unable to find a translation for an add-on field. %1$s is the locale of the user and %2$s is the default language of the add-on --> <string name="mozac_feature_addons_failed_to_translate">Tarjamahan teu kapanggih, pikeun daérah %1$s pon kitu ogé basa bawaan %2$s</string> <!-- Text shown after successfully installed an add-on. %1$s is the add-on name. --> @@ -208,12 +218,20 @@ <string name="mozac_feature_addons_failed_to_install">Gagal masang %1$s</string> <!-- Text shown after failing to install an add-on for which we don't have its name. --> <string name="mozac_feature_addons_failed_to_install_generic" moz:removedIn="126" tools:ignore="UnusedResources">Gagal masang ieu émboh.</string> + <!-- Text shown after failing to install an extension for which we don't have its name. --> + <string name="mozac_feature_addons_extension_failed_to_install">Gagal masang ieu éksténsi.</string> <!-- Text shown when attempting to install an add-on and a network error happened. --> <string name="mozac_feature_addons_failed_to_install_network_error" moz:removedIn="126" tools:ignore="UnusedResources">Ieu émboh teu bisa diundeur alatan gagal nyambung.</string> + <!-- Text shown when attempting to install an extension and a network error happened. --> + <string name="mozac_feature_addons_extension_failed_to_install_network_error">Ieu émboh teu bisa diundeur alatan gagal nyambung.</string> <!-- Text shown when attempting to install an add-on and the downloaded file is corrupted. --> <string name="mozac_feature_addons_failed_to_install_corrupt_error" moz:removedIn="126" tools:ignore="UnusedResources">Ieu émboh teu bisa dipasang, sigana alatan korup.</string> + <!-- Text shown when attempting to install an extension and the downloaded file is corrupted. --> + <string name="mozac_feature_addons_extension_failed_to_install_corrupt_error">Ieu émboh teu bisa dipasang, sigana alatan korup.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> <string name="mozac_feature_addons_failed_to_install_not_signed_error" moz:removedIn="126" tools:ignore="UnusedResources">Ieu émboh teu bisa dipasang alatan acan dipéripikasi.</string> + <!-- Text shown when attempting to install an add-on and an error occurred because the extension was not signed. --> + <string name="mozac_feature_addons_extension_failed_to_install_not_signed_error">Ieu émboh teu bisa dipasang alatan acan dipéripikasi.</string> <!-- Text shown when attempting to install an add-on and an error occurred because the extension was incompatible. %1$s is the add-on name, %2$s is the app name and %3$s is the app version. --> <string name="mozac_feature_addons_failed_to_install_incompatible_error">%1$s teu bisa dipasang alatan teu kompatibel jeung %2$s %3$s.</string> <!-- Text shown when attempting to install a blocklisted add-on. %1$s is the add-on name. --> @@ -238,8 +256,12 @@ <string name="mozac_feature_addons_migrated_from_a_previous_version_label" tools:ignore="UnusedResources">Ieu add-on dipindahkeun ti pérsi heubeul %1$s</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter. --> <string name="mozac_feature_addons_unsupported_caption" moz:removedIn="126" tools:ignore="UnusedResources">1 add-on</string> + <!-- Text shown in not yet supported add-ons section. --> + <string name="mozac_feature_addons_unsupported_caption_2">éksténsi</string> <!-- Text shown in not yet supported add-ons section in AddonsManagerAdapter - plural. %1$s is the number of unsupported add-ons --> <string name="mozac_feature_addons_unsupported_caption_plural" moz:removedIn="126" tools:ignore="UnusedResources">%1$s add-on</string> + <!-- Text shown in not yet supported add-ons section - plural. %1$s is the number of unsupported extensions. --> + <string name="mozac_feature_addons_unsupported_caption_plural_2">%1$s éksténsi</string> <!-- Text link to a sumo page for learning more about unsupported add-ons. --> <string name="mozac_feature_addons_unsupported_learn_more">Lenyepan</string> <!-- Displayed in the "Status" field for the updater when an add-on has been correctly updated. --> @@ -258,8 +280,12 @@ <string name="mozac_feature_addons_installed_dialog_title">%1$s geus ditambahkeun ka %2$s</string> <!-- Text shown in the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_description" moz:removedIn="124" tools:ignore="UnusedResources">Buka dina menu</string> + <!-- Text shown in the dialog when add-on installation is completed. %1$s is the add-on name. %2$s is the app name. --> + <string name="mozac_feature_addons_installed_dialog_description_2">Aksés %1$s tina ménu %2$s.</string> <!-- Confirmation button text for the dialog when add-on installation is completed. --> <string name="mozac_feature_addons_installed_dialog_okay_button" moz:removedIn="124" tools:ignore="UnusedResources">Heug, Ngarti</string> + <!-- Confirmation button text for the dialog when add-on installation is completed. --> + <string name="mozac_feature_addons_installed_dialog_okay_button_2">HEUG</string> <!-- "Learn more" link displayed below an add-on status message. --> <string name="mozac_feature_addons_status_learn_more">Lenyepan</string> <!-- Status message below an add-on in the add-ons manager when this add-on has been blocklisted. %1$s is the add-on name. --> diff --git a/mobile/android/android-components/components/feature/addons/src/test/java/AddonManagerTest.kt b/mobile/android/android-components/components/feature/addons/src/test/java/AddonManagerTest.kt index 9c30bd8c0e..c8d3fe8972 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/java/AddonManagerTest.kt +++ b/mobile/android/android-components/components/feature/addons/src/test/java/AddonManagerTest.kt @@ -666,7 +666,12 @@ class AddonManagerTest { val extension: WebExtension = mock() whenever(extension.id).thenReturn("ext1") WebExtensionSupport.installedExtensions[addon.id] = extension - + val metadata: Metadata = mock() + whenever(extension.getMetadata()).thenReturn(metadata) + whenever(metadata.optionalPermissions).thenReturn(permission) + whenever(metadata.grantedOptionalPermissions).thenReturn(permission) + whenever(metadata.optionalOrigins).thenReturn(origin) + whenever(metadata.grantedOptionalOrigins).thenReturn(origin) val engine: Engine = mock() val onSuccessCaptor = argumentCaptor<((WebExtension) -> Unit)>() @@ -685,6 +690,10 @@ class AddonManagerTest { onSuccessCaptor.value.invoke(extension) assertNotNull(updateAddon) assertEquals(addon.id, updateAddon!!.id) + assertEquals("permission1", updateAddon!!.optionalPermissions.first().name) + assertEquals(true, updateAddon!!.optionalPermissions.first().granted) + assertEquals("origin", updateAddon!!.optionalOrigins.first().name) + assertEquals(true, updateAddon!!.optionalOrigins.first().granted) assertTrue(manager.pendingAddonActions.isEmpty()) } diff --git a/mobile/android/android-components/components/feature/addons/src/test/java/mozilla/components/feature/addons/ui/PermissionsDialogFragmentTest.kt b/mobile/android/android-components/components/feature/addons/src/test/java/mozilla/components/feature/addons/ui/PermissionsDialogFragmentTest.kt index 339c880380..88a1ff223f 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/java/mozilla/components/feature/addons/ui/PermissionsDialogFragmentTest.kt +++ b/mobile/android/android-components/components/feature/addons/src/test/java/mozilla/components/feature/addons/ui/PermissionsDialogFragmentTest.kt @@ -48,8 +48,8 @@ class PermissionsDialogFragmentTest { val optionalOrRequiredTextView = dialog.findViewById<TextView>(R.id.optional_or_required_text) val permissionsRecyclerView = dialog.findViewById<RecyclerView>(R.id.permissions) val recyclerAdapter = permissionsRecyclerView.adapter!! as RequiredPermissionsAdapter - val optionalOrRequiredText = fragment.buildOptionalOrRequiredText() val permissionList = fragment.buildPermissionsList() + val optionalOrRequiredText = fragment.buildOptionalOrRequiredText(hasPermissions = permissionList.isNotEmpty()) assertTrue(titleTextView.text.contains(name)) assertTrue(optionalOrRequiredText.contains(testContext.getString(R.string.mozac_feature_addons_permissions_dialog_subtitle))) @@ -153,12 +153,12 @@ class PermissionsDialogFragmentTest { val optionalOrRequiredTextView = dialog.findViewById<TextView>(R.id.optional_or_required_text) val permissionsRecyclerView = dialog.findViewById<RecyclerView>(R.id.permissions) val recyclerAdapter = permissionsRecyclerView.adapter!! as RequiredPermissionsAdapter - val optionalOrRequiredText = fragment.buildOptionalOrRequiredText() val permissionList = fragment.buildPermissionsList() + val optionalOrRequiredText = fragment.buildOptionalOrRequiredText(hasPermissions = permissionList.isNotEmpty()) assertTrue(titleTextView.text.contains(name)) - assertTrue(optionalOrRequiredText.contains(testContext.getString(R.string.mozac_feature_addons_permissions_dialog_subtitle))) - assertTrue(optionalOrRequiredTextView.text.contains(testContext.getString(R.string.mozac_feature_addons_permissions_dialog_subtitle))) + assertFalse(optionalOrRequiredText.contains(testContext.getString(R.string.mozac_feature_addons_permissions_dialog_subtitle))) + assertFalse(optionalOrRequiredTextView.text.contains(testContext.getString(R.string.mozac_feature_addons_permissions_dialog_subtitle))) assertEquals(0, recyclerAdapter.itemCount) assertFalse(permissionList.contains(testContext.getString(R.string.mozac_feature_addons_permissions_privacy_description))) assertFalse(permissionList.contains(testContext.getString(R.string.mozac_feature_addons_permissions_all_urls_description))) @@ -185,8 +185,8 @@ class PermissionsDialogFragmentTest { val recyclerAdapter = permissionsRecyclerView.adapter!! as RequiredPermissionsAdapter val allowButton = dialog.findViewById<Button>(R.id.allow_button) val denyButton = dialog.findViewById<Button>(R.id.deny_button) - val optionalOrRequiredText = fragment.buildOptionalOrRequiredText() val permissionsList = fragment.buildPermissionsList() + val optionalOrRequiredText = fragment.buildOptionalOrRequiredText(hasPermissions = permissionsList.isNotEmpty()) assertEquals( titleTextView.text, diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_localized_single_result.json b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_localized_single_result.json index 94aeed1f64..5bae00d2f6 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_localized_single_result.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_localized_single_result.json @@ -17,12 +17,8 @@ ], "average_daily_users": 6229783, "categories": { - "android": [ - "security-privacy" - ], - "firefox": [ - "privacy-security" - ] + "android": ["security-privacy"], + "firefox": ["privacy-security"] }, "contributions_url": "", "created": "2015-04-25T07:26:22Z", @@ -110,93 +106,54 @@ { "id": 238546, "caption": "The popup panel: default mode", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238546.png?modified=1622132421", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238546.jpg?modified=1622132421" }, { "id": 238548, "caption": "The dashboard: stock filter lists", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238548.png?modified=1622132423", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238548.jpg?modified=1622132423" }, { "id": 238547, "caption": "The popup panel: default-deny mode", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238547.png?modified=1622132425", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238547.jpg?modified=1622132425" }, { "id": 238549, "caption": "The dashboard: settings", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238549.png?modified=1622132426", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238549.jpg?modified=1622132426" }, { "id": 238552, "caption": "The popup panel in Firefox Preview: default mode with more blocking options revealed", - "image_size": [ - 970, - 1800 - ], + "image_size": [970, 1800], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238552.png?modified=1622132430", - "thumbnail_size": [ - 216, - 400 - ], + "thumbnail_size": [216, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238552.jpg?modified=1622132430" }, { "id": 230370, "caption": "The unified logger tells you all that uBO is seeing and doing", - "image_size": [ - 800, - 600 - ], + "image_size": [800, 600], "image_url": "https://addons.mozilla.org/user-media/previews/full/230/230370.png?modified=1622132432", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/230/230370.jpg?modified=1622132432" } ], "promoted": { - "apps": [ - "firefox", - "android" - ], + "apps": ["firefox", "android"], "category": "recommended" }, "ratings": { diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_multiple_results.json b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_multiple_results.json index 8d0b13dad1..30b0a8fc6b 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_multiple_results.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_multiple_results.json @@ -17,12 +17,8 @@ ], "average_daily_users": 6229783, "categories": { - "android": [ - "security-privacy" - ], - "firefox": [ - "privacy-security" - ] + "android": ["security-privacy"], + "firefox": ["privacy-security"] }, "contributions_url": "", "created": "2015-04-25T07:26:22Z", @@ -192,15 +188,9 @@ "caption": { "en-US": "The popup panel: default mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238546.png?modified=1622132421", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238546.jpg?modified=1622132421" }, { @@ -208,15 +198,9 @@ "caption": { "en-US": "The dashboard: stock filter lists" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238548.png?modified=1622132423", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238548.jpg?modified=1622132423" }, { @@ -224,15 +208,9 @@ "caption": { "en-US": "The popup panel: default-deny mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238547.png?modified=1622132425", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238547.jpg?modified=1622132425" }, { @@ -240,15 +218,9 @@ "caption": { "en-US": "The dashboard: settings" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238549.png?modified=1622132426", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238549.jpg?modified=1622132426" }, { @@ -256,15 +228,9 @@ "caption": { "en-US": "The popup panel in Firefox Preview: default mode with more blocking options revealed" }, - "image_size": [ - 970, - 1800 - ], + "image_size": [970, 1800], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238552.png?modified=1622132430", - "thumbnail_size": [ - 216, - 400 - ], + "thumbnail_size": [216, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238552.jpg?modified=1622132430" }, { @@ -272,23 +238,14 @@ "caption": { "en-US": "The unified logger tells you all that uBO is seeing and doing" }, - "image_size": [ - 800, - 600 - ], + "image_size": [800, 600], "image_url": "https://addons.mozilla.org/user-media/previews/full/230/230370.png?modified=1622132432", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/230/230370.jpg?modified=1622132432" } ], "promoted": { - "apps": [ - "firefox", - "android" - ], + "apps": ["firefox", "android"], "category": "recommended" }, "ratings": { @@ -378,12 +335,8 @@ ], "average_daily_users": 111124, "categories": { - "android": [ - "other" - ], - "firefox": [ - "search-tools" - ] + "android": ["other"], + "firefox": ["search-tools"] }, "contributions_url": "", "created": "2017-10-31T15:35:56Z", @@ -653,9 +606,7 @@ }, "previews": [], "promoted": { - "apps": [ - "android" - ], + "apps": ["android"], "category": "recommended" }, "ratings": { diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_single_result.json b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_single_result.json index b6a3a79892..1bc5ba8b99 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_single_result.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/amo_search_single_result.json @@ -17,12 +17,8 @@ ], "average_daily_users": 6229783, "categories": { - "android": [ - "security-privacy" - ], - "firefox": [ - "privacy-security" - ] + "android": ["security-privacy"], + "firefox": ["privacy-security"] }, "contributions_url": "", "created": "2015-04-25T07:26:22Z", @@ -192,15 +188,9 @@ "caption": { "en-US": "The popup panel: default mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238546.png?modified=1622132421", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238546.jpg?modified=1622132421" }, { @@ -208,15 +198,9 @@ "caption": { "en-US": "The dashboard: stock filter lists" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238548.png?modified=1622132423", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238548.jpg?modified=1622132423" }, { @@ -224,15 +208,9 @@ "caption": { "en-US": "The popup panel: default-deny mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238547.png?modified=1622132425", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238547.jpg?modified=1622132425" }, { @@ -240,15 +218,9 @@ "caption": { "en-US": "The dashboard: settings" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238549.png?modified=1622132426", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238549.jpg?modified=1622132426" }, { @@ -256,15 +228,9 @@ "caption": { "en-US": "The popup panel in Firefox Preview: default mode with more blocking options revealed" }, - "image_size": [ - 970, - 1800 - ], + "image_size": [970, 1800], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238552.png?modified=1622132430", - "thumbnail_size": [ - 216, - 400 - ], + "thumbnail_size": [216, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238552.jpg?modified=1622132430" }, { @@ -272,23 +238,14 @@ "caption": { "en-US": "The unified logger tells you all that uBO is seeing and doing" }, - "image_size": [ - 800, - 600 - ], + "image_size": [800, 600], "image_url": "https://addons.mozilla.org/user-media/previews/full/230/230370.png?modified=1622132432", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/230/230370.jpg?modified=1622132432" } ], "promoted": { - "apps": [ - "firefox", - "android" - ], + "apps": ["firefox", "android"], "category": "recommended" }, "ratings": { diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/collection.json b/mobile/android/android-components/components/feature/addons/src/test/resources/collection.json index a337ed148f..15d7ab9d40 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/collection.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/collection.json @@ -18,12 +18,8 @@ ], "average_daily_users": 6229783, "categories": { - "android": [ - "security-privacy" - ], - "firefox": [ - "privacy-security" - ] + "android": ["security-privacy"], + "firefox": ["privacy-security"] }, "contributions_url": "", "created": "2015-04-25T07:26:22Z", @@ -193,15 +189,9 @@ "caption": { "en-US": "The popup panel: default mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238546.png?modified=1622132421", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238546.jpg?modified=1622132421" }, { @@ -209,15 +199,9 @@ "caption": { "en-US": "The dashboard: stock filter lists" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238548.png?modified=1622132423", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238548.jpg?modified=1622132423" }, { @@ -225,15 +209,9 @@ "caption": { "en-US": "The popup panel: default-deny mode" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238547.png?modified=1622132425", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238547.jpg?modified=1622132425" }, { @@ -241,15 +219,9 @@ "caption": { "en-US": "The dashboard: settings" }, - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238549.png?modified=1622132426", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238549.jpg?modified=1622132426" }, { @@ -257,15 +229,9 @@ "caption": { "en-US": "The popup panel in Firefox Preview: default mode with more blocking options revealed" }, - "image_size": [ - 970, - 1800 - ], + "image_size": [970, 1800], "image_url": "https://addons.mozilla.org/user-media/previews/full/238/238552.png?modified=1622132430", - "thumbnail_size": [ - 216, - 400 - ], + "thumbnail_size": [216, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/238/238552.jpg?modified=1622132430" }, { @@ -273,23 +239,14 @@ "caption": { "en-US": "The unified logger tells you all that uBO is seeing and doing" }, - "image_size": [ - 800, - 600 - ], + "image_size": [800, 600], "image_url": "https://addons.mozilla.org/user-media/previews/full/230/230370.png?modified=1622132432", - "thumbnail_size": [ - 533, - 400 - ], + "thumbnail_size": [533, 400], "thumbnail_url": "https://addons.mozilla.org/user-media/previews/thumbs/230/230370.jpg?modified=1622132432" } ], "promoted": { - "apps": [ - "firefox", - "android" - ], + "apps": ["firefox", "android"], "category": "recommended" }, "ratings": { diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/collection_with_empty_values.json b/mobile/android/android-components/components/feature/addons/src/test/resources/collection_with_empty_values.json index fedd44adec..956247cfa1 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/collection_with_empty_values.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/collection_with_empty_values.json @@ -162,15 +162,9 @@ "caption": { "en-US": "Default mode" }, - "image_size": [ - 640, - 480 - ], + "image_size": [640, 480], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/157/157572.png?modified=1543520531", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/157/157572.png?modified=1543520531" }, { @@ -178,15 +172,9 @@ "caption": { "en-US": "The dashboard: stock filter lists" }, - "image_size": [ - 640, - 480 - ], + "image_size": [640, 480], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/157/157576.png?modified=1543520531", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/157/157576.png?modified=1543520531" }, { @@ -194,15 +182,9 @@ "caption": { "en-US": "Dynamic filtering allows default-deny mode" }, - "image_size": [ - 640, - 480 - ], + "image_size": [640, 480], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/157/157592.png?modified=1543520532", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/157/157592.png?modified=1543520532" }, { @@ -210,15 +192,9 @@ "caption": { "en-US": "The dashboard: settings" }, - "image_size": [ - 640, - 480 - ], + "image_size": [640, 480], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/159/159634.png?modified=1543520533", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/159/159634.png?modified=1543520533" }, { @@ -226,15 +202,9 @@ "caption": { "en-US": "Unified logger" }, - "image_size": [ - 700, - 525 - ], + "image_size": [700, 525], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/158/158734.png?modified=1543520534", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/158/158734.png?modified=1543520534" } ], diff --git a/mobile/android/android-components/components/feature/addons/src/test/resources/localized_collection.json b/mobile/android/android-components/components/feature/addons/src/test/resources/localized_collection.json index db7a59ad18..1e2a5ffbb8 100644 --- a/mobile/android/android-components/components/feature/addons/src/test/resources/localized_collection.json +++ b/mobile/android/android-components/components/feature/addons/src/test/resources/localized_collection.json @@ -19,12 +19,8 @@ ], "average_daily_users": 5060298, "categories": { - "android": [ - "security-privacy" - ], - "firefox": [ - "privacy-security" - ] + "android": ["security-privacy"], + "firefox": ["privacy-security"] }, "contributions_url": "", "created": "2015-04-25T07:26:22Z", @@ -110,93 +106,54 @@ { "id": 238546, "caption": "The popup panel: default mode", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238546.png?modified=1590420038", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238546.png?modified=1590420038" }, { "id": 238548, "caption": "The dashboard: stock filter lists", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238548.png?modified=1590420038", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238548.png?modified=1590420038" }, { "id": 238547, "caption": "The popup panel: default-deny mode", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238547.png?modified=1590420038", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238547.png?modified=1590420038" }, { "id": 238549, "caption": "The dashboard: settings", - "image_size": [ - 1011, - 758 - ], + "image_size": [1011, 758], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238549.png?modified=1590420038", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238549.png?modified=1590420038" }, { "id": 238552, "caption": "The popup panel in Firefox Preview: default mode with more blocking options revealed", - "image_size": [ - 970, - 1800 - ], + "image_size": [970, 1800], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/238/238552.png?modified=1590420044", - "thumbnail_size": [ - 259, - 480 - ], + "thumbnail_size": [259, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/238/238552.png?modified=1590420044" }, { "id": 230370, "caption": "The unified logger tells you all that uBO is seeing and doing", - "image_size": [ - 800, - 600 - ], + "image_size": [800, 600], "image_url": "https://addons.cdn.mozilla.net/user-media/previews/full/230/230370.png?modified=1590420038", - "thumbnail_size": [ - 640, - 480 - ], + "thumbnail_size": [640, 480], "thumbnail_url": "https://addons.cdn.mozilla.net/user-media/previews/thumbs/230/230370.png?modified=1590420038" } ], "promoted": { - "apps": [ - "firefox", - "android" - ], + "apps": ["firefox", "android"], "category": "recommended" }, "ratings": { diff --git a/mobile/android/android-components/components/feature/app-links/src/main/res/values-sk/strings.xml b/mobile/android/android-components/components/feature/app-links/src/main/res/values-sk/strings.xml index 0dbc181a50..3896b8371c 100644 --- a/mobile/android/android-components/components/feature/app-links/src/main/res/values-sk/strings.xml +++ b/mobile/android/android-components/components/feature/app-links/src/main/res/values-sk/strings.xml @@ -8,7 +8,7 @@ <string name="mozac_feature_applinks_normal_confirm_dialog_title">Otvoriť v inej aplikácii</string> <!-- The message of the prompt to confirm with users that they want to open the link in another app %s is a placeholder that will be replaced by the app name --> - <string name="mozac_feature_applinks_normal_confirm_dialog_message">Chcete tento obsah zobraziť v aplikácii %s?</string> + <string name="mozac_feature_applinks_normal_confirm_dialog_message">Chcete opustiť %s a zobraziť tento obsah v aplikácii?</string> <!-- Opens the selected time --> <string name="mozac_feature_applinks_confirm_dialog_confirm">Otvoriť</string> <!-- Cancels the prompt --> diff --git a/mobile/android/android-components/components/feature/contextmenu/build.gradle b/mobile/android/android-components/components/feature/contextmenu/build.gradle index f1ab6e0b64..a202c5bed9 100644 --- a/mobile/android/android-components/components/feature/contextmenu/build.gradle +++ b/mobile/android/android-components/components/feature/contextmenu/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation ComponentsDependencies.google_material implementation ComponentsDependencies.androidx_constraintlayout + implementation ComponentsDependencies.androidx_core_ktx testImplementation ComponentsDependencies.androidx_test_core testImplementation ComponentsDependencies.androidx_test_junit diff --git a/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt b/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt index c7e480e038..ac5563aebb 100644 --- a/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt +++ b/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt @@ -27,6 +27,8 @@ import mozilla.components.feature.downloads.AbstractFetchDownloadService.Compani import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext import mozilla.components.lib.state.Store +import mozilla.components.support.base.android.DefaultPowerManagerInfoProvider +import mozilla.components.support.base.android.StartForegroundService import mozilla.components.support.base.log.logger.Logger import kotlin.coroutines.CoroutineContext @@ -42,6 +44,9 @@ class DownloadMiddleware( coroutineContext: CoroutineContext = Dispatchers.IO, @get:VisibleForTesting internal val downloadStorage: DownloadStorage = DownloadStorage(applicationContext), + private val startForegroundService: StartForegroundService = StartForegroundService( + powerManagerInfoProvider = DefaultPowerManagerInfoProvider(applicationContext), + ), ) : Middleware<BrowserState, BrowserAction> { private val logger = Logger("DownloadMiddleware") @@ -164,7 +169,12 @@ class DownloadMiddleware( @VisibleForTesting internal fun startForegroundService(intent: Intent) { - ContextCompat.startForegroundService(applicationContext, intent) + /** + * @see [StartForegroundService] + */ + startForegroundService { + ContextCompat.startForegroundService(applicationContext, intent) + } } @VisibleForTesting diff --git a/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadNotification.kt b/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadNotification.kt index 9b9c9aa34c..95ef2b5eea 100644 --- a/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadNotification.kt +++ b/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadNotification.kt @@ -89,12 +89,17 @@ internal object DownloadNotification { val percentCopied = downloadJobState.getPercent() ?: -1 return NotificationCompat.Builder(context, channelId) + .setStyle( + NotificationCompat.BigTextStyle() + .setBigContentTitle(downloadState.fileName) + .setSummaryText(downloadJobState.getProgress()), + ) .setSmallIcon(R.drawable.mozac_feature_download_ic_ongoing_download) .setContentTitle(downloadState.fileName) .setContentText(downloadJobState.getProgress()) .setColor(ContextCompat.getColor(context, notificationAccentColor)) .setCategory(NotificationCompat.CATEGORY_PROGRESS) - .setProgress(DownloadNotification.PERCENTAGE_MULTIPLIER, percentCopied, isIndeterminate) + .setProgress(PERCENTAGE_MULTIPLIER, percentCopied, isIndeterminate) .setOngoing(true) .setWhen(downloadJobState.createdTime) .setOnlyAlertOnce(true) diff --git a/mobile/android/android-components/components/feature/downloads/src/main/res/values-ast/strings.xml b/mobile/android/android-components/components/feature/downloads/src/main/res/values-ast/strings.xml index 5f9d21334a..ae218de9c4 100644 --- a/mobile/android/android-components/components/feature/downloads/src/main/res/values-ast/strings.xml +++ b/mobile/android/android-components/components/feature/downloads/src/main/res/values-ast/strings.xml @@ -43,9 +43,6 @@ <!-- Message that appears when trying to download with an external app fails. %1$s will be replaced with the name the external app. -->--> <string name="mozac_feature_downloads_unable_to_open_third_party_app">Nun ye posible abrir «%1$s»</string> - <!-- Text for the info dialog when write to storage permissions have been denied but user tries to download a file. --> - <string name="mozac_feature_downloads_write_external_storage_permissions_needed_message">Tienes de permitir l\'accesu a los ficheros ya al conteníu multimedia pa baxar ficheros. Vete a la configuración d\'Android, dempués a los permisos ya toca Permitir.</string> - <!-- Alert dialog confirmation before cancelling downloads, this is the title --> <string name="mozac_feature_downloads_cancel_active_downloads_warning_content_title">¿Quies encaboxar les descargues privaes?</string> <!-- Alert dialog confirmation before cancelling private downloads, this is the body. %1$s will be replaced with the name of the file. --> diff --git a/mobile/android/android-components/components/feature/findinpage/build.gradle b/mobile/android/android-components/components/feature/findinpage/build.gradle index 7abc2177d8..cd778154b7 100644 --- a/mobile/android/android-components/components/feature/findinpage/build.gradle +++ b/mobile/android/android-components/components/feature/findinpage/build.gradle @@ -35,6 +35,7 @@ dependencies { implementation project(':ui-icons') implementation ComponentsDependencies.androidx_constraintlayout + implementation ComponentsDependencies.androidx_core_ktx testImplementation ComponentsDependencies.androidx_test_core testImplementation ComponentsDependencies.androidx_test_junit diff --git a/mobile/android/android-components/components/feature/media/build.gradle b/mobile/android/android-components/components/feature/media/build.gradle index 650288778f..ee649638c8 100644 --- a/mobile/android/android-components/components/feature/media/build.gradle +++ b/mobile/android/android-components/components/feature/media/build.gradle @@ -44,6 +44,7 @@ dependencies { implementation project(':support-utils') implementation ComponentsDependencies.kotlin_coroutines + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.androidx_media testImplementation project(':support-test') diff --git a/mobile/android/android-components/components/feature/media/src/main/res/values-br/strings.xml b/mobile/android/android-components/components/feature/media/src/main/res/values-br/strings.xml index 58beef7ee1..6cc864bb28 100644 --- a/mobile/android/android-components/components/feature/media/src/main/res/values-br/strings.xml +++ b/mobile/android/android-components/components/feature/media/src/main/res/values-br/strings.xml @@ -11,6 +11,25 @@ <string name="mozac_feature_media_sharing_camera_and_microphone">Gweredekaet eo ar cʼhamera hag ar glevell</string> + <!-- Text of notification shown when the device's camera is shared with a website (WebRTC) --> + <string name="mozac_feature_media_sharing_camera_text">Stokit evit digeriñ an ivinell a zo oc’h implij ho kamera.</string> + <!-- Text of notification shown when the device's microphone is shared with a website (WebRTC) --> + <string name="mozac_feature_media_sharing_microphone_text">Stokit evit digeriñ an ivinell a zo oc’h implij ho klevell.</string> + <!-- Text of notification shown when the device's camera and microphone is shared with a website (WebRTC) --> + <string name="mozac_feature_media_sharing_camera_and_microphone_text">Stokit evit digeriñ an ivinell a zo oc’h implij ho klevell hag ho kamera.</string> + + + <!-- Text of reminder notification shown when the device's camera is shared with a website (WebRTC). %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_reminder_text">Adc\'halv: Emañ %1$s oc’h implij ho kamera atav. Stokit evit digeriñ an ivinell.</string> + <!-- Text of reminder notification shown when the device's microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_microphone_reminder_text" moz:RemovedIn="124" tools:ignore="UnusedResources">Adc\'halv: Emañ %1$s oc’h implij ho klevell atav. Stokit evit digeriñ an ivinell</string> + <!-- Text of reminder notification shown when the device's microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_microphone_reminder_text_2">Adc’halv: %1$s a implij ho klevell c’hoazh. Stokit da zigeriñ an ivinell.</string> + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text" moz:RemovedIn="124" tools:ignore="UnusedResources">Adc\'halv: Emañ %1$s oc’h implij ho klevell hag ho kamera atav. Stokit evit digeriñ an ivinell</string> + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text_2">Adc\'halv: Emañ %1$s oc’h implij ho klevell hag ho kamera atav. Stokit evit digeriñ an ivinell</string> + <!--This is the title of the "play" action media shown in the media notification while web content is playing media. Clicking it will resume playing paused media. On most modern Android system only an icon is visible. But screen readers may read this title. --> <string name="mozac_feature_media_notification_action_play">Lenn</string> diff --git a/mobile/android/android-components/components/feature/media/src/main/res/values-nn-rNO/strings.xml b/mobile/android/android-components/components/feature/media/src/main/res/values-nn-rNO/strings.xml index 54a2f5bb49..ecb0bf9ee5 100644 --- a/mobile/android/android-components/components/feature/media/src/main/res/values-nn-rNO/strings.xml +++ b/mobile/android/android-components/components/feature/media/src/main/res/values-nn-rNO/strings.xml @@ -27,6 +27,12 @@ <!-- Text of reminder notification shown when the device's microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> <string name="mozac_feature_media_sharing_microphone_reminder_text_2">Påminning: %1$s brukar framleis mikrofonen din. Trykk for å opne fana.</string> + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text" moz:RemovedIn="124" tools:ignore="UnusedResources">Påminning: %1$s brukar framleis mikrofonen og kameraet ditt. Trykk for å opne fana</string> + + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text_2">Påminning: %1$s brukar framleis mikrofonen og kameraet ditt. Trykk for å opne fana.</string> + <!--This is the title of the "play" action media shown in the media notification while web content is playing media. Clicking it will resume playing paused media. On most modern Android system only an icon is visible. But screen readers may read this title. --> <string name="mozac_feature_media_notification_action_play">Spel av</string> diff --git a/mobile/android/android-components/components/feature/media/src/main/res/values-su/strings.xml b/mobile/android/android-components/components/feature/media/src/main/res/values-su/strings.xml index 36d6141e58..f5ecda93ad 100644 --- a/mobile/android/android-components/components/feature/media/src/main/res/values-su/strings.xml +++ b/mobile/android/android-components/components/feature/media/src/main/res/values-su/strings.xml @@ -22,9 +22,14 @@ <!-- Text of reminder notification shown when the device's camera is shared with a website (WebRTC). %1$s is a placeholder that will be replaced by the app name--> <string name="mozac_feature_media_sharing_camera_reminder_text">Panginget: %1$s maké kénéh kaméra anjeun. Toél pikeun muka tabna.</string> <!-- Text of reminder notification shown when the device's microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> - <string name="mozac_feature_media_sharing_microphone_reminder_text">Panginget: %1$s maké kénéh mikropon anjeun. Toél pikeun muka tabna</string> + <string name="mozac_feature_media_sharing_microphone_reminder_text" moz:RemovedIn="124" tools:ignore="UnusedResources">Panginget: %1$s maké kénéh mikropon anjeun. Toél pikeun muka tabna</string> + <!-- Text of reminder notification shown when the device's microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_microphone_reminder_text_2">Panginget: %1$s maké mikrofon anjeun kénéh. Pencét pikeun muka tab.</string> + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text" moz:RemovedIn="124" tools:ignore="UnusedResources">Panginget: %1$s maké kénéh mikropon jeung kaméra anjeun. Toél pikeun muka tabna</string> + <!-- Text of reminder notification shown when the device's camera and microphone is shared with a website (WebRTC) %1$s is a placeholder that will be replaced by the app name--> - <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text">Panginget: %1$s maké kénéh mikropon jeung kaméra anjeun. Toél pikeun muka tabna</string> + <string name="mozac_feature_media_sharing_camera_and_microphone_reminder_text_2">Panginget: %1$s maké kénéh mikropon jeung kaméra anjeun. Toél pikeun muka tabna</string> <!--This is the title of the "play" action media shown in the media notification while web content is playing media. Clicking it will resume playing paused media. On most modern Android system only an icon is visible. But screen readers may read this title. --> <string name="mozac_feature_media_notification_action_play">Ulinkeun</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt index 481b0e5ce3..768fddddb9 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt +++ b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptFeature.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.map import mozilla.components.browser.state.action.ContentAction import mozilla.components.browser.state.selector.findTabOrCustomTab import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab +import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.prompt.Choice @@ -100,6 +101,7 @@ import mozilla.components.support.base.feature.PermissionsFeature import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.kotlin.ifNullOrEmpty +import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import java.lang.ref.WeakReference import java.security.InvalidParameterException @@ -134,6 +136,8 @@ internal const val FRAGMENT_TAG = "mozac_feature_prompt_dialog" * a dialog (fragment). * @property shareDelegate Delegate used to display share sheet. * @property exitFullscreenUsecase Usecase allowing to exit browser tabs' fullscreen mode. + * @property isLoginAutofillEnabled A callback invoked before an autofill prompt is triggered. If false, + * 'autofill login' prompts will not be shown. * @property isSaveLoginEnabled A callback invoked when a login prompt is triggered. If false, * 'save login' prompts will not be shown. * @property isCreditCardAutofillEnabled A callback invoked when credit card fields are detected in the webpage. @@ -171,6 +175,7 @@ class PromptFeature private constructor( private val exitFullscreenUsecase: ExitFullScreenUseCase = SessionUseCases(store).exitFullscreen, override val creditCardValidationDelegate: CreditCardValidationDelegate? = null, override val loginValidationDelegate: LoginValidationDelegate? = null, + private val isLoginAutofillEnabled: () -> Boolean = { false }, private val isSaveLoginEnabled: () -> Boolean = { false }, private val isCreditCardAutofillEnabled: () -> Boolean = { false }, private val isAddressAutofillEnabled: () -> Boolean = { false }, @@ -219,6 +224,7 @@ class PromptFeature private constructor( exitFullscreenUsecase: ExitFullScreenUseCase = SessionUseCases(store).exitFullscreen, creditCardValidationDelegate: CreditCardValidationDelegate? = null, loginValidationDelegate: LoginValidationDelegate? = null, + isLoginAutofillEnabled: () -> Boolean = { false }, isSaveLoginEnabled: () -> Boolean = { false }, isCreditCardAutofillEnabled: () -> Boolean = { false }, isAddressAutofillEnabled: () -> Boolean = { false }, @@ -243,6 +249,7 @@ class PromptFeature private constructor( exitFullscreenUsecase = exitFullscreenUsecase, creditCardValidationDelegate = creditCardValidationDelegate, loginValidationDelegate = loginValidationDelegate, + isLoginAutofillEnabled = isLoginAutofillEnabled, isSaveLoginEnabled = isSaveLoginEnabled, isCreditCardAutofillEnabled = isCreditCardAutofillEnabled, isAddressAutofillEnabled = isAddressAutofillEnabled, @@ -267,6 +274,7 @@ class PromptFeature private constructor( exitFullscreenUsecase: ExitFullScreenUseCase = SessionUseCases(store).exitFullscreen, creditCardValidationDelegate: CreditCardValidationDelegate? = null, loginValidationDelegate: LoginValidationDelegate? = null, + isLoginAutofillEnabled: () -> Boolean = { false }, isSaveLoginEnabled: () -> Boolean = { false }, isCreditCardAutofillEnabled: () -> Boolean = { false }, isAddressAutofillEnabled: () -> Boolean = { false }, @@ -290,6 +298,7 @@ class PromptFeature private constructor( exitFullscreenUsecase = exitFullscreenUsecase, creditCardValidationDelegate = creditCardValidationDelegate, loginValidationDelegate = loginValidationDelegate, + isLoginAutofillEnabled = isLoginAutofillEnabled, isSaveLoginEnabled = isSaveLoginEnabled, isCreditCardAutofillEnabled = isCreditCardAutofillEnabled, isAddressAutofillEnabled = isAddressAutofillEnabled, @@ -436,12 +445,12 @@ class PromptFeature private constructor( } } - // Dismiss all prompts when page URL or session id changes. See Fenix#5326 + // Dismiss all prompts when page host or session id changes. See Fenix#5326 dismissPromptScope = store.flowScoped { flow -> flow.ifAnyChanged { state -> arrayOf( state.selectedTabId, - state.findTabOrCustomTabOrSelectedTab(customTabId)?.content?.url, + state.findTabOrCustomTabOrSelectedTab(customTabId)?.content?.url?.tryGetHostFromUrl(), ) }.collect { dismissSelectPrompts() @@ -559,17 +568,18 @@ class PromptFeature private constructor( } is SelectLoginPrompt -> { - if (promptRequest.logins.isEmpty()) { - if (isSuggestStrongPasswordEnabled) { - val currentUrl = - store.state.findTabOrCustomTabOrSelectedTab(customTabId)?.content?.url - if (currentUrl != null) { - strongPasswordPromptViewListener?.handleSuggestStrongPasswordRequest( - promptRequest, - currentUrl, - onSaveLoginWithStrongPassword, - ) - } + if (!isLoginAutofillEnabled()) { + return + } + if (promptRequest.generatedPassword != null && isSuggestStrongPasswordEnabled) { + val currentUrl = + store.state.findTabOrCustomTabOrSelectedTab(customTabId)?.content?.url + if (currentUrl != null) { + strongPasswordPromptViewListener?.handleSuggestStrongPasswordRequest( + promptRequest, + currentUrl, + onSaveLoginWithStrongPassword, + ) } } else { loginPicker?.handleSelectLoginRequest(promptRequest) @@ -872,6 +882,7 @@ class PromptFeature private constructor( inputLabel, inputValue, promptAbuserDetector.areDialogsBeingAbused(), + store.state.selectedTab?.content?.private == true, ) } } diff --git a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt index 01492e96e4..41aeca796c 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt +++ b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragment.kt @@ -11,15 +11,18 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater +import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.EditText import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.inputmethod.EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING import mozilla.components.feature.prompts.R import mozilla.components.ui.widgets.withCenterAlignedButtons private const val KEY_USER_EDIT_TEXT = "KEY_USER_EDIT_TEXT" private const val KEY_LABEL_INPUT = "KEY_LABEL_INPUT" private const val KEY_DEFAULT_INPUT_VALUE = "KEY_DEFAULT_INPUT_VALUE" +private const val KEY_PRIVATE = "KEY_PRIVATE" /** * [androidx.fragment.app.DialogFragment] implementation to display a @@ -38,6 +41,11 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te */ internal val labelInput: String? by lazy { safeArguments.getString(KEY_LABEL_INPUT) } + /** + * Tells if the Dialog is shown from private browsing + */ + internal val private: Boolean? by lazy { safeArguments.getBoolean(KEY_PRIVATE) } + private var userSelectionEditText: String get() = safeArguments.getString(KEY_USER_EDIT_TEXT, defaultInputValue) set(value) { @@ -73,6 +81,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te label.text = labelInput editText.setText(defaultInputValue) editText.addTextChangedListener(this) + editText.imeOptions = if (private == true) IME_FLAG_NO_PERSONALIZED_LEARNING else IME_NULL addCheckBoxIfNeeded(view) @@ -100,7 +109,9 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te * @param hasShownManyDialogs tells if this [sessionId] has shown many dialogs * in a short period of time, if is true a checkbox will be part of the dialog, for the user * to choose if wants to prevent this [sessionId] continuing showing dialogs. + * @param private tells if this dialog is triggered from private browsing */ + @Suppress("complexity:LongParameterList") fun newInstance( sessionId: String, promptRequestUID: String, @@ -109,6 +120,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te inputLabel: String, defaultInputValue: String, hasShownManyDialogs: Boolean, + private: Boolean, ): TextPromptDialogFragment { val fragment = TextPromptDialogFragment() val arguments = fragment.arguments ?: Bundle() @@ -121,6 +133,7 @@ internal class TextPromptDialogFragment : AbstractPromptTextDialogFragment(), Te putString(KEY_LABEL_INPUT, inputLabel) putString(KEY_DEFAULT_INPUT_VALUE, defaultInputValue) putBoolean(KEY_MANY_ALERTS, hasShownManyDialogs) + putBoolean(KEY_PRIVATE, private) } fragment.arguments = arguments diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-br/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-br/strings.xml index ee06036029..f7833ace0f 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-br/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-br/strings.xml @@ -17,9 +17,9 @@ <!-- Text for password field in an authentication dialog. --> <string name="mozac_feature_prompt_password_hint">Ger-tremen</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save">Na enrollañ</string> + <string name="mozac_feature_prompt_dont_save" moz:removedIn="125" tools:ignore="UnusedResources">Na enrollañ</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save_2" tools:ignore="UnusedResources">Diwezhatoc’h</string> + <string name="mozac_feature_prompt_dont_save_2">Diwezhatoc’h</string> <!-- Negative confirmation that we should never save a login for this site --> <string name="mozac_feature_prompt_never_save">Na enrollañ biken</string> <!-- Negative confirmation that we should not save a credit card for this site --> @@ -27,27 +27,27 @@ <!-- Positive confirmation that we should save the new or updated login --> <string name="mozac_feature_prompt_save_confirmation">Enrollañ</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update">Na hizivaat</string> + <string name="mozac_feature_prompt_dont_update" moz:removedIn="125" tools:ignore="UnusedResources">Na hizivaat</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update_2" tools:ignore="UnusedResources">Diwezhatoc’h</string> + <string name="mozac_feature_prompt_dont_update_2">Diwezhatoc’h</string> <!-- Positive confirmation that we should save the updated login --> <string name="mozac_feature_prompt_update_confirmation">Hizivaat</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password">Ar vaezienn ger-tremen a rank bezañ leuniet</string> + <string name="mozac_feature_prompt_error_empty_password" moz:removedIn="125" tools:ignore="UnusedResources">Ar vaezienn ger-tremen a rank bezañ leuniet</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password_2" tools:ignore="UnusedResources">Enankit ur ger-tremen</string> + <string name="mozac_feature_prompt_error_empty_password_2">Enankit ur ger-tremen</string> <!-- Error text displayed underneath the login field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause">Ne cʼhaller ket enrollañ an titour kennaskañ</string> + <string name="mozac_feature_prompt_error_unknown_cause" moz:removedIn="125" tools:ignore="UnusedResources">Ne cʼhaller ket enrollañ an titour kennaskañ</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause_2" tools:ignore="UnusedResources">N’haller ket enrollañ ar ger-tremen</string> + <string name="mozac_feature_prompt_error_unknown_cause_2">N’haller ket enrollañ ar ger-tremen</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new login. --> - <string name="mozac_feature_prompt_login_save_headline">Enrollañ an titour kennaskañ-mañ?</string> + <string name="mozac_feature_prompt_login_save_headline" moz:removedIn="125" tools:ignore="UnusedResources">Enrollañ an titour kennaskañ-mañ?</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new password. --> - <string name="mozac_feature_prompt_login_save_headline_2" tools:ignore="UnusedResources">Enrollañ ar ger-tremen?</string> + <string name="mozac_feature_prompt_login_save_headline_2">Enrollañ ar ger-tremen?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the login. --> - <string name="mozac_feature_prompt_login_update_headline">Hizivaat an titour kennaskañ-mañ?</string> + <string name="mozac_feature_prompt_login_update_headline" moz:removedIn="125" tools:ignore="UnusedResources">Hizivaat an titour kennaskañ-mañ?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the password. --> - <string name="mozac_feature_prompt_login_update_headline_2" tools:ignore="UnusedResources">Hizivaat ar ger-tremen?</string> + <string name="mozac_feature_prompt_login_update_headline_2">Hizivaat ar ger-tremen?</string> <!-- Prompt message displayed when app detects a user has entered a username for an existing login without a username and user decides if app should update the login. --> <string name="mozac_feature_prompt_login_add_username_headline">Ouzhpennañ an anv arveriad dʼar gerioù-tremen enrollet?</string> <!-- Text for a label for the field when prompt requesting a text is shown. --> @@ -96,22 +96,29 @@ <!-- Title of the time picker dialog. --> <string name="mozac_feature_prompts_set_time">Dibab an eur</string> <!-- Option in expanded select login prompt that links to login settings --> - <string name="mozac_feature_prompts_manage_logins">Ardoer titouroù kennaskañ</string> + <string name="mozac_feature_prompts_manage_logins" moz:removedIn="125" tools:ignore="UnusedResources">Ardoer titouroù kennaskañ</string> <!-- Option in expanded select password prompt that links to password settings --> - <string name="mozac_feature_prompts_manage_logins_2" tools:ignore="UnusedResources">Merañ ar gerioù-tremen</string> + <string name="mozac_feature_prompts_manage_logins_2">Merañ ar gerioù-tremen</string> <!-- Content description for expanding the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description">Brasaat an titouroù kennaskañ aliet</string> + <string name="mozac_feature_prompts_expand_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Brasaat an titouroù kennaskañ aliet</string> <!-- Content description for expanding the saved passwords options in the select password prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description_2" tools:ignore="UnusedResources">Dispakañ ar gerioù-tremen enrollet</string> + <string name="mozac_feature_prompts_expand_logins_content_description_2">Dispakañ ar gerioù-tremen enrollet</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description">Berraat an titouroù kennaskañ aliet</string> + <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Berraat an titouroù kennaskañ aliet</string> <!-- Content description for collapsing the saved passwords options in the select password prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description_2" tools:ignore="UnusedResources">Kuzhat ar gerioù-tremen enrollet</string> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Kuzhat ar gerioù-tremen enrollet</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> - <string name="mozac_feature_prompts_saved_logins">Titouroù kennaskañ aliet</string> + <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Titouroù kennaskañ aliet</string> <!-- Header for the select password prompt to allow users to fill a form with a saved password --> - <string name="mozac_feature_prompts_saved_logins_2" tools:ignore="UnusedResources">Gerioù-tremen enrollet</string> + <string name="mozac_feature_prompts_saved_logins_2">Gerioù-tremen enrollet</string> + + <!-- Content description for the suggest strong password prompt to allow users to fill a form with a suggested strong password --> + <string name="mozac_feature_prompts_suggest_strong_password_content_description">Kinnig ur ger-tremen kreñv</string> + <!-- Header for the suggest strong password prompt to allow users to fill a form with a suggested strong password --> + <string name="mozac_feature_prompts_suggest_strong_password">Kinnig ur ger-tremen kreñv</string> + <!-- Title for using the suggest strong password confirmation dialog. %1$s will be replaced with the generated password --> + <string name="mozac_feature_prompts_suggest_strong_password_message">Implij ur ger-tremen kreñv: %1$s</string> <!-- Strings shown in a dialog that appear when users try to refresh a certain kind of webpages --> <string name="mozac_feature_prompt_repost_title">Kas roadennoù en-dro d’al lec’hienn?</string> @@ -123,38 +130,43 @@ <!-- Credit Card Autofill --> <!-- Header for the select credit card prompt to allow users to fill a form with a saved credit card. --> - <string name="mozac_feature_prompts_select_credit_card">Diuzañ ur gartenn gred</string> + <string name="mozac_feature_prompts_select_credit_card" moz:removedIn="125" tools:ignore="UnusedResources">Diuzañ ur gartenn gred</string> + <!-- Header for the select card prompt to allow users to fill a form with a saved card. --> + <string name="mozac_feature_prompts_select_credit_card_2">Ober gant ur gartenn enrollet</string> <!-- Content description for expanding the select credit card options in the select credit card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description">Astenn ar cʼhartennoù kred kinniget</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Astenn ar cʼhartennoù kred kinniget</string> <!-- Content description for expanding the saved card options in the select card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description_2" tools:ignore="UnusedResources">Dispakañ ar c’hartennoù enrollet</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description_2">Dispakañ ar c’hartennoù enrollet</string> <!-- Content description for collapsing the select credit card options in the select credit prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description">Bihanaat ar cʼhartennoù kred kinniget</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Bihanaat ar cʼhartennoù kred kinniget</string> <!-- Content description for collapsing the saved card options in the select prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2" tools:ignore="UnusedResources">Kuzhat ar c’hartennoù enrollet</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2">Kuzhat ar c’hartennoù enrollet</string> <!-- Option in the expanded select credit card prompt that links to credit cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards">Merañ ar cʼhartennoù kred</string> + <string name="mozac_feature_prompts_manage_credit_cards" moz:removedIn="125" tools:ignore="UnusedResources">Merañ ar cʼhartennoù kred</string> <!-- Option in the expanded select card prompt that links to cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards_2" tools:ignore="UnusedResources">Merañ ar c’hartennoù</string> + <string name="mozac_feature_prompts_manage_credit_cards_2">Merañ ar c’hartennoù</string> <!-- Text for the title of a save credit card dialog. --> <string name="mozac_feature_prompts_save_credit_card_prompt_title">Enrollañ ar gartenn-mañ en surentez?</string> <!-- Text for the title of an update credit card dialog. --> <string name="mozac_feature_prompts_update_credit_card_prompt_title">Hizivaat deiziad termen ar gartenn?</string> <!-- Subtitle text displayed under the title of the save credit card dialog. --> - <string name="mozac_feature_prompts_save_credit_card_prompt_body">Enrigenet e vo niverenn ar gartenn. Ne vo ket enrollet ar c’hod surentez.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body" moz:removedIn="125" tools:ignore="UnusedResources">Enrigenet e vo niverenn ar gartenn. Ne vo ket enrollet ar c’hod surentez.</string> + + <!-- Subtitle text displayed under the title of the saved card dialog. Parameter will be replaced by app name--> + <string name="mozac_feature_prompts_save_credit_card_prompt_body_2">%s a enrinego ho niverenn gartenn. Ne vo ket enrollet ho poneg surentez.</string> <!-- Address Autofill --> <!-- Header for the select address prompt to allow users to fill a form with a saved address. --> <string name="mozac_feature_prompts_select_address_2">Dibab ur chomlec’h</string> <!-- Content description for expanding the select addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description">Displegañ ar chomlec’hioù kinniget</string> + <string name="mozac_feature_prompts_expand_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Displegañ ar chomlec’hioù kinniget</string> <!-- Content description for expanding the saved addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description_2" tools:ignore="UnusedResources">Dispakañ ar chomlec’hioù enrollet</string> + <string name="mozac_feature_prompts_expand_address_content_description_2">Dispakañ ar chomlec’hioù enrollet</string> <!-- Content description for collapsing the select address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description">Plegañ ar chomlec’hioù kinniget</string> + <string name="mozac_feature_prompts_collapse_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Plegañ ar chomlec’hioù kinniget</string> <!-- Content description for collapsing the saved address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description_2" tools:ignore="UnusedResources">Kuzhat ar chomlec’hioù enrollet</string> + <string name="mozac_feature_prompts_collapse_address_content_description_2">Kuzhat ar chomlec’hioù enrollet</string> <!-- Text for the manage addresses button. --> <string name="mozac_feature_prompts_manage_address">Merañ ar chomlec’hioù</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-kab/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-kab/strings.xml index dc9067b13a..595f0075a4 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-kab/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-kab/strings.xml @@ -103,6 +103,8 @@ <string name="mozac_feature_prompts_expand_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Sken-d inekcam isumar</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Ffer inekcam isumar</string> + <!-- Content description for collapsing the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Fneḍ awalen n uεeddi i yettwaskelsen</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Inekcam yettwasumren</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-nn-rNO/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-nn-rNO/strings.xml index 6266243205..15d975b4eb 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-nn-rNO/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-nn-rNO/strings.xml @@ -38,6 +38,8 @@ <string name="mozac_feature_prompt_error_empty_password_2">Skriv inn passord</string> <!-- Error text displayed underneath the login field when it is in an error case --> <string name="mozac_feature_prompt_error_unknown_cause" moz:removedIn="125" tools:ignore="UnusedResources">Klarte ikkje å lagre innlogginga</string> + <!-- Error text displayed underneath the password field when it is in an error case --> + <string name="mozac_feature_prompt_error_unknown_cause_2">Kan ikkje lagre passordet</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new login. --> <string name="mozac_feature_prompt_login_save_headline" moz:removedIn="125" tools:ignore="UnusedResources">Lagre denne innlogginga?</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new password. --> @@ -103,6 +105,8 @@ <string name="mozac_feature_prompts_expand_logins_content_description_2">Utvid lagra passord</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Slå saman føreslåtte innloggingar</string> + <!-- Content description for collapsing the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Skjul lagra passord</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Føreslåtte innloggingar</string> @@ -131,8 +135,12 @@ <string name="mozac_feature_prompts_select_credit_card_2">Bruk lagra kort</string> <!-- Content description for expanding the select credit card options in the select credit card prompt. --> <string name="mozac_feature_prompts_expand_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Utvid føreslått betalingskort</string> + <!-- Content description for expanding the saved card options in the select card prompt. --> + <string name="mozac_feature_prompts_expand_credit_cards_content_description_2">Utvid lagra passord</string> <!-- Content description for collapsing the select credit card options in the select credit prompt. --> <string name="mozac_feature_prompts_collapse_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Minimer føreslått betalingskort</string> + <!-- Content description for collapsing the saved card options in the select prompt. --> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2">Skjul lagra kort</string> <!-- Option in the expanded select credit card prompt that links to credit cards settings. --> <string name="mozac_feature_prompts_manage_credit_cards" moz:removedIn="125" tools:ignore="UnusedResources">Handsam betalingskort</string> <!-- Option in the expanded select card prompt that links to cards settings. --> @@ -144,6 +152,9 @@ <!-- Subtitle text displayed under the title of the save credit card dialog. --> <string name="mozac_feature_prompts_save_credit_card_prompt_body" moz:removedIn="125" tools:ignore="UnusedResources">Kortnummeret vil bli kryptert. Tryggingskoden vert ikkje lagra.</string> + <!-- Subtitle text displayed under the title of the saved card dialog. Parameter will be replaced by app name--> + <string name="mozac_feature_prompts_save_credit_card_prompt_body_2">%s krypterer kortnummeret ditt. Sikkerheitskoden din vert ikkje lagra.</string> + <!-- Address Autofill --> <!-- Header for the select address prompt to allow users to fill a form with a saved address. --> <string name="mozac_feature_prompts_select_address_2">Vel adresse</string> @@ -153,6 +164,8 @@ <string name="mozac_feature_prompts_expand_address_content_description_2">Utvid lagra adresser</string> <!-- Content description for collapsing the select address options in the select address prompt. --> <string name="mozac_feature_prompts_collapse_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Slå saman føreslåtte adresser</string> + <!-- Content description for collapsing the saved address options in the select address prompt. --> + <string name="mozac_feature_prompts_collapse_address_content_description_2">Skjul lagra adresser</string> <!-- Text for the manage addresses button. --> <string name="mozac_feature_prompts_manage_address">Handsam adresser</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-sc/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-sc/strings.xml index e4dd91d8c6..74d17b4a10 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-sc/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-sc/strings.xml @@ -17,9 +17,9 @@ <!-- Text for password field in an authentication dialog. --> <string name="mozac_feature_prompt_password_hint">Crae</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save">Non sarves</string> + <string name="mozac_feature_prompt_dont_save" moz:removedIn="125" tools:ignore="UnusedResources">Non sarves</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save_2" tools:ignore="UnusedResources">Immoe nono</string> + <string name="mozac_feature_prompt_dont_save_2">Immoe nono</string> <!-- Negative confirmation that we should never save a login for this site --> <string name="mozac_feature_prompt_never_save">Non sarves mai</string> <!-- Negative confirmation that we should not save a credit card for this site --> @@ -27,27 +27,27 @@ <!-- Positive confirmation that we should save the new or updated login --> <string name="mozac_feature_prompt_save_confirmation">Sarva</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update">No atualizes</string> + <string name="mozac_feature_prompt_dont_update" moz:removedIn="125" tools:ignore="UnusedResources">No atualizes</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update_2" tools:ignore="UnusedResources">Immoe nono</string> + <string name="mozac_feature_prompt_dont_update_2">Immoe nono</string> <!-- Positive confirmation that we should save the updated login --> <string name="mozac_feature_prompt_update_confirmation">Atualiza</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password">Sa crae non podet èssere bòida</string> + <string name="mozac_feature_prompt_error_empty_password" moz:removedIn="125" tools:ignore="UnusedResources">Sa crae non podet èssere bòida</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password_2" tools:ignore="UnusedResources">Inserta una crae</string> + <string name="mozac_feature_prompt_error_empty_password_2">Inserta una crae</string> <!-- Error text displayed underneath the login field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause">Impossìbile sarvare is credentziales</string> + <string name="mozac_feature_prompt_error_unknown_cause" moz:removedIn="125" tools:ignore="UnusedResources">Impossìbile sarvare is credentziales</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause_2" tools:ignore="UnusedResources">Impossìbile sarvare sa crae</string> + <string name="mozac_feature_prompt_error_unknown_cause_2">Impossìbile sarvare sa crae</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new login. --> - <string name="mozac_feature_prompt_login_save_headline">Boles sarvare custa credentziale?</string> + <string name="mozac_feature_prompt_login_save_headline" moz:removedIn="125" tools:ignore="UnusedResources">Boles sarvare custa credentziale?</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new password. --> - <string name="mozac_feature_prompt_login_save_headline_2" tools:ignore="UnusedResources">Boles sarvare sa crae?</string> + <string name="mozac_feature_prompt_login_save_headline_2">Boles sarvare sa crae?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the login. --> - <string name="mozac_feature_prompt_login_update_headline">Boles atualizare custa credentziale?</string> + <string name="mozac_feature_prompt_login_update_headline" moz:removedIn="125" tools:ignore="UnusedResources">Boles atualizare custa credentziale?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the password. --> - <string name="mozac_feature_prompt_login_update_headline_2" tools:ignore="UnusedResources">Boles atualizare sa crae?</string> + <string name="mozac_feature_prompt_login_update_headline_2">Boles atualizare sa crae?</string> <!-- Prompt message displayed when app detects a user has entered a username for an existing login without a username and user decides if app should update the login. --> <string name="mozac_feature_prompt_login_add_username_headline">Boles agiùnghere su nòmine de utente a sa crae sarvada?</string> <!-- Text for a label for the field when prompt requesting a text is shown. --> @@ -97,18 +97,22 @@ <!-- Title of the time picker dialog. --> <string name="mozac_feature_prompts_set_time">Cunfigura s’ora</string> <!-- Option in expanded select login prompt that links to login settings --> - <string name="mozac_feature_prompts_manage_logins">Gesti is credentziales</string> + <string name="mozac_feature_prompts_manage_logins" moz:removedIn="125" tools:ignore="UnusedResources">Gesti is credentziales</string> <!-- Option in expanded select password prompt that links to password settings --> - <string name="mozac_feature_prompts_manage_logins_2" tools:ignore="UnusedResources">Gesti is craes</string> + <string name="mozac_feature_prompts_manage_logins_2">Gesti is craes</string> <!-- Content description for expanding the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description">Ismànnia is credentziales cussigiadas</string> + <string name="mozac_feature_prompts_expand_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Ismànnia is credentziales cussigiadas</string> + <!-- Content description for expanding the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_expand_logins_content_description_2">Ismànnia is craes sarvadas</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description">Mìnima is credentziales cussigiadas</string> + <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Mìnima is credentziales cussigiadas</string> + <!-- Content description for collapsing the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Mìnima is craes sarvadas</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> - <string name="mozac_feature_prompts_saved_logins">Credentziales cussigiadas</string> + <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Credentziales cussigiadas</string> <!-- Header for the select password prompt to allow users to fill a form with a saved password --> - <string name="mozac_feature_prompts_saved_logins_2" tools:ignore="UnusedResources">Craes sarvadas</string> + <string name="mozac_feature_prompts_saved_logins_2">Craes sarvadas</string> <!-- Content description for the suggest strong password prompt to allow users to fill a form with a suggested strong password --> <string name="mozac_feature_prompts_suggest_strong_password_content_description">Cussìgia una crae segura</string> @@ -126,35 +130,43 @@ <!-- Credit Card Autofill --> <!-- Header for the select credit card prompt to allow users to fill a form with a saved credit card. --> - <string name="mozac_feature_prompts_select_credit_card">Seletziona una carta de crèditu</string> + <string name="mozac_feature_prompts_select_credit_card" moz:removedIn="125" tools:ignore="UnusedResources">Seletziona una carta de crèditu</string> <!-- Header for the select card prompt to allow users to fill a form with a saved card. --> - <string name="mozac_feature_prompts_select_credit_card_2" tools:ignore="UnusedResources">Imprea una carta sarvada</string> + <string name="mozac_feature_prompts_select_credit_card_2">Imprea una carta sarvada</string> <!-- Content description for expanding the select credit card options in the select credit card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description">Ismànnia is cartas de crèditu cussigiadas</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Ismànnia is cartas de crèditu cussigiadas</string> + <!-- Content description for expanding the saved card options in the select card prompt. --> + <string name="mozac_feature_prompts_expand_credit_cards_content_description_2">Ismànnia is cartas sarvadas</string> <!-- Content description for collapsing the select credit card options in the select credit prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description">Mìnima is cartas de crèditu cussigiadas</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Mìnima is cartas de crèditu cussigiadas</string> + <!-- Content description for collapsing the saved card options in the select prompt. --> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2">Mìnima is cartas sarvadas</string> <!-- Option in the expanded select credit card prompt that links to credit cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards">Gesti is cartas de crèditu</string> + <string name="mozac_feature_prompts_manage_credit_cards" moz:removedIn="125" tools:ignore="UnusedResources">Gesti is cartas de crèditu</string> <!-- Option in the expanded select card prompt that links to cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards_2" tools:ignore="UnusedResources">Gesti is cartas</string> + <string name="mozac_feature_prompts_manage_credit_cards_2">Gesti is cartas</string> <!-- Text for the title of a save credit card dialog. --> <string name="mozac_feature_prompts_save_credit_card_prompt_title">Boles sarvare custa carta cun seguresa?</string> <!-- Text for the title of an update credit card dialog. --> <string name="mozac_feature_prompts_update_credit_card_prompt_title">Boles atualizare sa data de iscadèntzia de sa carta?</string> <!-- Subtitle text displayed under the title of the save credit card dialog. --> - <string name="mozac_feature_prompts_save_credit_card_prompt_body">Su nùmeru de carta at a èssere tzifradu. Su còdighe de seguresa no at a èssere sarvadu.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body" moz:removedIn="125" tools:ignore="UnusedResources">Su nùmeru de carta at a èssere tzifradu. Su còdighe de seguresa no at a èssere sarvadu.</string> <!-- Subtitle text displayed under the title of the saved card dialog. Parameter will be replaced by app name--> - <string name="mozac_feature_prompts_save_credit_card_prompt_body_2" tools:ignore="UnusedResources">%s tzifrat su nùmeru de sa carta tua. Su còdighe de seguresa no at a èssere sarvadu.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body_2">%s tzifrat su nùmeru de sa carta tua. Su còdighe de seguresa no at a èssere sarvadu.</string> <!-- Address Autofill --> <!-- Header for the select address prompt to allow users to fill a form with a saved address. --> <string name="mozac_feature_prompts_select_address_2">Seletziona un’indiritzu</string> <!-- Content description for expanding the select addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description">Ismànnia is indiritzos cussigiados</string> + <string name="mozac_feature_prompts_expand_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Ismànnia is indiritzos cussigiados</string> + <!-- Content description for expanding the saved addresses options in the select address prompt. --> + <string name="mozac_feature_prompts_expand_address_content_description_2">Ismànnia is indiritzos sarvados</string> <!-- Content description for collapsing the select address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description">Mìnima is indiritzos cussigiados</string> + <string name="mozac_feature_prompts_collapse_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Mìnima is indiritzos cussigiados</string> + <!-- Content description for collapsing the saved address options in the select address prompt. --> + <string name="mozac_feature_prompts_collapse_address_content_description_2">Mìnima is indiritzos sarvados</string> <!-- Text for the manage addresses button. --> <string name="mozac_feature_prompts_manage_address">Gesti is indiritzos</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-sl/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-sl/strings.xml index dec932c1c5..afe0f515ca 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-sl/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-sl/strings.xml @@ -17,9 +17,9 @@ <!-- Text for password field in an authentication dialog. --> <string name="mozac_feature_prompt_password_hint">Geslo</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save">Ne shrani</string> + <string name="mozac_feature_prompt_dont_save" moz:removedIn="125" tools:ignore="UnusedResources">Ne shrani</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save_2" tools:ignore="UnusedResources">Ne zdaj</string> + <string name="mozac_feature_prompt_dont_save_2">Ne zdaj</string> <!-- Negative confirmation that we should never save a login for this site --> <string name="mozac_feature_prompt_never_save">Nikoli ne shranjuj</string> <!-- Negative confirmation that we should not save a credit card for this site --> @@ -27,23 +27,27 @@ <!-- Positive confirmation that we should save the new or updated login --> <string name="mozac_feature_prompt_save_confirmation">Shrani</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update">Ne posodobi</string> + <string name="mozac_feature_prompt_dont_update" moz:removedIn="125" tools:ignore="UnusedResources">Ne posodobi</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update_2" tools:ignore="UnusedResources">Ne zdaj</string> + <string name="mozac_feature_prompt_dont_update_2">Ne zdaj</string> <!-- Positive confirmation that we should save the updated login --> <string name="mozac_feature_prompt_update_confirmation">Posodobi</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password">Polje za geslo ne sme biti prazno</string> + <string name="mozac_feature_prompt_error_empty_password" moz:removedIn="125" tools:ignore="UnusedResources">Polje za geslo ne sme biti prazno</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password_2" tools:ignore="UnusedResources">Vnesite geslo</string> + <string name="mozac_feature_prompt_error_empty_password_2">Vnesite geslo</string> <!-- Error text displayed underneath the login field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause">Ni mogoče shraniti povezave</string> + <string name="mozac_feature_prompt_error_unknown_cause" moz:removedIn="125" tools:ignore="UnusedResources">Ni mogoče shraniti povezave</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause_2" tools:ignore="UnusedResources">Gesla ni mogoče shraniti</string> + <string name="mozac_feature_prompt_error_unknown_cause_2">Gesla ni mogoče shraniti</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new login. --> - <string name="mozac_feature_prompt_login_save_headline">Shranim to prijavo?</string> + <string name="mozac_feature_prompt_login_save_headline" moz:removedIn="125" tools:ignore="UnusedResources">Shranim to prijavo?</string> + <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new password. --> + <string name="mozac_feature_prompt_login_save_headline_2">Shranim geslo?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the login. --> - <string name="mozac_feature_prompt_login_update_headline">Posodobim to prijavo?</string> + <string name="mozac_feature_prompt_login_update_headline" moz:removedIn="125" tools:ignore="UnusedResources">Posodobim to prijavo?</string> + <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the password. --> + <string name="mozac_feature_prompt_login_update_headline_2">Posodobim geslo?</string> <!-- Prompt message displayed when app detects a user has entered a username for an existing login without a username and user decides if app should update the login. --> <string name="mozac_feature_prompt_login_add_username_headline">Dodaj shranjenemu geslu uporabniško ime?</string> <!-- Text for a label for the field when prompt requesting a text is shown. --> @@ -92,22 +96,22 @@ <!-- Title of the time picker dialog. --> <string name="mozac_feature_prompts_set_time">Nastavi čas</string> <!-- Option in expanded select login prompt that links to login settings --> - <string name="mozac_feature_prompts_manage_logins">Upravljanje prijav</string> + <string name="mozac_feature_prompts_manage_logins" moz:removedIn="125" tools:ignore="UnusedResources">Upravljanje prijav</string> <!-- Option in expanded select password prompt that links to password settings --> - <string name="mozac_feature_prompts_manage_logins_2" tools:ignore="UnusedResources">Upravljanje gesel</string> + <string name="mozac_feature_prompts_manage_logins_2">Upravljanje gesel</string> <!-- Content description for expanding the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description">Razširi predlagane prijave</string> + <string name="mozac_feature_prompts_expand_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Razširi predlagane prijave</string> <!-- Content description for expanding the saved passwords options in the select password prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description_2" tools:ignore="UnusedResources">Prikaži shranjena gesla</string> + <string name="mozac_feature_prompts_expand_logins_content_description_2">Prikaži shranjena gesla</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description">Strni predlagane prijave</string> + <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Strni predlagane prijave</string> <!-- Content description for collapsing the saved passwords options in the select password prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description_2" tools:ignore="UnusedResources">Skrij shranjena gesla</string> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Skrij shranjena gesla</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> - <string name="mozac_feature_prompts_saved_logins">Predlagane prijave</string> + <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Predlagane prijave</string> <!-- Header for the select password prompt to allow users to fill a form with a saved password --> - <string name="mozac_feature_prompts_saved_logins_2" tools:ignore="UnusedResources">Shranjena gesla</string> + <string name="mozac_feature_prompts_saved_logins_2">Shranjena gesla</string> <!-- Content description for the suggest strong password prompt to allow users to fill a form with a suggested strong password --> <string name="mozac_feature_prompts_suggest_strong_password_content_description">Predlagaj močno geslo</string> @@ -126,42 +130,42 @@ <!-- Credit Card Autofill --> <!-- Header for the select credit card prompt to allow users to fill a form with a saved credit card. --> - <string name="mozac_feature_prompts_select_credit_card">Izberite kreditno kartico</string> + <string name="mozac_feature_prompts_select_credit_card" moz:removedIn="125" tools:ignore="UnusedResources">Izberite kreditno kartico</string> <!-- Header for the select card prompt to allow users to fill a form with a saved card. --> - <string name="mozac_feature_prompts_select_credit_card_2" tools:ignore="UnusedResources">Uporabi shranjeno kartico</string> + <string name="mozac_feature_prompts_select_credit_card_2">Uporabi shranjeno kartico</string> <!-- Content description for expanding the select credit card options in the select credit card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description">Razširi predlagane kreditne kartice</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Razširi predlagane kreditne kartice</string> <!-- Content description for expanding the saved card options in the select card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description_2" tools:ignore="UnusedResources">Prikaži shranjene kartice</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description_2">Prikaži shranjene kartice</string> <!-- Content description for collapsing the select credit card options in the select credit prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description">Strni predlagane kreditne kartice</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Strni predlagane kreditne kartice</string> <!-- Content description for collapsing the saved card options in the select prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2" tools:ignore="UnusedResources">Skrij shranjene kartice</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2">Skrij shranjene kartice</string> <!-- Option in the expanded select credit card prompt that links to credit cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards">Upravljanje kreditnih kartic</string> + <string name="mozac_feature_prompts_manage_credit_cards" moz:removedIn="125" tools:ignore="UnusedResources">Upravljanje kreditnih kartic</string> <!-- Option in the expanded select card prompt that links to cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards_2" tools:ignore="UnusedResources">Upravljanje kartic</string> + <string name="mozac_feature_prompts_manage_credit_cards_2">Upravljanje kartic</string> <!-- Text for the title of a save credit card dialog. --> <string name="mozac_feature_prompts_save_credit_card_prompt_title">Želite varno shraniti to kartico?</string> <!-- Text for the title of an update credit card dialog. --> <string name="mozac_feature_prompts_update_credit_card_prompt_title">Posodobi datum poteka veljavnosti kartice?</string> <!-- Subtitle text displayed under the title of the save credit card dialog. --> - <string name="mozac_feature_prompts_save_credit_card_prompt_body">Številka kartice bo šifrirana. Varnostna koda ne bo shranjena.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body" moz:removedIn="125" tools:ignore="UnusedResources">Številka kartice bo šifrirana. Varnostna koda ne bo shranjena.</string> <!-- Subtitle text displayed under the title of the saved card dialog. Parameter will be replaced by app name--> - <string name="mozac_feature_prompts_save_credit_card_prompt_body_2" tools:ignore="UnusedResources">%s šifrira številko vaše kartice. Varnostna koda se ne bo shranila.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body_2">%s šifrira številko vaše kartice. Varnostna koda se ne bo shranila.</string> <!-- Address Autofill --> <!-- Header for the select address prompt to allow users to fill a form with a saved address. --> <string name="mozac_feature_prompts_select_address_2">Izbira naslova</string> <!-- Content description for expanding the select addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description">Razširi predlagane naslove</string> + <string name="mozac_feature_prompts_expand_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Razširi predlagane naslove</string> <!-- Content description for expanding the saved addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description_2" tools:ignore="UnusedResources">Prikaži shranjene naslove</string> + <string name="mozac_feature_prompts_expand_address_content_description_2">Prikaži shranjene naslove</string> <!-- Content description for collapsing the select address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description">Strni predlagane naslove</string> + <string name="mozac_feature_prompts_collapse_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Strni predlagane naslove</string> <!-- Content description for collapsing the saved address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description_2" tools:ignore="UnusedResources">Skrij shranjene naslove</string> + <string name="mozac_feature_prompts_collapse_address_content_description_2">Skrij shranjene naslove</string> <!-- Text for the manage addresses button. --> <string name="mozac_feature_prompts_manage_address">Upravljanje naslovov</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values-su/strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values-su/strings.xml index 8069cf1b66..d0bf44fd5e 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values-su/strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values-su/strings.xml @@ -17,7 +17,9 @@ <!-- Text for password field in an authentication dialog. --> <string name="mozac_feature_prompt_password_hint">Kecap sandi</string> <!-- Negative confirmation that we should not save the new or updated login --> - <string name="mozac_feature_prompt_dont_save">Ulah diteundeun</string> + <string name="mozac_feature_prompt_dont_save" moz:removedIn="125" tools:ignore="UnusedResources">Ulah diteundeun</string> + <!-- Negative confirmation that we should not save the new or updated login --> + <string name="mozac_feature_prompt_dont_save_2">Moal waka</string> <!-- Negative confirmation that we should never save a login for this site --> <string name="mozac_feature_prompt_never_save">Ulah diteundeun</string> <!-- Negative confirmation that we should not save a credit card for this site --> @@ -25,17 +27,27 @@ <!-- Positive confirmation that we should save the new or updated login --> <string name="mozac_feature_prompt_save_confirmation">Teundeun</string> <!-- Negative confirmation that we should not save the updated login --> - <string name="mozac_feature_prompt_dont_update">Ulah ngapdét</string> + <string name="mozac_feature_prompt_dont_update" moz:removedIn="125" tools:ignore="UnusedResources">Ulah ngapdét</string> + <!-- Negative confirmation that we should not save the updated login --> + <string name="mozac_feature_prompt_dont_update_2">Moal waka</string> <!-- Positive confirmation that we should save the updated login --> <string name="mozac_feature_prompt_update_confirmation">Apdét</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_empty_password">Widang kecap sandi henteu kaci kosong</string> + <string name="mozac_feature_prompt_error_empty_password" moz:removedIn="125" tools:ignore="UnusedResources">Widang kecap sandi henteu kaci kosong</string> + <!-- Error text displayed underneath the password field when it is in an error case --> + <string name="mozac_feature_prompt_error_empty_password_2">Asupkeun sandi</string> + <!-- Error text displayed underneath the login field when it is in an error case --> + <string name="mozac_feature_prompt_error_unknown_cause" moz:removedIn="125" tools:ignore="UnusedResources">Teu bisa neundeun login</string> <!-- Error text displayed underneath the password field when it is in an error case --> - <string name="mozac_feature_prompt_error_unknown_cause">Teu bisa neundeun login</string> + <string name="mozac_feature_prompt_error_unknown_cause_2">Teu bisa nyimpen santi</string> <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new login. --> - <string name="mozac_feature_prompt_login_save_headline">Teundeun ieu login?</string> + <string name="mozac_feature_prompt_login_save_headline" moz:removedIn="125" tools:ignore="UnusedResources">Teundeun ieu login?</string> + <!-- Prompt message displayed when app detects a user has entered a new username and password and user decides if app should save the new password. --> + <string name="mozac_feature_prompt_login_save_headline_2">Simpen sandi?</string> <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the login. --> - <string name="mozac_feature_prompt_login_update_headline">Apdét ieu login?</string> + <string name="mozac_feature_prompt_login_update_headline" moz:removedIn="125" tools:ignore="UnusedResources">Apdét ieu login?</string> + <!-- Prompt message displayed when app detects a user has entered a new password for an existing login and user decides if app should update the password. --> + <string name="mozac_feature_prompt_login_update_headline_2">Anyarkeun sandi?</string> <!-- Prompt message displayed when app detects a user has entered a username for an existing login without a username and user decides if app should update the login. --> <string name="mozac_feature_prompt_login_add_username_headline">Tambahkeun sandiasma kana kecap sandi anu diteundeun?</string> <!-- Text for a label for the field when prompt requesting a text is shown. --> @@ -84,13 +96,22 @@ <!-- Title of the time picker dialog. --> <string name="mozac_feature_prompts_set_time">Setél wanci</string> <!-- Option in expanded select login prompt that links to login settings --> - <string name="mozac_feature_prompts_manage_logins">Kokolakeun login</string> + <string name="mozac_feature_prompts_manage_logins" moz:removedIn="125" tools:ignore="UnusedResources">Kokolakeun login</string> + <!-- Option in expanded select password prompt that links to password settings --> + <string name="mozac_feature_prompts_manage_logins_2">Atur sandi</string> <!-- Content description for expanding the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_expand_logins_content_description">Legaan saran login</string> + <string name="mozac_feature_prompts_expand_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Legaan saran login</string> + <!-- Content description for expanding the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_expand_logins_content_description_2">Legaan sandi anu disimpen</string> <!-- Content description for collapsing the saved logins options in the select login prompt --> - <string name="mozac_feature_prompts_collapse_logins_content_description">Leutikan saran login</string> + <string name="mozac_feature_prompts_collapse_logins_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Leutikan saran login</string> + <!-- Content description for collapsing the saved passwords options in the select password prompt --> + <string name="mozac_feature_prompts_collapse_logins_content_description_2">Heureutan sandi nu disimpen</string> <!-- Header for the select login prompt to allow users to fill a form with a saved login --> - <string name="mozac_feature_prompts_saved_logins">Saran login</string> + <string name="mozac_feature_prompts_saved_logins" moz:removedIn="125" tools:ignore="UnusedResources">Saran login</string> + + <!-- Header for the select password prompt to allow users to fill a form with a saved password --> + <string name="mozac_feature_prompts_saved_logins_2">Sandi nu disimpen</string> <!-- Content description for the suggest strong password prompt to allow users to fill a form with a suggested strong password --> <string name="mozac_feature_prompts_suggest_strong_password_content_description">Usulkeun kecap sandi anu wedel</string> @@ -109,27 +130,42 @@ <!-- Credit Card Autofill --> <!-- Header for the select credit card prompt to allow users to fill a form with a saved credit card. --> - <string name="mozac_feature_prompts_select_credit_card">Pilih kartu kiridit</string> + <string name="mozac_feature_prompts_select_credit_card" moz:removedIn="125" tools:ignore="UnusedResources">Pilih kartu kiridit</string> + <!-- Header for the select card prompt to allow users to fill a form with a saved card. --> + <string name="mozac_feature_prompts_select_credit_card_2">Paké kartu nu disimpen</string> <!-- Content description for expanding the select credit card options in the select credit card prompt. --> - <string name="mozac_feature_prompts_expand_credit_cards_content_description">Legaan kartu kiridit anu disarankeun</string> + <string name="mozac_feature_prompts_expand_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Legaan kartu kiridit anu disarankeun</string> + <!-- Content description for expanding the saved card options in the select card prompt. --> + <string name="mozac_feature_prompts_expand_credit_cards_content_description_2">Legaan kartu nu disimpen</string> <!-- Content description for collapsing the select credit card options in the select credit prompt. --> - <string name="mozac_feature_prompts_collapse_credit_cards_content_description">Tilep saran kartu kiridit</string> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Tilep saran kartu kiridit</string> + <!-- Content description for collapsing the saved card options in the select prompt. --> + <string name="mozac_feature_prompts_collapse_credit_cards_content_description_2">Heureutan kartu nu disimpen</string> <!-- Option in the expanded select credit card prompt that links to credit cards settings. --> - <string name="mozac_feature_prompts_manage_credit_cards">Kokolakeun kartu kiridit</string> + <string name="mozac_feature_prompts_manage_credit_cards" moz:removedIn="125" tools:ignore="UnusedResources">Kokolakeun kartu kiridit</string> + <!-- Option in the expanded select card prompt that links to cards settings. --> + <string name="mozac_feature_prompts_manage_credit_cards_2">Atur kartu</string> <!-- Text for the title of a save credit card dialog. --> <string name="mozac_feature_prompts_save_credit_card_prompt_title">Teundeun ieu kartu sacara aman?</string> <!-- Text for the title of an update credit card dialog. --> <string name="mozac_feature_prompts_update_credit_card_prompt_title">Mutahirkeun titimangsa kadaluwarsa kartu?</string> <!-- Subtitle text displayed under the title of the save credit card dialog. --> - <string name="mozac_feature_prompts_save_credit_card_prompt_body">Nomer kartu bakal diénkrip. Kode kaamanan moal diteundeun.</string> + <string name="mozac_feature_prompts_save_credit_card_prompt_body" moz:removedIn="125" tools:ignore="UnusedResources">Nomer kartu bakal diénkrip. Kode kaamanan moal diteundeun.</string> + + <!-- Subtitle text displayed under the title of the saved card dialog. Parameter will be replaced by app name--> + <string name="mozac_feature_prompts_save_credit_card_prompt_body_2">%s énkripsi nomer kartu anjeun. Kode kaamanan anjeun moal disimpen.</string> <!-- Address Autofill --> <!-- Header for the select address prompt to allow users to fill a form with a saved address. --> <string name="mozac_feature_prompts_select_address_2">Pilih alamat</string> <!-- Content description for expanding the select addresses options in the select address prompt. --> - <string name="mozac_feature_prompts_expand_address_content_description">Legaan saran alamat</string> + <string name="mozac_feature_prompts_expand_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Legaan saran alamat</string> + <!-- Content description for expanding the saved addresses options in the select address prompt. --> + <string name="mozac_feature_prompts_expand_address_content_description_2">Legaan alamat nu disimpen</string> <!-- Content description for collapsing the select address options in the select address prompt. --> - <string name="mozac_feature_prompts_collapse_address_content_description">Leutikan saran alamat</string> + <string name="mozac_feature_prompts_collapse_address_content_description" moz:removedIn="125" tools:ignore="UnusedResources">Leutikan saran alamat</string> + <!-- Content description for collapsing the saved address options in the select address prompt. --> + <string name="mozac_feature_prompts_collapse_address_content_description_2">Heureutan alamat nu disimpen</string> <!-- Text for the manage addresses button. --> <string name="mozac_feature_prompts_manage_address">Kokolakeun alamat</string> diff --git a/mobile/android/android-components/components/feature/prompts/src/main/res/values/quarantined_strings.xml b/mobile/android/android-components/components/feature/prompts/src/main/res/values/quarantined_strings.xml index 5943e14165..1564be16e2 100644 --- a/mobile/android/android-components/components/feature/prompts/src/main/res/values/quarantined_strings.xml +++ b/mobile/android/android-components/components/feature/prompts/src/main/res/values/quarantined_strings.xml @@ -5,5 +5,5 @@ <!-- Strings in this file are not yet ready for localization. --> <resources> <!-- Text of the title of a dialog when a page is requesting to open a new window. --> - <string name="mozac_feature_prompts_popup_dialog_title">Prevent this site from opening a pop-up window?</string> + <string name="mozac_feature_prompts_popup_dialog_title">Allow this site to open?</string> </resources> diff --git a/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/PromptFeatureTest.kt b/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/PromptFeatureTest.kt index 3c1cfba67c..7f8157bf0d 100644 --- a/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/PromptFeatureTest.kt +++ b/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/PromptFeatureTest.kt @@ -1805,6 +1805,74 @@ class PromptFeatureTest { } @Test + fun `WHEN login autofill is enabled THEN the select login prompt is shown`() { + val loginPickerView: SelectablePromptView<Login> = mock() + + val login = + Login(guid = "A", origin = "origin", username = "user123", password = "password123") + + val feature = + PromptFeature( + activity = mock<Activity>(), + store = store, + fileUploadsDirCleaner = mock(), + tabsUseCases = mock(), + fragmentManager = fragmentManager, + exitFullscreenUsecase = mock(), + loginDelegate = object : LoginDelegate { + override val loginPickerView = loginPickerView + override val onManageLogins = {} + }, + isLoginAutofillEnabled = { true }, + ) { } + feature.loginPicker = loginPicker + val onLoginDismiss: () -> Unit = {} + val onLoginConfirm: (Login) -> Unit = {} + + val selectLoginRequest = + PromptRequest.SelectLoginPrompt(listOf(login), null, onLoginConfirm, onLoginDismiss) + + feature.start() + store.dispatch(ContentAction.UpdatePromptRequestAction(tabId, selectLoginRequest)) + .joinBlocking() + + verify(loginPicker).handleSelectLoginRequest(selectLoginRequest) + } + + @Test + fun `WHEN login autofill is disabled THEN the select login prompt is not shown`() { + val loginPickerView: SelectablePromptView<Login> = mock() + + val login = + Login(guid = "A", origin = "origin", username = "user123", password = "password123") + + val feature = + PromptFeature( + activity = mock<Activity>(), + store = store, + fileUploadsDirCleaner = mock(), + tabsUseCases = mock(), + fragmentManager = fragmentManager, + exitFullscreenUsecase = mock(), + loginDelegate = object : LoginDelegate { + override val loginPickerView = loginPickerView + override val onManageLogins = {} + }, + ) { } + feature.loginPicker = loginPicker + val onLoginDismiss: () -> Unit = {} + val onLoginConfirm: (Login) -> Unit = {} + + val selectLoginRequest = + PromptRequest.SelectLoginPrompt(listOf(login), null, onLoginConfirm, onLoginDismiss) + + feature.start() + store.dispatch(ContentAction.UpdatePromptRequestAction(tabId, selectLoginRequest)) + .joinBlocking() + verify(loginPicker, never()).handleSelectLoginRequest(selectLoginRequest) + } + + @Test fun `When page is refreshed login dialog is dismissed`() { val loginPickerView: SelectablePromptView<Login> = mock() val feature = @@ -1819,6 +1887,7 @@ class PromptFeatureTest { override val loginPickerView = loginPickerView override val onManageLogins = {} }, + isLoginAutofillEnabled = { true }, ) { } feature.loginPicker = loginPicker val onLoginDismiss: () -> Unit = {} @@ -2348,6 +2417,70 @@ class PromptFeatureTest { } @Test + fun `GIVEN saveLoginDialog is visible WHEN host doesn't change THEN keep saveLoginDialog visible`() { + val newUrlSameDomain = "https://www.mozilla.org/en-GB/firefox/browsers/mobile/android/" + val promptRequest = PromptRequest.Share( + data = mock(), + onSuccess = {}, + onFailure = {}, + onDismiss = {}, + ) + val saveLoginPrompt: SaveLoginDialogFragment = mock() + + val feature = spy( + PromptFeature( + mock<Activity>(), + store = store, + tabsUseCases = mock(), + fragmentManager = fragmentManager, + fileUploadsDirCleaner = mock(), + exitFullscreenUsecase = mock(), + isSaveLoginEnabled = { true }, + loginValidationDelegate = mock(), + ) { }, + ) + feature.start() + + store.dispatch(ContentAction.UpdatePromptRequestAction(tabId, promptRequest)).joinBlocking() + feature.activePrompt = WeakReference(saveLoginPrompt) + + store.dispatch(ContentAction.UpdateUrlAction(tabId, newUrlSameDomain)).joinBlocking() + verify(saveLoginPrompt, never()).dismiss() + } + + @Test + fun `GIVEN saveLoginDialog is visible WHEN host changes THEN dismiss saveLoginDialog`() { + val newUrlDifferentDomain = "https://www.android.com/new-features-on-android/" + val promptRequest = PromptRequest.Share( + data = mock(), + onSuccess = {}, + onFailure = {}, + onDismiss = {}, + ) + val saveLoginPrompt: SaveLoginDialogFragment = mock() + + val feature = spy( + PromptFeature( + activity = mock(), + store = store, + tabsUseCases = mock(), + fragmentManager = fragmentManager, + fileUploadsDirCleaner = mock(), + exitFullscreenUsecase = mock(), + isSaveLoginEnabled = { true }, + shareDelegate = mock(), + ) { }, + ) + feature.start() + + store.dispatch(ContentAction.UpdatePromptRequestAction(tabId, promptRequest)).joinBlocking() + feature.activePrompt = WeakReference(saveLoginPrompt) + + store.dispatch(ContentAction.UpdateUrlAction(tabId, newUrlDifferentDomain)).joinBlocking() + verify(saveLoginPrompt, times(1)).dismiss() + } + + @Test fun `prompt will always start the save login dialog with an icon`() { val feature = PromptFeature( activity = mock(), diff --git a/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt b/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt index b0fee5f9a1..df8aba7705 100644 --- a/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt +++ b/mobile/android/android-components/components/feature/prompts/src/test/java/mozilla/components/feature/prompts/dialog/TextPromptDialogFragmentTest.kt @@ -6,9 +6,11 @@ package mozilla.components.feature.prompts.dialog import android.content.DialogInterface.BUTTON_POSITIVE import android.os.Looper.getMainLooper +import android.view.inputmethod.EditorInfo.IME_NULL import android.widget.CheckBox import android.widget.TextView import androidx.appcompat.app.AlertDialog +import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.isVisible import androidx.test.ext.junit.runners.AndroidJUnit4 import mozilla.components.feature.prompts.R.id @@ -41,7 +43,7 @@ class TextPromptDialogFragmentTest { @Test fun `build dialog`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, false), ) doReturn(appCompatContext).`when`(fragment).requireContext() @@ -73,12 +75,14 @@ class TextPromptDialogFragmentTest { inputValue.text = "NewValue" assertEquals(inputValue.text.toString(), "NewValue") + + assertEquals(IME_NULL, inputValue.imeOptions) } @Test fun `TextPrompt with hasShownManyDialogs equals false should not have a checkbox`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", false), + TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", false, false), ) doReturn(appCompatContext).`when`(fragment).requireContext() @@ -95,7 +99,7 @@ class TextPromptDialogFragmentTest { @Test fun `Clicking on positive button notifies the feature`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", false), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", false, false), ) fragment.feature = mockFeature @@ -115,7 +119,7 @@ class TextPromptDialogFragmentTest { @Test fun `After checking no more dialogs checkbox feature onNoMoreDialogsChecked must be called`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", false, "title", "label", "defaultValue", true, false), ) fragment.feature = mockFeature @@ -139,7 +143,7 @@ class TextPromptDialogFragmentTest { @Test fun `touching outside of the dialog must notify the feature onCancel`() { val fragment = spy( - TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true), + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, false), ) fragment.feature = mockFeature @@ -150,4 +154,19 @@ class TextPromptDialogFragmentTest { verify(mockFeature).onCancel("sessionId", "uid") } + + @Test + fun `when TextPromptDialogFragment is created in private mode then keyboard is in private mode`() { + val fragment = spy( + TextPromptDialogFragment.newInstance("sessionId", "uid", true, "title", "label", "defaultValue", true, true), + ) + + fragment.feature = mockFeature + doReturn(appCompatContext).`when`(fragment).requireContext() + + val dialog = fragment.onCreateDialog(null).also { it.show() } + val editText = dialog.findViewById<TextView>(id.input_value) + + assertEquals(EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING, editText.imeOptions) + } } diff --git a/mobile/android/android-components/components/feature/pwa/src/main/java/mozilla/components/feature/pwa/WebAppShortcutManager.kt b/mobile/android/android-components/components/feature/pwa/src/main/java/mozilla/components/feature/pwa/WebAppShortcutManager.kt index a97b3b8415..e754e89c60 100644 --- a/mobile/android/android-components/components/feature/pwa/src/main/java/mozilla/components/feature/pwa/WebAppShortcutManager.kt +++ b/mobile/android/android-components/components/feature/pwa/src/main/java/mozilla/components/feature/pwa/WebAppShortcutManager.kt @@ -26,6 +26,7 @@ import mozilla.components.browser.icons.decoder.ICOIconDecoder import mozilla.components.browser.icons.extension.toIconRequest import mozilla.components.browser.icons.generator.DefaultIconGenerator import mozilla.components.browser.icons.loader.DataUriIconLoader +import mozilla.components.browser.icons.loader.DefaultMemoryInfoProvider import mozilla.components.browser.icons.loader.HttpIconLoader import mozilla.components.browser.icons.loader.MemoryIconLoader import mozilla.components.browser.icons.preparer.MemoryIconPreparer @@ -271,7 +272,7 @@ private fun webAppIcons( ), loaders = listOf( MemoryIconLoader(pwaIconMemoryCache), - HttpIconLoader(httpClient), + HttpIconLoader(httpClient, DefaultMemoryInfoProvider(context)), DataUriIconLoader(), ), decoders = listOf( diff --git a/mobile/android/android-components/components/feature/qr/build.gradle b/mobile/android/android-components/components/feature/qr/build.gradle index f491a3e0a8..beebfcd1f5 100644 --- a/mobile/android/android-components/components/feature/qr/build.gradle +++ b/mobile/android/android-components/components/feature/qr/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation ComponentsDependencies.kotlin_coroutines implementation ComponentsDependencies.androidx_appcompat + implementation ComponentsDependencies.androidx_core_ktx implementation project(':support-ktx') implementation project(':support-base') diff --git a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/manifest.template.json b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/manifest.template.json index 616b2036eb..7eb8d17589 100644 --- a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/manifest.template.json +++ b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/manifest.template.json @@ -10,7 +10,10 @@ "content_scripts": [ { "matches": ["<all_urls>"], - "js": ["readability/readability-readerable-0.4.2.js", "readerview-content.js"], + "js": [ + "readability/readability-readerable-0.4.2.js", + "readerview-content.js" + ], "run_at": "document_idle" } ], diff --git a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-background.js b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-background.js index 136e5e40e3..41e7b1f538 100644 --- a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-background.js +++ b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-background.js @@ -7,16 +7,16 @@ browser.runtime.onMessage.addListener(message => { switch (message.action) { - case 'addSerializedDoc': - browser.storage.session.set({ [message.id]: message.doc }); - return Promise.resolve(); - case 'getSerializedDoc': - return (async () => { - let doc = await browser.storage.session.get(message.id); - browser.storage.session.remove(message.id); - return doc[message.id]; - })(); - default: - console.error(`Received unsupported action ${message.action}`); - } + case "addSerializedDoc": + browser.storage.session.set({ [message.id]: message.doc }); + return Promise.resolve(); + case "getSerializedDoc": + return (async () => { + let doc = await browser.storage.session.get(message.id); + browser.storage.session.remove(message.id); + return doc[message.id]; + })(); + default: + console.error(`Received unsupported action ${message.action}`); + } }); diff --git a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-content.js b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-content.js index 1d5859e793..cdcbe0434c 100644 --- a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-content.js +++ b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview-content.js @@ -17,43 +17,53 @@ const blockedHosts = [ "pinterest.com", "reddit.com", "twitter.com", - "youtube.com" + "youtube.com", ]; function isReaderable() { - if (!supportedProtocols.includes(location.protocol)) { - return false; - } + if (!supportedProtocols.includes(location.protocol)) { + return false; + } - if (blockedHosts.some(blockedHost => location.hostname.endsWith(blockedHost))) { - return false; - } + if ( + blockedHosts.some(blockedHost => location.hostname.endsWith(blockedHost)) + ) { + return false; + } - if (location.pathname == "/") { - return false; - } + if (location.pathname == "/") { + return false; + } - return isProbablyReaderable(document, _isNodeVisible); + return isProbablyReaderable(document, _isNodeVisible); } function _isNodeVisible(node) { - return node.clientHeight > 0 && node.clientWidth > 0; + return node.clientHeight > 0 && node.clientWidth > 0; } function connectNativePort() { let port = browser.runtime.connectNative("mozacReaderview"); - port.onMessage.addListener((message) => { - switch (message.action) { - case 'cachePage': - let serializedDoc = new XMLSerializer().serializeToString(document); - browser.runtime.sendMessage({action: "addSerializedDoc", doc: serializedDoc, id: message.id}); - break; - case 'checkReaderState': - port.postMessage({type: 'checkReaderState', baseUrl: browser.runtime.getURL("/"), readerable: isReaderable()}); - break; - default: - console.error(`Received unsupported action ${message.action}`); - } + port.onMessage.addListener(message => { + switch (message.action) { + case "cachePage": + let serializedDoc = new XMLSerializer().serializeToString(document); + browser.runtime.sendMessage({ + action: "addSerializedDoc", + doc: serializedDoc, + id: message.id, + }); + break; + case "checkReaderState": + port.postMessage({ + type: "checkReaderState", + baseUrl: browser.runtime.getURL("/"), + readerable: isReaderable(), + }); + break; + default: + console.error(`Received unsupported action ${message.action}`); + } }); return port; @@ -65,11 +75,11 @@ let port = connectNativePort(); // do want to connect a new native port to trigger a new readerable check and // apply the same logic (as on page load) in our feature class (e.g. updating the // toolbar etc.) -window.addEventListener("pageshow", (event) => { - port = (port != null)? port : connectNativePort(); +window.addEventListener("pageshow", event => { + port = port != null ? port : connectNativePort(); }); -window.addEventListener("pagehide", (event) => { +window.addEventListener("pagehide", event => { port.disconnect(); port = null; }); diff --git a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.html b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.html index b09deb7811..99afab71a4 100644 --- a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.html +++ b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.html @@ -4,14 +4,14 @@ <html> <head> - <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> - <meta name="viewport" content="width=device-width; user-scalable=0" /> - <meta http-equiv="cache-control" content="no-store" /> + <meta content="text/html; charset=UTF-8" http-equiv="content-type" /> + <meta name="viewport" content="width=device-width; user-scalable=0" /> + <meta http-equiv="cache-control" content="no-store" /> - <link rel="stylesheet" href="readerview.css" /> + <link rel="stylesheet" href="readerview.css" /> - <script src="readability/JSDOMParser-0.4.2.js"></script> - <script src="readability/readability-0.4.2.js"></script> - <script src="readerview.js"></script> + <script src="readability/JSDOMParser-0.4.2.js"></script> + <script src="readability/readability-0.4.2.js"></script> + <script src="readerview.js"></script> </head> </html> diff --git a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.js b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.js index 23b1f35250..ddea9218b0 100644 --- a/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.js +++ b/mobile/android/android-components/components/feature/readerview/src/main/assets/extensions/readerview/readerview.js @@ -15,11 +15,10 @@ const preservedClasses = [ "visuallyhidden", "wp-caption", "wp-caption-text", - "wp-smiley" + "wp-smiley", ]; class ReaderView { - static get MIN_FONT_SIZE() { return 1; } @@ -37,18 +36,24 @@ class ReaderView { * @param url the url of the article. * @param options the fontSize, fontType and colorScheme to use. */ - show(doc, url, options = {fontSize: 4, fontType: "sans-serif", colorScheme: "light"}) { - let result = new Readability(doc, {classesToPreserve: preservedClasses}).parse(); + show( + doc, + url, + options = { fontSize: 4, fontType: "sans-serif", colorScheme: "light" } + ) { + let result = new Readability(doc, { + classesToPreserve: preservedClasses, + }).parse(); result.language = doc.documentElement.lang; document.title = result.title; let article = Object.assign( result, - {url: new URL(url)}, - {readingTime: this.getReadingTime(result.length, result.language)}, - {byline: this.getByline(result)}, - {dir: this.getTextDirection(result)}, - {title: this.getTitle(result)} + { url: new URL(url) }, + { readingTime: this.getReadingTime(result.length, result.language) }, + { byline: this.getByline(result) }, + { dir: this.getTextDirection(result) }, + { title: this.getTitle(result) } ); document.body.outerHTML = this.createHtmlBody(article); @@ -57,7 +62,7 @@ class ReaderView { this.setFontType(options.fontType); this.setColorScheme(options.colorScheme); if (options.scrollY) { - window.scrollTo({top: options.scrollY, left: 0, behavior: "instant"}); + window.scrollTo({ top: options.scrollY, left: 0, behavior: "instant" }); } } @@ -68,7 +73,10 @@ class ReaderView { * @param changeAmount e.g. +1, or -1. */ changeFontSize(changeAmount) { - var size = Math.max(ReaderView.MIN_FONT_SIZE, Math.min(ReaderView.MAX_FONT_SIZE, this.fontSize + changeAmount)); + var size = Math.max( + ReaderView.MIN_FONT_SIZE, + Math.min(ReaderView.MAX_FONT_SIZE, this.fontSize + changeAmount) + ); this.setFontSize(size); } @@ -79,7 +87,7 @@ class ReaderView { * and ReaderView.MAX_FONT_SIZE. */ setFontSize(fontSize) { - let size = (10 + 2 * fontSize) + "px"; + let size = 10 + 2 * fontSize + "px"; let readerView = document.getElementById("mozac-readerview-container"); readerView.style.setProperty("font-size", size); this.fontSize = fontSize; @@ -108,8 +116,8 @@ class ReaderView { * or sepia. */ setColorScheme(colorScheme) { - if(!['light', 'sepia', 'dark'].includes(colorScheme)) { - console.error(`Invalid color scheme specified: ${colorScheme}`) + if (!["light", "sepia", "dark"].includes(colorScheme)) { + console.error(`Invalid color scheme specified: ${colorScheme}`); return; } @@ -152,7 +160,7 @@ class ReaderView { </div> </div> </body> - ` + `; } /** @@ -162,17 +170,21 @@ class ReaderView { * @param optional language of the article, defaults to en. */ getReadingTime(length, lang = "en") { - const [readingSpeed, readingSpeedLang] = this.getReadingSpeedForLanguage(lang); + const [readingSpeed, readingSpeedLang] = + this.getReadingSpeedForLanguage(lang); const charactersPerMinuteLow = readingSpeed.cpm - readingSpeed.variance; const charactersPerMinuteHigh = readingSpeed.cpm + readingSpeed.variance; const readingTimeMinsSlow = Math.ceil(length / charactersPerMinuteLow); - const readingTimeMinsFast = Math.ceil(length / charactersPerMinuteHigh); + const readingTimeMinsFast = Math.ceil(length / charactersPerMinuteHigh); // Construct a localized and "humanized" reading time in minutes. // If we have both a fast and slow reading time we'll show both e.g. // "2 - 4 minutes", otherwise we'll just show "4 minutes". try { - var parts = new Intl.RelativeTimeFormat(readingSpeedLang).formatToParts(readingTimeMinsSlow, 'minute'); + var parts = new Intl.RelativeTimeFormat(readingSpeedLang).formatToParts( + readingTimeMinsSlow, + "minute" + ); if (parts.length == 3) { // No need to use part[0] which represents the literal "in". var readingTime = parts[1].value; // reading time in minutes @@ -183,8 +195,7 @@ class ReaderView { } return readingTimeString; } - } - catch(error) { + } catch (error) { console.error(`Failed to format reading time: ${error}`); } @@ -202,60 +213,62 @@ class ReaderView { */ getReadingSpeedForLanguage(lang) { const readingSpeed = new Map([ - [ "en", {cpm: 987, variance: 118 } ], - [ "ar", {cpm: 612, variance: 88 } ], - [ "de", {cpm: 920, variance: 86 } ], - [ "es", {cpm: 1025, variance: 127 } ], - [ "fi", {cpm: 1078, variance: 121 } ], - [ "fr", {cpm: 998, variance: 126 } ], - [ "he", {cpm: 833, variance: 130 } ], - [ "it", {cpm: 950, variance: 140 } ], - [ "jw", {cpm: 357, variance: 56 } ], - [ "nl", {cpm: 978, variance: 143 } ], - [ "pl", {cpm: 916, variance: 126 } ], - [ "pt", {cpm: 913, variance: 145 } ], - [ "ru", {cpm: 986, variance: 175 } ], - [ "sk", {cpm: 885, variance: 145 } ], - [ "sv", {cpm: 917, variance: 156 } ], - [ "tr", {cpm: 1054, variance: 156 } ], - [ "zh", {cpm: 255, variance: 29 } ], + ["en", { cpm: 987, variance: 118 }], + ["ar", { cpm: 612, variance: 88 }], + ["de", { cpm: 920, variance: 86 }], + ["es", { cpm: 1025, variance: 127 }], + ["fi", { cpm: 1078, variance: 121 }], + ["fr", { cpm: 998, variance: 126 }], + ["he", { cpm: 833, variance: 130 }], + ["it", { cpm: 950, variance: 140 }], + ["jw", { cpm: 357, variance: 56 }], + ["nl", { cpm: 978, variance: 143 }], + ["pl", { cpm: 916, variance: 126 }], + ["pt", { cpm: 913, variance: 145 }], + ["ru", { cpm: 986, variance: 175 }], + ["sk", { cpm: 885, variance: 145 }], + ["sv", { cpm: 917, variance: 156 }], + ["tr", { cpm: 1054, variance: 156 }], + ["zh", { cpm: 255, variance: 29 }], ]); - return readingSpeed.has(lang) ? [readingSpeed.get(lang), lang] : [readingSpeed.get("en"), "en"]; - } - - getByline(article) { - return article.byline || ""; - } - - /** - * Attempts to read the optional text direction from the article and uses - * language mapping to detect rtl, if missing. - */ - getTextDirection(article) { - if (article.dir) { - return article.dir; - } - - if (["ar", "fa", "he", "ug", "ur"].includes(article.language)) { - return "rtl"; - } - - return "ltr"; - } - - getTitle(article) { - return article.title || ""; - } - - escapeHTML(text) { - return text - .replace(/\&/g, "&") - .replace(/\</g, "<") - .replace(/\>/g, ">") - .replace(/\"/g, """) - .replace(/\'/g, "'"); - } + return readingSpeed.has(lang) + ? [readingSpeed.get(lang), lang] + : [readingSpeed.get("en"), "en"]; + } + + getByline(article) { + return article.byline || ""; + } + + /** + * Attempts to read the optional text direction from the article and uses + * language mapping to detect rtl, if missing. + */ + getTextDirection(article) { + if (article.dir) { + return article.dir; + } + + if (["ar", "fa", "he", "ug", "ur"].includes(article.language)) { + return "rtl"; + } + + return "ltr"; + } + + getTitle(article) { + return article.title || ""; + } + + escapeHTML(text) { + return text + .replace(/\&/g, "&") + .replace(/\</g, "<") + .replace(/\>/g, ">") + .replace(/\"/g, """) + .replace(/\'/g, "'"); + } } function fetchDocument(url) { @@ -282,16 +295,16 @@ function fetchDocument(url) { function getPreparedDocument(id, url) { return new Promise((resolve, reject) => { - - browser.runtime.sendMessage({action: "getSerializedDoc", id: id}).then((serializedDoc) => { + browser.runtime + .sendMessage({ action: "getSerializedDoc", id: id }) + .then(serializedDoc => { if (serializedDoc) { let doc = new JSDOMParser().parse(serializedDoc, url); resolve(doc); } else { reject(); } - } - ); + }); }); } @@ -306,23 +319,26 @@ function connectNativePort() { let baseUrl = browser.runtime.getURL("/"); let port = browser.runtime.connectNative("mozacReaderviewActive"); - port.onMessage.addListener((message) => { + port.onMessage.addListener(message => { switch (message.action) { - case 'show': + case "show": async function showAsync(options) { try { let doc; if (typeof Promise.any === "function") { - doc = await Promise.any([fetchDocument(articleUrl), getPreparedDocument(id, articleUrl)]); + doc = await Promise.any([ + fetchDocument(articleUrl), + getPreparedDocument(id, articleUrl), + ]); } else { try { doc = await getPreparedDocument(id, articleUrl); - } catch(e) { + } catch (e) { doc = await fetchDocument(articleUrl); } } readerView.show(doc, articleUrl, options); - } catch(e) { + } catch (e) { console.log(e); // We weren't able to find the prepared document and also // failed to fetch it. Let's load the original page which @@ -332,19 +348,23 @@ function connectNativePort() { } showAsync(message.value); break; - case 'hide': + case "hide": window.location.href = articleUrl; - case 'setColorScheme': + case "setColorScheme": readerView.setColorScheme(message.value.toLowerCase()); break; - case 'changeFontSize': + case "changeFontSize": readerView.changeFontSize(message.value); break; - case 'setFontType': + case "setFontType": readerView.setFontType(message.value.toLowerCase()); break; - case 'checkReaderState': - port.postMessage({baseUrl: baseUrl, activeUrl: articleUrl, readerable: true}); + case "checkReaderState": + port.postMessage({ + baseUrl: baseUrl, + activeUrl: articleUrl, + readerable: true, + }); break; default: console.error(`Received invalid action ${message.action}`); diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/extensions/ads/adsTelemetry.js b/mobile/android/android-components/components/feature/search/src/main/assets/extensions/ads/adsTelemetry.js index 65bf306835..0778799326 100644 --- a/mobile/android/android-components/components/feature/search/src/main/assets/extensions/ads/adsTelemetry.js +++ b/mobile/android/android-components/components/feature/search/src/main/assets/extensions/ads/adsTelemetry.js @@ -10,12 +10,12 @@ * to the native application. */ function sendCurrentState() { - let message = { - 'url': document.location.href, - 'urls': getLinks(), - 'cookies': getCookies() - }; - browser.runtime.sendNativeMessage("MozacBrowserAdsMessage", message); + let message = { + url: document.location.href, + urls: getLinks(), + cookies: getCookies(), + }; + browser.runtime.sendNativeMessage("MozacBrowserAdsMessage", message); } /** @@ -24,17 +24,17 @@ function sendCurrentState() { * @return {Array<string>} containing all current links in the current page. */ function getLinks() { - let urls = []; + let urls = []; - let anchors = document.getElementsByTagName("a"); - for (let anchor of anchors) { - if (!anchor.href) { - continue; - } - urls.push(anchor.href); + let anchors = document.getElementsByTagName("a"); + for (let anchor of anchors) { + if (!anchor.href) { + continue; } + urls.push(anchor.href); + } - return urls; + return urls; } /** @@ -43,40 +43,38 @@ function getLinks() { * @return {Array<{name: string, value: string}>} containing all cookies. */ function getCookies() { - let cookiesList = document.cookie.split("; "); - let result = []; + let cookiesList = document.cookie.split("; "); + let result = []; - cookiesList.forEach(cookie => { - var [name, ...value] = cookie.split('='); - // For that special cases where the value contains '='. - value = value.join("=") + cookiesList.forEach(cookie => { + var [name, ...value] = cookie.split("="); + // For that special cases where the value contains '='. + value = value.join("="); - result.push({ - "name" : name, - "value" : value - }); + result.push({ + name: name, + value: value, }); + }); - return result; + return result; } // Whenever a page is first accessed or when loaded from cache // send all needed data about the ads provider to the app. const events = ["pageshow", "load"]; const eventLogger = event => { - switch (event.type) { + switch (event.type) { case "load": - sendCurrentState(); - break; + sendCurrentState(); + break; case "pageshow": - if (event.persisted) { - sendCurrentState(); - } - break; + if (event.persisted) { + sendCurrentState(); + } + break; default: - console.log('Event:', event.type); - } + console.log("Event:", event.type); + } }; -events.forEach(eventName => - window.addEventListener(eventName, eventLogger) -); +events.forEach(eventName => window.addEventListener(eventName, eventLogger)); diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/extensions/search/searchTelemetry.js b/mobile/android/android-components/components/feature/search/src/main/assets/extensions/search/searchTelemetry.js index 3199335fdf..355f378b9c 100644 --- a/mobile/android/android-components/components/feature/search/src/main/assets/extensions/search/searchTelemetry.js +++ b/mobile/android/android-components/components/feature/search/src/main/assets/extensions/search/searchTelemetry.js @@ -9,11 +9,11 @@ * to the native application. */ function sendCurrentState() { - let message = { - 'url': document.location.href, - 'cookies': getCookies() - }; - browser.runtime.sendNativeMessage("MozacBrowserSearchMessage", message); + let message = { + url: document.location.href, + cookies: getCookies(), + }; + browser.runtime.sendNativeMessage("MozacBrowserSearchMessage", message); } /** @@ -22,40 +22,38 @@ function sendCurrentState() { * @return {Array<{name: string, value: string}>} containing all cookies. */ function getCookies() { - let cookiesList = document.cookie.split("; "); - let result = []; + let cookiesList = document.cookie.split("; "); + let result = []; - cookiesList.forEach(cookie => { - var [name, ...value] = cookie.split('='); - // For that special cases where the cookie value contains '='. - value = value.join("="); + cookiesList.forEach(cookie => { + var [name, ...value] = cookie.split("="); + // For that special cases where the cookie value contains '='. + value = value.join("="); - result.push({ - "name" : name, - "value" : value - }); + result.push({ + name: name, + value: value, }); + }); - return result; + return result; } // Whenever a page is first accessed or when loaded from cache // send all needed data about the search provider to the app. const events = ["pageshow", "load"]; const eventLogger = event => { - switch (event.type) { + switch (event.type) { case "load": - sendCurrentState(); - break; + sendCurrentState(); + break; case "pageshow": - if (event.persisted) { - sendCurrentState(); - } - break; + if (event.persisted) { + sendCurrentState(); + } + break; default: - console.log('Event:', event.type); - } + console.log("Event:", event.type); + } }; -events.forEach(eventName => - window.addEventListener(eventName, eventLogger) -); +events.forEach(eventName => window.addEventListener(eventName, eventLogger)); diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/search/list.json b/mobile/android/android-components/components/feature/search/src/main/assets/search/list.json index b2bb3d4698..5bd6349fe5 100644 --- a/mobile/android/android-components/components/feature/search/src/main/assets/search/list.json +++ b/mobile/android/android-components/components/feature/search/src/main/assets/search/list.json @@ -2,9 +2,7 @@ "default": { "searchDefault": "Google", "searchOrder": ["Google", "Bing"], - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia"] }, "regionOverrides": { "US": { @@ -14,898 +12,1038 @@ "locales": { "ach": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia"] } }, "an": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-es","wikipedia-an" + "google-b-m", + "bing", + "ddg", + "ebay-es", + "wikipedia-an" ] } }, "ar": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ar" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ar"] } }, "as": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-as" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-as"] } }, "ast": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "ebay-es", "wikipedia-ast" + "google-b-m", + "bing", + "ddg", + "ebay-es", + "wikipedia-ast" ] } }, "az": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "azerdict", "wikipedia-az" + "google-b-m", + "bing", + "ddg", + "azerdict", + "wikipedia-az" ] } }, "be": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-be" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-be"] }, "BY": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-be" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-be" ] }, "KZ": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-be" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-be" ] }, "RU": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-be" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-be" ] }, "TR": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-be" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-be" ] } }, "bg": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "pazaruvaj", "wikipedia-bg" + "google-b-m", + "bing", + "ddg", + "pazaruvaj", + "wikipedia-bg" ] } }, "bn": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-bn" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-bn"] } }, "bn-BD": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-bn" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-bn"] } }, "bn-IN": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-bn" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-bn"] } }, "br": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-br" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-br"] } }, "bs": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-bs" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-bs"] } }, "ca": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-es", "wikipedia-ca" + "google-b-m", + "bing", + "ddg", + "ebay-es", + "wikipedia-ca" ] } }, "cak": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-es"] } }, "cs": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "mapy-cz", "seznam-cz", "wikipedia-cz" + "google-b-m", + "bing", + "ddg", + "mapy-cz", + "seznam-cz", + "wikipedia-cz" ] } }, "cy": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "ddg", "ebay-co-uk", "wikipedia-cy" + "google-b-m", + "bing", + "ddg", + "ebay-co-uk", + "wikipedia-cy" ] } }, "da": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "amazon-co-uk", "bing", "ddg", "wikipedia-da" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-da"] } }, "de": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-de" + "google-b-m", + "bing", + "ddg", + "ecosia", + "qwant", + "wikipedia-de", + "ebay-de" ] } }, "de-AT": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-de", "ddg", "ecosia", "qwant", "wikipedia-de", "ebay-at" + "google-b-m", + "bing", + "ddg", + "ecosia", + "qwant", + "wikipedia-de", + "ebay-at" ] } }, "dsb": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-de", "ddg", "wikipedia-dsb", "ebay-de" + "google-b-m", + "bing", + "ddg", + "wikipedia-dsb", + "ebay-de" ] } }, "el": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-el" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-el"] } }, "en-AU": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-au", "ddg", "wikipedia", "ebay-au" + "google-b-m", + "bing", + "ddg", + "wikipedia", + "ebay-au" ] } }, "en-CA": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-ca", "ddg", "wikipedia", "ebay-ca" + "google-b-m", + "bing", + "ddg", + "wikipedia", + "ebay-ca" ] } }, "en-IE": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-ie" + "google-b-m", + "bing", + "ddg", + "qwant", + "wikipedia", + "ebay-ie" ] } }, "en-GB": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia", "ebay-co-uk" + "google-b-m", + "bing", + "ddg", + "qwant", + "wikipedia", + "ebay-co-uk" ] }, "BY": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "qwant", + "wikipedia" ] }, "KZ": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "qwant", + "wikipedia" ] }, "RU": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "qwant", + "wikipedia" ] }, "TR": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazon-co-uk", "ddg", "qwant", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "qwant", + "wikipedia" ] } }, "en-US": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "ebay", "wikipedia" + "google-b-m", + "bing", + "ddg", + "ebay", + "wikipedia" ] }, "BY": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazondotcom", "ddg", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia" ] }, "KZ": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazondotcom", "ddg", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia" ] }, "RU": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazondotcom", "ddg", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia" ] }, "TR": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "amazondotcom", "ddg", "wikipedia" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia" ] } }, "en-ZA": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "wikipedia" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "wikipedia"] } }, "eo": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-eo" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-eo"] } }, "es-AR": { "default": { "visibleDefaultEngines": [ - "google-b-m", "ddg", "mercadolibre-ar", "wikipedia-es" + "google-b-m", + "ddg", + "mercadolibre-ar", + "wikipedia-es" ] } }, "es-CL": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "mercadolibre-cl", "wikipedia-es" + "google-b-m", + "bing", + "ddg", + "mercadolibre-cl", + "wikipedia-es" ] } }, "es-ES": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-es", "amazon-es", "ebay-es" + "google-b-m", + "bing", + "ddg", + "wikipedia-es", + "ebay-es" ] } }, "es-MX": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "mercadolibre-mx", "wikipedia-es" + "google-b-m", + "bing", + "ddg", + "mercadolibre-mx", + "wikipedia-es" ] } }, "et": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "amazon-co-uk", "ddg", "wikipedia-et" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "wikipedia-et"] } }, "eu": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-es", "wikipedia-eu" + "google-b-m", + "bing", + "ddg", + "ebay-es", + "wikipedia-eu" ] } }, "fa": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-fa" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-fa"] } }, "ff": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-fr", "ddg", "wikipedia-fr" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-fr"] } }, "fi": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "amazondotcom", "bing", "ddg", "wikipedia-fi" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-fi"] } }, "fr-BE": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "qwant", "wikipedia-fr", "ebay-befr" + "google-b-m", + "bing", + "ddg", + "qwant", + "wikipedia-fr", + "ebay-befr" ] } }, "fr-CA": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-ca", "ddg", "wikipedia-fr", "ebay-ca" + "google-b-m", + "bing", + "ddg", + "wikipedia-fr", + "ebay-ca" ] } }, "fr-FR": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "qwant", "wikipedia-fr", "amazon-fr", "ebay-fr" + "google-b-m", + "bing", + "ddg", + "qwant", + "wikipedia-fr", + "ebay-fr" ] } }, "fr": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-fr", "qwant", "wikipedia-fr" + "google-b-m", + "bing", + "ddg", + "ebay-fr", + "qwant", + "wikipedia-fr" ] } }, "fy-NL": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-nl", "wikipedia-fy-NL" + "google-b-m", + "bing", + "ddg", + "ebay-nl", + "wikipedia-fy-NL" ] } }, "ga-IE": { "default": { "visibleDefaultEngines": [ - "google-b-m", "amazon-co-uk", "ddg", "ebay-ie", "wikipedia-ga-IE" + "google-b-m", + "ddg", + "ebay-ie", + "wikipedia-ga-IE" ] } }, "gd": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-co-uk", "faclair-beag", "wikipedia-gd" + "google-b-m", + "bing", + "ddg", + "ebay-co-uk", + "faclair-beag", + "wikipedia-gd" ] } }, "gl": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "ebay-es", "wikipedia-gl" + "google-b-m", + "bing", + "ddg", + "ebay-es", + "wikipedia-gl" ] } }, "gn": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-gn" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-gn"] } }, "gu-IN": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-gu" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-gu"] } }, "he": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-he" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-he"] } }, "hi-IN": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-hi" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-hi"] } }, "hr": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "ddg", "wikipedia-hr" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-hr"] } }, "hsb": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-de", "ddg", "wikipedia-hsb", "ebay-de" + "google-b-m", + "bing", + "ddg", + "wikipedia-hsb", + "ebay-de" ] } }, "hu": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "vatera", "wikipedia-hu" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "vatera", "wikipedia-hu"] } }, "hy-AM": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-hy-AM" + "google-b-m", + "bing", + "ddg", + "wikipedia-hy-AM" ] } }, "ia": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ia" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ia"] } }, "id": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-id" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-id"] } }, "is": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-is" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-is"] } }, "it": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-it", "amazon-it", "ebay-it" + "google-b-m", + "bing", + "ddg", + "wikipedia-it", + "ebay-it" ] } }, "ja": { "default": { "visibleDefaultEngines": [ - "google-b-m", "amazon-jp", "bing", "ddg", "rakuten", "wikipedia-ja", "yahoo-jp", "yahoo-jp-auctions" + "google-b-m", + "amazon-jp", + "bing", + "ddg", + "rakuten", + "wikipedia-ja", + "yahoo-jp", + "yahoo-jp-auctions" ] } }, "ka": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ka" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ka"] } }, "kab": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-kab" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-kab"] } }, "kk": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-kk" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-kk"] }, "KZ": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-kk" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-kk" ] }, "BY": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-kk" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-kk" ] }, "RU": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-kk" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-kk" ] }, "TR": { "visibleDefaultEngines": [ - "google-com-nocodes", "bing", "ddg", "wikipedia-kk" + "google-com-nocodes", + "bing", + "ddg", + "wikipedia-kk" ] } }, "km": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-km" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-km"] } }, "kn": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-kn", "wiktionary-kn" + "google-b-m", + "bing", + "ddg", + "wikipedia-kn", + "wiktionary-kn" ] } }, "ko": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "daum-kr" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "daum-kr"] } }, "lij": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-it", "ddg", "wikipedia-lij", "ebay-it" + "google-b-m", + "bing", + "ddg", + "wikipedia-lij", + "ebay-it" ] } }, "lo": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-lo" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-lo"] } }, "lt": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-lt" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-lt"] } }, "ltg": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "wikipedia-ltg" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "wikipedia-ltg"] } }, "lv": { "default": { "visibleDefaultEngines": [ - "google-b-m", "ddg", "salidzinilv", "wikipedia-lv" + "google-b-m", + "ddg", + "salidzinilv", + "wikipedia-lv" ] } }, "mai": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-hi" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-hi"] } }, "meh": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-es"] } }, "mix": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-es"] } }, "ml": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-ml" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ml"] } }, "mr": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-mr" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-mr"] } }, "ms": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-ms" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ms"] } }, "my": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-my" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-my"] } }, "nb-NO": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "gulesider-mobile-NO", "wikipedia-NO" + "google-b-m", + "bing", + "ddg", + "gulesider-mobile-NO", + "wikipedia-NO" ] } }, "ne-NP": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-ne" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ne"] } }, "nl-NL": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-nl", "amazon-nl", "ebay-nl" + "google-b-m", + "bing", + "ddg", + "wikipedia-nl", + "ebay-nl" ] } }, "nl": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-nl", "wikipedia-nl" + "google-b-m", + "bing", + "ddg", + "ebay-nl", + "wikipedia-nl" ] } }, "nn-NO": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "gulesider-mobile-NO", "wikipedia-NN" + "google-b-m", + "bing", + "ddg", + "gulesider-mobile-NO", + "wikipedia-NN" ] } }, "oc": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-oc", "wiktionary-oc" + "google-b-m", + "bing", + "ddg", + "wikipedia-oc", + "wiktionary-oc" ] } }, "or": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-or", "wiktionary-or" + "google-b-m", + "bing", + "ddg", + "wikipedia-or", + "wiktionary-or" ] } }, "pa-IN": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-pa" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-pa"] } }, "pl": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-pl", "ebay-pl" + "google-b-m", + "bing", + "ddg", + "wikipedia-pl", + "ebay-pl" ] } }, "pt-BR": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-pt" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-pt"] } }, "pt-PT": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "wikipedia-pt" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "wikipedia-pt"] } }, "rm": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-ch", "leo_ende_de", "wikipedia-rm" + "google-b-m", + "bing", + "ddg", + "ebay-ch", + "leo_ende_de", + "wikipedia-rm" ] } }, "ro": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-ro" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ro"] } }, "ru": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "wikipedia-ru" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "wikipedia-ru"] }, "RU": { - "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "wikipedia-ru" - ] + "visibleDefaultEngines": ["google-com-nocodes", "ddg", "wikipedia-ru"] }, "BY": { - "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "wikipedia-ru" - ] + "visibleDefaultEngines": ["google-com-nocodes", "ddg", "wikipedia-ru"] }, "KZ": { - "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "wikipedia-ru" - ] + "visibleDefaultEngines": ["google-com-nocodes", "ddg", "wikipedia-ru"] }, "TR": { - "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "wikipedia-ru" - ] + "visibleDefaultEngines": ["google-com-nocodes", "ddg", "wikipedia-ru"] } }, "sk": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "wikipedia-sk" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "wikipedia-sk"] } }, "sl": { "default": { "visibleDefaultEngines": [ - "google-b-m", "ddg", "ceneje", "odpiralni", "wikipedia-sl" + "google-b-m", + "ddg", + "ceneje", + "odpiralni", + "wikipedia-sl" ] } }, "son": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "ddg", "bing", "amazon-fr", "wikipedia-fr" - ] + "visibleDefaultEngines": ["google-b-m", "ddg", "bing", "wikipedia-fr"] } }, "sq": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-co-uk", "ddg", "wikipedia-sq" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-sq"] } }, "sr": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-sr" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-sr"] } }, "sv-SE": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "prisjakt-sv-SE", "ddg", "wikipedia-sv-SE", "amazon-se", "ebay-ch" + "google-b-m", + "bing", + "prisjakt-sv-SE", + "ddg", + "wikipedia-sv-SE", + "ebay-ch" ] } }, "ta": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-ta", "wiktionary-ta" + "google-b-m", + "bing", + "ddg", + "wikipedia-ta", + "wiktionary-ta" ] } }, "te": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-te", "wiktionary-te" + "google-b-m", + "bing", + "ddg", + "wikipedia-te", + "wiktionary-te" ] } }, "th": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-th" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-th"] } }, "tl": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg"] } }, "tr": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-tr" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-tr"] }, "TR": { "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "bing", "wikipedia-tr" + "google-com-nocodes", + "ddg", + "bing", + "wikipedia-tr" ] }, "BY": { "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "bing", "wikipedia-tr" + "google-com-nocodes", + "ddg", + "bing", + "wikipedia-tr" ] }, "KZ": { "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "bing", "wikipedia-tr" + "google-com-nocodes", + "ddg", + "bing", + "wikipedia-tr" ] }, "RU": { "visibleDefaultEngines": [ - "google-com-nocodes", "ddg", "bing", "wikipedia-tr" + "google-com-nocodes", + "ddg", + "bing", + "wikipedia-tr" ] } }, "trs": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-es"] } }, "uk": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-uk" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-uk"] } }, "ur": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazon-in", "ddg", "wikipedia-ur" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-ur"] } }, "uz": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-uz" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-uz"] } }, "vi": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "coccoc", "ddg", "wikipedia-vi" - ] + "visibleDefaultEngines": ["google-b-m", "coccoc", "ddg", "wikipedia-vi"] } }, "wo": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "ebay-fr", "wikipedia-wo" + "google-b-m", + "bing", + "ddg", + "ebay-fr", + "wikipedia-wo" ] } }, "xh": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia"] } }, "zam": { "default": { - "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-es" - ] + "visibleDefaultEngines": ["google-b-m", "bing", "ddg", "wikipedia-es"] } }, "zh-CN": { "default": { "visibleDefaultEngines": [ - "google-b-m", "baidu", "bing", "ddg", "wikipedia-zh-CN" + "google-b-m", + "baidu", + "bing", + "ddg", + "wikipedia-zh-CN" ] }, "CN": { @@ -915,7 +1053,10 @@ "zh-TW": { "default": { "visibleDefaultEngines": [ - "google-b-m", "bing", "ddg", "wikipedia-zh-TW" + "google-b-m", + "bing", + "ddg", + "wikipedia-zh-TW" ] } } diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-au.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-au.xml deleted file mode 100644 index 6e8801d893..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-au.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.com.au</ShortName> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.com.au/s"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.com.au/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-ca.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-ca.xml deleted file mode 100644 index 932f62b276..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-ca.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.ca</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.ca/s" resultdomain="amazon.ca"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.ca/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-co-uk.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-co-uk.xml deleted file mode 100644 index 5ff238cc73..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-co-uk.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.co.uk</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.co.uk/s" resultdomain="amazon.co.uk"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.co.uk/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-de.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-de.xml deleted file mode 100644 index 137abd4b94..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-de.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.de</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.de/s" resultdomain="amazon.de"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.de/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-es.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-es.xml deleted file mode 100644 index c989b9f361..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-es.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.es</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.es/s" resultdomain="amazon.es"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.es/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-fr.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-fr.xml deleted file mode 100644 index abfb75bee5..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-fr.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.fr</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.fr/s" resultdomain="amazon.fr"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.fr/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-in.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-in.xml deleted file mode 100644 index 2c1be1f73a..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-in.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.in</ShortName> -<InputEncoding>utf-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.in/s"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.in/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-it.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-it.xml deleted file mode 100644 index 805bbf0af2..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-it.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.it</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.it/s" resultdomain="amazon.it"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.it/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-nl.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-nl.xml deleted file mode 100644 index 75530332cc..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-nl.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.nl</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.nl/s"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.nl/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-se.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-se.xml deleted file mode 100644 index 98f7b2d35a..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazon-se.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.se</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABaFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////mQACAgH7+/uEhIT9mACFhYX9/f0JCQkFBQWwagBtQgAJBQANDQ36lgDr6+vj4+O7u7u3t7dDQ0M9PT0oKCgbGxvVgADGdwCqZgBYNQBCKAAkFgAcEQARCgDw8PDS0tKysrKtra2Xl5eSkpJtbW1dXV1aWlpLS0tHR0c5OTkzMzMuLi4qKirrjQDniwDehgC7cACZXACKUwBjOwBPLwA8JAAsGwAgEwD19fXn5+fZ2dnPz8/Ly8vHx8ekpKSdnZ2JiYl/f394eHggICD7lwD2lADRfgDPfACeXwCETwBdOAA4IgA0IAAWDgDd3d3W1ta/v7+oqKiPj497e3twcHBpaWljY2NWVlYUFBTsjgDiiADZgwDAcwC3bgCmYwCPVgB2RwBnPgBKLQAMCADt7e1fX19SUlIWFhYSEhLwkADujwCRVwB8SwB6SgBSMgAPCQBOQY7nAAAABnRSTlMA8si8ZBgxEvPEAAADLklEQVRo3u2aZ1MiMRiA0dO8WeWkd6miNEVF6c3ee++ent3r9e/fgm6iggJuMjfO7PMxs+wTkrcEJiqRluYmxIGm5hZVidZ3iBvvWkUBj/dTg7g+iCstqmbElWZVE+JKkwpxRhEoAkWgCBTBfxBoNVpEYCz41hexbbUBfBoPtQ8KzAUOm/huyui+kanAaYWn9HxmKBgwQxUizAT2NqjKHCNBZw9UZ2SejcAGzzHNROAAgqU92n8wDgSzwEIwBRLvNUhEmKGGGAOBQCJoRhqaJIIvDARDJPBJah0SQS8DgWbnPkjDZGiQCGaZRJEw7+ibnZ5yVn4paOdTrofptqO3JdAOH89O28ZHO7gIBtsnSEliL9AeBYDAQeAYA+ApmOsAroJ9oHQErFORMNs8sAPBfPC13CCYCjRbIGE1kjxgKOgDiQkNl1KxAxJ2aSjGUqAhEWShhwyWAlqag2Ssl4yF5QuOQSJU5RQQlC+ge2wlxxhakyzyBVF6VpTO1SGgDMgW2OFpA56DBwS0cgUfaB1qi5aOwXvwiD3ZeRAAyvautaInxOQKeuFl+uUKjKNQwcQuSMzIr6YDFd0gqDGO3W/LIYt+cPRk3SMCQvMWEBnpZ9PR7GNAmXTcZZsZwDJEzmaFnF6vv/HXFnQJVXt+NDhS7mfbYTLn2GTIKX0oHcd3eGoKXK7ccwnR6TSiqmQWsMRiTUFxGbt9qDGuvfmC/7Z7PY3x99p7YLjAeClrQK+gG+Ozejb5So3xj0wRNULxt6cbFTFerSuKfEmMsVr35xbVx6beLT6/gdYwvqkvTA2XaixiSum7aq9LNlV6OOlDaAUnhXrzYH0Z3+HK5PzoOfze9HJ5KgsZA0LCCdY3kGjej1gicb66lvcLj1ZlY23Vc4rv0RWQSA4nDI1kspAtKSjquMud0ul05+6lU9PD8YsCKqMzrTdaKnweE65B4meXtBmm7Ctq0aY+9YLjJO0TaGTkX1ns/npXlhZwBXHdVZ68XfYPEMPG9aXHnYwvYvViwnW28stL4peJgFJ9zm/qb01FgJAiUASKACFFUAH3SwPcrz1wv7jB++oJ/8sz3K///AMH5R5E/GGrogAAAABJRU5ErkJggg==</Image> -<Url type="text/html" method="GET" template="https://www.amazon.se/s" resultdomain="amazon.se"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.se/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazondotcom.xml b/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazondotcom.xml deleted file mode 100644 index 2af84b936c..0000000000 --- a/mobile/android/android-components/components/feature/search/src/main/assets/searchplugins/amazondotcom.xml +++ /dev/null @@ -1,13 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - -<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/"> -<ShortName>Amazon.com</ShortName> -<InputEncoding>UTF-8</InputEncoding> -<Image width="32" height="32">data:image/png;base64,AAABAAIAEBAAAAEACACtAQAAJgAAACAgAAABACAArAMAANMBAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAF0SURBVDiNpVM9S8NQFD2RvC6KCE6V5gdUHBonF6eQrQ4q6dbVjkKH/gN3oVmLk8VFK7gKuiklU6lguliHpliXhrRLKxyH1NB8aEUP3OHdd+9559z3niQLgelkQvwBIpWSJJKx5k6ng1qthpduFwCwl8+jWCwmszACy7IoCxGLSqUSLSVJxgiOSiXKQlDTddq2HawzipJIELPQ7/fhOA5c14XneTiv19FoNAAA08lksQXbtplT1UQbv7JgFAqUhWBOVek4Dqum+SPBUlTRl1zDMJBOp9FqtYK90Wi02MK8fE3XQxaqpvmNhXEvSFiWxYyiBJOvmiaNQoGartPzPLJzRjbLfgQEN1ly+JzoMYS7fb/x6ZS8wBxB79ZPNMshNTGMe2T3yj/scp3k/Dt4bQCPB/5g1nYB5TA8rLd7YHAN7FwBYhUYtoHNY4Qf0rsFtE/8wiiWs8B2FdjQgI/ZbcgrSPxMcG1g8ABM3ZmiLb8xAdJ/v/Mnx1XnNJorMikAAAAASUVORK5CYIKJUE5HDQoaCgAAAA1JSERSAAAAIAAAACAIBgAAAHN6evQAAANzSURBVFiFtZdPaBRXHMc/r+4GlGAbylYWXZFQaCOt7CSK/+hJt/XSogUDvfTQ0OzBg2hgblEQFA9iLeauBDyYUB3x0kv6J0pr4gZLum0yFIpt3V3cUJoymxwS4edhMnEn+3bmJSFfGNj3m9+832d+7/d7bxaWJCKbRaRPRP6QjdPkUozN1EtE2jc4sA6kHUAt0UwCb2OoWq2G67rLY6UU6XSadDptOgXAr8B+ROScKbbjOHI0l5NEMqm9juZy4jjOajLRhxik3vO8yMArL9u2TQEKmHid7O4OBdiUSMRCGGZiPhbAcRxtgKxlycnu7qaZOZLLmQBILMCXvb2xKbZtWwthotfiSlUp1WDr7+8PjXt6elZT/eH5RUTinOrbTilFZ2dng0+ypaXBtriwEAuQMKFsbW2lq6treVypVCiXy/z86BEAo6OjAIiINmPrBgiC3rh5k+HhYYrFotZntcEBjNrQcRzZkckY7wOrKcLYGpiYmODAwYPae2fPnCGzcye7Ozr46NixhvsmNRCbgaxlabfcUqkU8ltrBiIBXNfVTlwoFEJ+5XJ5Y/aBqakprb2+I6L8KpVK7ApEAvzz7JnWXqvVQuPbQ0Nav/Hx8ViAyCUYGRnRHj71W/Hg4GDTAyprWeJ5XuQSRAI0W9tgcpPWvD4wsHYAkcajOApopW1HJiOu664PoNnHSH3KbdsWz/NCp2LWsmKDGwEEENcHBpZBNiUSkrUs6c3nG1ry4qVL0pvPh9d+riRSfSxSHRdZDNdEeCf8/WvYkoFdn8ZXr4nmyzB2CqoOBFH2XIPdp5t0wey0yDdvinx33CderxY9f565kv/7fofIb9dCLuF94PV34JOnsPAvjOyD70/A0zvwItz3xqqOQfEi3N8OcyWoTUHqUMhFfxi9qMGT8/Dn1Vepy3wBbXsgdRja3oVEa+Mz/03DbBGqD+D5Pf9FFHDgDiS3QvECfPhj/VP/KxGZBN7XvsFMAcY+98mDo34lrqqzrfwc2HYcrMt+ZmceQ8tW//crPVQi0gdc0QIE+usuTH8Fsw/8YEFQHZQC2s/Crs8gtTdyWiAf/DX7CcjGeTNfhpkxmPsbnv+wFFBBss1fnjfeg7f2Ny6PXg+VUh/4LyCSEpF76y97Y90SkVSQsGWJyAngY2Avzepi7foFeAIMKaW+DYwvASfwPtL4PwlOAAAAAElFTkSuQmCC</Image> -<Url type="text/html" method="GET" template="https://www.amazon.com/s" resultdomain="amazon.com"> - <Param name="k" value="{searchTerms}"/> -</Url> -<SearchForm>https://www.amazon.com/</SearchForm> -</SearchPlugin> diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt index 9fc9f61dd5..40eec1a13c 100644 --- a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt +++ b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt @@ -17,10 +17,8 @@ import java.util.Locale // be inconsistent between Kotlin versions. So to be safe we avoid this completely by // constructing the strings manually. -// Parameters copied from nsSearchService.js +// Parameters copied from SearchEngine.sys.mjs on desktop. private const val MOZ_PARAM_LOCALE = "{" + "moz:locale" + "}" -private const val MOZ_PARAM_DIST_ID = "{" + "moz:distributionID" + "}" -private const val MOZ_PARAM_OFFICIAL = "{" + "moz:official" + "}" // Supported OpenSearch parameters // See http://opensearch.a9.com/spec/1.1/querysyntax/#core @@ -66,8 +64,6 @@ private fun paramSubstitution(template: String, query: String, inputEncoding: St val locale = Locale.getDefault().toString() result = result.replace(MOZ_PARAM_LOCALE, locale) - result = result.replace(MOZ_PARAM_DIST_ID, "") - result = result.replace(MOZ_PARAM_OFFICIAL, "unofficial") result = result.replace(OS_PARAM_USER_DEFINED, query) result = result.replace(OS_PARAM_INPUT_ENCODING, inputEncoding) diff --git a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/middleware/SearchMiddlewareTest.kt b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/middleware/SearchMiddlewareTest.kt index a93a6e1700..78b4e53e51 100644 --- a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/middleware/SearchMiddlewareTest.kt +++ b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/middleware/SearchMiddlewareTest.kt @@ -222,14 +222,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.co.uk", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("eBay", store.state.search.regionSearchEngines[4].name) - assertEquals("Wicipedia (cy)", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("eBay", store.state.search.regionSearchEngines[3].name) + assertEquals("Wicipedia (cy)", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -299,14 +298,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.com.au", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -338,15 +336,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals(6, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.co.uk", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Qwant", store.state.search.regionSearchEngines[4].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[5].name) - assertEquals("eBay", store.state.search.regionSearchEngines[6].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Qwant", store.state.search.regionSearchEngines[3].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[4].name) + assertEquals("eBay", store.state.search.regionSearchEngines[5].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -378,15 +375,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals(6, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.co.uk", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Qwant", store.state.search.regionSearchEngines[4].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[5].name) - assertEquals("eBay", store.state.search.regionSearchEngines[6].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Qwant", store.state.search.regionSearchEngines[3].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[4].name) + assertEquals("eBay", store.state.search.regionSearchEngines[5].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -457,14 +453,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.ca", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Wikipédia (fr)", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Wikipédia (fr)", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -496,15 +491,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals(6, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) assertEquals("Qwant", store.state.search.regionSearchEngines[3].name) assertEquals("Wikipédia (fr)", store.state.search.regionSearchEngines[4].name) - assertEquals("Amazon.fr", store.state.search.regionSearchEngines[5].name) - assertEquals("eBay", store.state.search.regionSearchEngines[6].name) + assertEquals("eBay", store.state.search.regionSearchEngines[5].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -536,15 +530,15 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(8, store.state.search.regionSearchEngines.size) + assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.de", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Ecosia", store.state.search.regionSearchEngines[4].name) - assertEquals("Qwant", store.state.search.regionSearchEngines[5].name) - assertEquals("Wikipedia (de)", store.state.search.regionSearchEngines[6].name) - assertEquals("eBay", store.state.search.regionSearchEngines[7].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Ecosia", store.state.search.regionSearchEngines[3].name) + assertEquals("Qwant", store.state.search.regionSearchEngines[4].name) + assertEquals("Wikipedia (de)", store.state.search.regionSearchEngines[5].name) + assertEquals("eBay", store.state.search.regionSearchEngines[6].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -576,15 +570,15 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(8, store.state.search.regionSearchEngines.size) + assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.de", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Ecosia", store.state.search.regionSearchEngines[4].name) - assertEquals("Qwant", store.state.search.regionSearchEngines[5].name) - assertEquals("Wikipedia (de)", store.state.search.regionSearchEngines[6].name) - assertEquals("eBay", store.state.search.regionSearchEngines[7].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Ecosia", store.state.search.regionSearchEngines[3].name) + assertEquals("Qwant", store.state.search.regionSearchEngines[4].name) + assertEquals("Wikipedia (de)", store.state.search.regionSearchEngines[5].name) + assertEquals("eBay", store.state.search.regionSearchEngines[6].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -615,13 +609,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.regionSearchEngines.isNotEmpty()) assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + + assertEquals(5, store.state.search.regionSearchEngines.size) + assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.de", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Wikipedija (dsb)", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Wikipedija (dsb)", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -652,13 +647,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.regionSearchEngines.isNotEmpty()) assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + + assertEquals(5, store.state.search.regionSearchEngines.size) + assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.de", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Wikipedija (hsb)", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Wikipedija (hsb)", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -690,14 +686,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) assertEquals("Wikipedia (es)", store.state.search.regionSearchEngines[3].name) - assertEquals("Amazon.es", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -729,14 +724,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) assertEquals("Wikipedia (it)", store.state.search.regionSearchEngines[3].name) - assertEquals("Amazon.it", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -768,14 +762,13 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.it", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("Wikipedia (lij)", store.state.search.regionSearchEngines[4].name) - assertEquals("eBay", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("Wikipedia (lij)", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -807,15 +800,14 @@ class SearchMiddlewareTest { assertTrue(store.state.search.additionalAvailableSearchEngines.isEmpty()) assertTrue(store.state.search.additionalSearchEngines.isEmpty()) - assertEquals(7, store.state.search.regionSearchEngines.size) + assertEquals(6, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) assertEquals("Prisjakt", store.state.search.regionSearchEngines[2].name) assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) assertEquals("Wikipedia (sv)", store.state.search.regionSearchEngines[4].name) - assertEquals("Amazon.se", store.state.search.regionSearchEngines[5].name) - assertEquals("eBay", store.state.search.regionSearchEngines[6].name) + assertEquals("eBay", store.state.search.regionSearchEngines[5].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } @@ -1718,68 +1710,6 @@ class SearchMiddlewareTest { } @Test - fun `Migration - default search engine`() { - val customStorage = CustomSearchEngineStorage(testContext, dispatcher) - val metadataStorage = SearchMetadataStorage(testContext) - - run { - val searchMiddleware = SearchMiddleware( - testContext, - ioDispatcher = dispatcher, - customStorage = customStorage, - metadataStorage = metadataStorage, - migration = object : SearchMiddleware.Migration { - override fun getValuesToMigrate() = SearchMiddleware.Migration.MigrationValues( - customSearchEngines = listOf(), - defaultSearchEngineName = "Amazon.com", - ) - }, - ) - - val store = BrowserStore(middleware = listOf(searchMiddleware)) - - store.dispatch( - SearchAction.SetRegionAction( - RegionState("US", "US"), - ), - ).joinBlocking() - - wait(store, dispatcher) - - val selectedSearchEngine = store.state.search.selectedOrDefaultSearchEngine - assertNotNull(selectedSearchEngine!!) - - assertEquals("Amazon.com", selectedSearchEngine.name) - assertTrue(selectedSearchEngine.resultUrls[0].startsWith("https://www.amazon.com/")) - } - - run { - val searchMiddleware = SearchMiddleware( - testContext, - ioDispatcher = dispatcher, - customStorage = customStorage, - metadataStorage = metadataStorage, - ) - - val store = BrowserStore(middleware = listOf(searchMiddleware)) - - store.dispatch( - SearchAction.SetRegionAction( - RegionState("US", "US"), - ), - ).joinBlocking() - - wait(store, dispatcher) - - val selectedSearchEngine = store.state.search.selectedOrDefaultSearchEngine - assertNotNull(selectedSearchEngine!!) - - assertEquals("Amazon.com", selectedSearchEngine.name) - assertTrue(selectedSearchEngine.resultUrls[0].startsWith("https://www.amazon.com/")) - } - } - - @Test fun `Reorders list of region search engines after adding previously removed search engines`() { val searchMiddleware = SearchMiddleware( testContext, @@ -1805,14 +1735,13 @@ class SearchMiddlewareTest { // Verify initial state // /////////////////////////////////////////////////////////////////////////////////////////// - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.com", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("eBay", store.state.search.regionSearchEngines[4].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("eBay", store.state.search.regionSearchEngines[3].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) @@ -1832,12 +1761,11 @@ class SearchMiddlewareTest { // Verify after hiding search engines // /////////////////////////////////////////////////////////////////////////////////////////// - assertEquals(4, store.state.search.regionSearchEngines.size) + assertEquals(3, store.state.search.regionSearchEngines.size) assertEquals("Bing", store.state.search.regionSearchEngines[0].name) - assertEquals("Amazon.com", store.state.search.regionSearchEngines[1].name) - assertEquals("eBay", store.state.search.regionSearchEngines[2].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[3].name) + assertEquals("eBay", store.state.search.regionSearchEngines[1].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[2].name) assertEquals("Bing", store.state.search.selectedOrDefaultSearchEngine!!.name) @@ -1855,14 +1783,13 @@ class SearchMiddlewareTest { // Verify state after adding search engines back // /////////////////////////////////////////////////////////////////////////////////////////// - assertEquals(6, store.state.search.regionSearchEngines.size) + assertEquals(5, store.state.search.regionSearchEngines.size) assertEquals("Google", store.state.search.regionSearchEngines[0].name) assertEquals("Bing", store.state.search.regionSearchEngines[1].name) - assertEquals("Amazon.com", store.state.search.regionSearchEngines[2].name) - assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[3].name) - assertEquals("eBay", store.state.search.regionSearchEngines[4].name) - assertEquals("Wikipedia", store.state.search.regionSearchEngines[5].name) + assertEquals("DuckDuckGo", store.state.search.regionSearchEngines[2].name) + assertEquals("eBay", store.state.search.regionSearchEngines[3].name) + assertEquals("Wikipedia", store.state.search.regionSearchEngines[4].name) assertEquals("Google", store.state.search.selectedOrDefaultSearchEngine!!.name) } diff --git a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/storage/BundledSearchEnginesStorageTest.kt b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/storage/BundledSearchEnginesStorageTest.kt index bfd6691432..bea87fea9c 100644 --- a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/storage/BundledSearchEnginesStorageTest.kt +++ b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/storage/BundledSearchEnginesStorageTest.kt @@ -26,7 +26,7 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState("US", "US"), Locale("en", "US")) val searchEngines = engines.list - assertEquals(6, searchEngines.size) + assertEquals(5, searchEngines.size) } @Test @@ -50,7 +50,7 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState.Default, Locale("de", "DE")) val searchEngines = engines.list - assertEquals(8, searchEngines.size) + assertEquals(7, searchEngines.size) assertContainsSearchEngine("google-b-m", searchEngines) assertContainsNotSearchEngine("google-2018", searchEngines) } @@ -60,7 +60,7 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState("US", "US"), Locale("de", "DE")) val searchEngines = engines.list - assertEquals(8, searchEngines.size) + assertEquals(7, searchEngines.size) assertContainsSearchEngine("google-b-1-m", searchEngines) assertContainsNotSearchEngine("google", searchEngines) } @@ -75,7 +75,7 @@ class BundledSearchEnginesStorageTest { val searchEngines = engines.list println("searchEngines = $searchEngines") - assertEquals(6, searchEngines.size) + assertEquals(5, searchEngines.size) assertContainsNotSearchEngine("yandex-en", searchEngines) } // With region @@ -85,7 +85,7 @@ class BundledSearchEnginesStorageTest { val searchEngines = engines.list println("searchEngines = $searchEngines") - assertEquals(5, searchEngines.size) + assertEquals(4, searchEngines.size) assertContainsSearchEngine("google-com-nocodes", searchEngines) assertContainsNotSearchEngine("yandex-en", searchEngines) } @@ -134,11 +134,11 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState.Default, Locale("trs", "")) val searchEngines = engines.list - // visibleDefaultEngines: ["google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es"] + // visibleDefaultEngines: ["google-b-m", "bing", "ddg", "wikipedia-es"] // searchOrder (default): ["Google", "Bing"] assertEquals( - listOf("google-b-m", "bing", "amazondotcom", "ddg", "wikipedia-es"), + listOf("google-b-m", "bing", "ddg", "wikipedia-es"), searchEngines.map { it.id }, ) @@ -154,7 +154,7 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState.Default, Locale("xx", "XX")) val searchEngines = engines.list - assertEquals(5, searchEngines.size) + assertEquals(4, searchEngines.size) } private fun assertContainsSearchEngine(identifier: String, searchEngines: List<SearchEngine>) { @@ -181,7 +181,7 @@ class BundledSearchEnginesStorageTest { val engines = storage.load(RegionState("US", "US"), Locale("en", "US")) val searchEngines = engines.list - assertEquals(6, searchEngines.size) + assertEquals(5, searchEngines.size) val google = searchEngines.find { it.name == "Google" } assertNotNull(google!!) diff --git a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionFeature.kt b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionFeature.kt index 9dae8d3aac..521c5c7b64 100644 --- a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionFeature.kt +++ b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionFeature.kt @@ -17,6 +17,7 @@ import mozilla.components.support.base.feature.UserInteractionHandler class SessionFeature( private val store: BrowserStore, private val goBackUseCase: SessionUseCases.GoBackUseCase, + private val goForwardUseCase: SessionUseCases.GoForwardUseCase, private val engineView: EngineView, private val tabId: String? = null, ) : LifecycleAwareFeature, UserInteractionHandler { @@ -49,6 +50,22 @@ class SessionFeature( } /** + * Handler for forward pressed events in activities that use this feature. + * + * @return true if the event was handled, otherwise false. + */ + override fun onForwardPressed(): Boolean { + val tab = store.state.findTabOrCustomTabOrSelectedTab(tabId) + + if (tab?.content?.canGoForward == true) { + goForwardUseCase(tab.id) + return true + } + + return false + } + + /** * Stop feature: App is in the background. */ override fun stop() { diff --git a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionUseCases.kt b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionUseCases.kt index 565ba34632..fbe5ed9d18 100644 --- a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionUseCases.kt +++ b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/SessionUseCases.kt @@ -89,14 +89,8 @@ class SessionUseCases( // If we already have an engine session load Url directly to prevent // context switches. if (engineSession != null) { - val parentEngineSession = if (tab is TabSessionState) { - tab.parentId?.let { store.state.findTabOrCustomTab(it)?.engineState?.engineSession } - } else { - null - } engineSession.loadUrl( url = url, - parent = parentEngineSession, flags = flags, additionalHeaders = additionalHeaders, ) diff --git a/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionFeatureTest.kt b/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionFeatureTest.kt index 0192f04773..8be8db17f4 100644 --- a/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionFeatureTest.kt +++ b/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionFeatureTest.kt @@ -54,7 +54,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) feature.start() @@ -74,7 +74,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("C", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view, tabId = "C") + val feature = SessionFeature(store, mock(), mock(), view, tabId = "C") verify(view, never()).render(any()) feature.start() @@ -95,7 +95,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("D", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view, tabId = "D") + val feature = SessionFeature(store, mock(), mock(), view, tabId = "D") verify(view, never()).render(any()) feature.start() @@ -117,7 +117,7 @@ class SessionFeatureTest { store.dispatch(EngineAction.LinkEngineSessionAction("A", engineSessionA)).joinBlocking() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSessionB)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) feature.start() @@ -136,7 +136,7 @@ class SessionFeatureTest { val view: EngineView = mock() doReturn(actualView).`when`(view).asView() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) feature.start() @@ -157,7 +157,7 @@ class SessionFeatureTest { store.dispatch(EngineAction.LinkEngineSessionAction("A", engineSessionA)).joinBlocking() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSessionB)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) feature.start() @@ -181,7 +181,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) feature.start() @@ -205,7 +205,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) feature.start() @@ -233,7 +233,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("D", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view, tabId = "D") + val feature = SessionFeature(store, mock(), mock(), view, tabId = "D") verify(view, never()).render(any()) feature.start() @@ -253,7 +253,7 @@ class SessionFeatureTest { val view: EngineView = mock() doReturn(false).`when`(view).canClearSelection() - val feature = SessionFeature(BrowserStore(), mock(), view) + val feature = SessionFeature(BrowserStore(), mock(), mock(), view) assertFalse(feature.onBackPressed()) verify(view, never()).clearSelection() @@ -263,7 +263,7 @@ class SessionFeatureTest { val view: EngineView = mock() doReturn(true).`when`(view).canClearSelection() - val feature = SessionFeature(BrowserStore(), mock(), view) + val feature = SessionFeature(BrowserStore(), mock(), mock(), view) assertTrue(feature.onBackPressed()) verify(view).clearSelection() @@ -282,7 +282,7 @@ class SessionFeatureTest { val useCase: SessionUseCases.GoBackUseCase = mock() - val feature = SessionFeature(store, useCase, mock()) + val feature = SessionFeature(store, useCase, mock(), mock()) assertFalse(feature.onBackPressed()) verify(useCase, never()).invoke("A") @@ -305,7 +305,7 @@ class SessionFeatureTest { val useCase: SessionUseCases.GoBackUseCase = mock() - val feature = SessionFeature(store, useCase, mock()) + val feature = SessionFeature(store, useCase, mock(), mock()) assertTrue(feature.onBackPressed()) verify(useCase).invoke("A") @@ -313,6 +313,48 @@ class SessionFeatureTest { } @Test + fun `onForwardPressed() invokes GoForwardUseCase if forward navigation is possible`() { + run { + val store = BrowserStore( + BrowserState( + tabs = listOf(createTab("https://www.mozilla.org", id = "A")), + selectedTabId = "A", + ), + ) + + val forwardUseCase: SessionUseCases.GoForwardUseCase = mock() + + val feature = SessionFeature(store, mock(), forwardUseCase, mock()) + + assertFalse(feature.onForwardPressed()) + verify(forwardUseCase, never()).invoke("A") + } + + run { + val store = BrowserStore( + BrowserState( + tabs = listOf(createTab("https://www.mozilla.org", id = "A")), + selectedTabId = "A", + ), + ) + + store.dispatch( + ContentAction.UpdateForwardNavigationStateAction( + "A", + canGoForward = true, + ), + ).joinBlocking() + + val forwardUseCase: SessionUseCases.GoForwardUseCase = mock() + + val feature = SessionFeature(store, mock(), forwardUseCase, mock()) + + assertTrue(feature.onForwardPressed()) + verify(forwardUseCase).invoke("A") + } + } + + @Test fun `stop releases engine view`() { val store = prepareStore() @@ -323,7 +365,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("D", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view, tabId = "D") + val feature = SessionFeature(store, mock(), mock(), view, tabId = "D") verify(view, never()).render(any()) feature.start() @@ -347,7 +389,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("A", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view, tabId = "A") + val feature = SessionFeature(store, mock(), mock(), view, tabId = "A") verify(view, never()).render(any()) feature.start() @@ -368,7 +410,7 @@ class SessionFeatureTest { val engineSession: EngineSession = mock() store.dispatch(EngineAction.LinkEngineSessionAction("B", engineSession)).joinBlocking() - val feature = SessionFeature(store, mock(), view) + val feature = SessionFeature(store, mock(), mock(), view) verify(view, never()).render(any()) assertEquals(0L, store.state.findTab("B")?.lastAccess) diff --git a/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionUseCasesTest.kt b/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionUseCasesTest.kt index 4461577d25..01db35cbc8 100644 --- a/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionUseCasesTest.kt +++ b/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/SessionUseCasesTest.kt @@ -132,7 +132,6 @@ class SessionUseCasesTest { middleware.assertNotDispatched(EngineAction.LoadUrlAction::class) verify(childEngineSession).loadUrl( url = "https://www.mozilla.org/en-CA/firefox/browsers/mobile/", - parent = engineSession, ) middleware.assertLastAction(EngineAction.OptimizedLoadUrlTriggeredAction::class) { action -> assertEquals("bugzilla", action.tabId) diff --git a/mobile/android/android-components/components/feature/sitepermissions/src/main/res/values-ast/strings.xml b/mobile/android/android-components/components/feature/sitepermissions/src/main/res/values-ast/strings.xml index 1a4f8a717a..deff5834db 100644 --- a/mobile/android/android-components/components/feature/sitepermissions/src/main/res/values-ast/strings.xml +++ b/mobile/android/android-components/components/feature/sitepermissions/src/main/res/values-ast/strings.xml @@ -9,7 +9,7 @@ <!-- Title of a dialog for a location permission request. --> <string name="mozac_feature_sitepermissions_location_title">¿Quies permitir a «%1$s» qu\'use la to llocalización?</string> <!-- Title of a dialog for a camera and microphone permission request. --> - <string name="mozac_feature_sitepermissions_camera_and_microphone">¿Quies permitir a «%1$s» qu\'use la cámara ya\'l micrófonu?</string> + <string name="mozac_feature_sitepermissions_camera_and_microphone">¿Quies permitir a «%1$s» qu\'use la cámara y el micrófonu?</string> <!-- Option in a dialog for requesting a microphone permission, this option will give access to the first microphone--> <string name="mozac_feature_sitepermissions_option_microphone_one">Micrófonu 1</string> @@ -40,7 +40,7 @@ <string name="mozac_feature_sitepermissions_storage_access_title">¿Quies permitir a «%1$s» qu\'use les sos cookies en «%2$s»?</string> <!-- Message of a dialog offering more context about the cross origin storage permission. %s is the name of the site URL (www.site1.example) trying to track the user's activity. --> - <string name="mozac_feature_sitepermissions_storage_access_message">Si nun ta claro por qué «%s» precisa estos datos, ye probable que quieras bloquiar l\'accesu.</string> + <string name="mozac_feature_sitepermissions_storage_access_message">Si nun tienes claro por qué «%s» precisa estos datos, pues bloquiar l\'accesu.</string> <!-- Text for a negative button in the storage access permission request dialog. This button will not give access to this permission. --> <string name="mozac_feature_sitepermissions_storage_access_not_allow">Bloquiar</string> <!-- Clickable text that will open a new tab navigating the user to online documentation about specific features. --> diff --git a/mobile/android/android-components/components/feature/tabs/src/main/java/mozilla/components/feature/tabs/TabsUseCases.kt b/mobile/android/android-components/components/feature/tabs/src/main/java/mozilla/components/feature/tabs/TabsUseCases.kt index 6c5fe387b1..64a7cc06f8 100644 --- a/mobile/android/android-components/components/feature/tabs/src/main/java/mozilla/components/feature/tabs/TabsUseCases.kt +++ b/mobile/android/android-components/components/feature/tabs/src/main/java/mozilla/components/feature/tabs/TabsUseCases.kt @@ -194,6 +194,7 @@ class TabsUseCases( url = url, flags = flags, additionalHeaders = additionalHeaders, + includeParent = true, ), ) } @@ -412,6 +413,7 @@ class TabsUseCases( tab.id, url, flags, + includeParent = true, ), ) tab.id diff --git a/mobile/android/android-components/components/feature/webcompat-reporter/src/main/assets/extensions/webcompat-reporter/manifest.json b/mobile/android/android-components/components/feature/webcompat-reporter/src/main/assets/extensions/webcompat-reporter/manifest.json index 53051559e4..4663f571b8 100644 --- a/mobile/android/android-components/components/feature/webcompat-reporter/src/main/assets/extensions/webcompat-reporter/manifest.json +++ b/mobile/android/android-components/components/feature/webcompat-reporter/src/main/assets/extensions/webcompat-reporter/manifest.json @@ -27,18 +27,11 @@ "96": "icons/lightbulb.svg", "128": "icons/lightbulb.svg" }, - "permissions": [ - "geckoViewAddons", - "nativeMessaging", - "tabs", - "<all_urls>" - ], + "permissions": ["geckoViewAddons", "nativeMessaging", "tabs", "<all_urls>"], "background": { "persistent": false, "type": "module", - "scripts": [ - "background.js" - ] + "scripts": ["background.js"] }, "page_action": { "browser_style": true, diff --git a/mobile/android/android-components/components/lib/auth/build.gradle b/mobile/android/android-components/components/lib/auth/build.gradle index 26f11505ee..9f2017267a 100644 --- a/mobile/android/android-components/components/lib/auth/build.gradle +++ b/mobile/android/android-components/components/lib/auth/build.gradle @@ -26,6 +26,7 @@ android { dependencies { implementation project(':support-base') implementation ComponentsDependencies.androidx_biometric + implementation ComponentsDependencies.androidx_core_ktx testImplementation project(':support-test') testImplementation ComponentsDependencies.androidx_test_core diff --git a/mobile/android/android-components/components/lib/crash/build.gradle b/mobile/android/android-components/components/lib/crash/build.gradle index afedcf3044..133c542da2 100644 --- a/mobile/android/android-components/components/lib/crash/build.gradle +++ b/mobile/android/android-components/components/lib/crash/build.gradle @@ -69,6 +69,7 @@ dependencies { implementation ComponentsDependencies.androidx_appcompat implementation ComponentsDependencies.androidx_constraintlayout + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.androidx_recyclerview implementation project(':support-base') diff --git a/mobile/android/android-components/components/lib/crash/src/main/res/values-ast/strings.xml b/mobile/android/android-components/components/lib/crash/src/main/res/values-ast/strings.xml index d4d75fadfa..a6a694e9b9 100644 --- a/mobile/android/android-components/components/lib/crash/src/main/res/values-ast/strings.xml +++ b/mobile/android/android-components/components/lib/crash/src/main/res/values-ast/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources> <!-- Title of the crash reporter dialog. %1$s will be replaced with the name of the app (e.g. Firefox Focus). --> - <string name="mozac_lib_crash_dialog_title">Sentímoslo, %1$s tuvo un problema ya cascó.</string> + <string name="mozac_lib_crash_dialog_title">%1$s tuvo un problema y cascó.</string> <!-- Label of the checkbox for sending crash reports in the crash reporter dialog. %1$s will be replaced with the name of the organization (e.g. Mozilla). --> <string name="mozac_lib_crash_dialog_checkbox">Unviar l\'informe del error a %1$s</string> @@ -16,7 +16,7 @@ <string name="mozac_lib_crash_channel">Casques</string> <!-- Title of the crash reporter notification for background process crashes. %1$s will be replaced with the name of the app (e.g. Firefox Focus). --> - <string name="mozac_lib_crash_background_process_notification_title">Sentímoslo, prodúxose un problema en %1$s.</string> + <string name="mozac_lib_crash_background_process_notification_title">Prodúxose un problema en %1$s.</string> <!-- Label of a notification action/button that will send the crash report to Mozilla. --> <string name="mozac_lib_crash_notification_action_report">Informar</string> @@ -34,7 +34,7 @@ <string name="mozac_lib_crash_activity_title">Informes de casques</string> <!-- Text shown instead of crash list if no crashes have been submitted yet --> - <string name="mozac_lib_crash_no_crashes">Nun s\'unvió nengún informe de casques.</string> + <string name="mozac_lib_crash_no_crashes">Nun s\'unvió nengún informe de casque.</string> <!-- Text link that will show an app chooser to share a crash report with a third-party app (e.g. gmail) --> <string name="mozac_lib_crash_share">Compartir</string> diff --git a/mobile/android/android-components/components/lib/crash/src/main/res/values-zh-rCN/strings.xml b/mobile/android/android-components/components/lib/crash/src/main/res/values-zh-rCN/strings.xml index 9a0bf4aadb..a71a9fc917 100644 --- a/mobile/android/android-components/components/lib/crash/src/main/res/values-zh-rCN/strings.xml +++ b/mobile/android/android-components/components/lib/crash/src/main/res/values-zh-rCN/strings.xml @@ -37,5 +37,5 @@ <string name="mozac_lib_crash_no_crashes">尚未提交任何崩溃报告。</string> <!-- Text link that will show an app chooser to share a crash report with a third-party app (e.g. gmail) --> - <string name="mozac_lib_crash_share">共享</string> + <string name="mozac_lib_crash_share">分享</string> </resources> diff --git a/mobile/android/android-components/components/lib/push-firebase/build.gradle b/mobile/android/android-components/components/lib/push-firebase/build.gradle index c8bc41debe..cd6b6acd41 100644 --- a/mobile/android/android-components/components/lib/push-firebase/build.gradle +++ b/mobile/android/android-components/components/lib/push-firebase/build.gradle @@ -24,6 +24,7 @@ android { dependencies { implementation ComponentsDependencies.kotlin_coroutines + implementation ComponentsDependencies.play_services_base implementation project(':concept-push') implementation project(':support-base') diff --git a/mobile/android/android-components/components/lib/push-firebase/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt b/mobile/android/android-components/components/lib/push-firebase/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt index e378f199a3..83bdd558a2 100644 --- a/mobile/android/android-components/components/lib/push-firebase/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt +++ b/mobile/android/android-components/components/lib/push-firebase/src/main/java/mozilla/components/lib/push/firebase/AbstractFirebasePushService.kt @@ -5,9 +5,9 @@ package mozilla.components.lib.push.firebase import android.content.Context +import androidx.annotation.VisibleForTesting import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.common.util.VisibleForTesting import com.google.firebase.FirebaseApp import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessagingService diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/AccountStorage.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/AccountStorage.kt index 37af0f5b76..e5f8a665eb 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/AccountStorage.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/AccountStorage.kt @@ -11,7 +11,6 @@ import mozilla.appservices.fxaclient.FxaRustAuthState import mozilla.components.concept.base.crash.CrashReporting import mozilla.components.concept.sync.AccountEvent import mozilla.components.concept.sync.AccountEventsObserver -import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.StatePersistenceCallback import mozilla.components.lib.dataprotect.SecureAbove22Preferences import mozilla.components.service.fxa.manager.FxaAccountManager @@ -26,16 +25,16 @@ const val FXA_STATE_KEY = "fxaState" * Represents state of our account on disk - is it new, or restored? */ internal sealed class AccountOnDisk : WithAccount { - data class Restored(val account: OAuthAccount) : AccountOnDisk() { + data class Restored(val account: FirefoxAccount) : AccountOnDisk() { override fun account() = account } - data class New(val account: OAuthAccount) : AccountOnDisk() { + data class New(val account: FirefoxAccount) : AccountOnDisk() { override fun account() = account } } internal interface WithAccount { - fun account(): OAuthAccount + fun account(): FirefoxAccount } /** @@ -80,16 +79,16 @@ open class StorageWrapper( } } - private fun watchAccount(account: OAuthAccount) { + private fun watchAccount(account: FirefoxAccount) { account.registerPersistenceCallback(statePersistenceCallback) account.deviceConstellation().register(accountEventsIntegration) } /** - * Exists strictly for testing purposes, allowing tests to specify their own implementation of [OAuthAccount]. + * Exists strictly for testing purposes, allowing tests to specify their own implementation of [FirefoxAccount]. */ @VisibleForTesting - open fun obtainAccount(): OAuthAccount = FirefoxAccount(serverConfig, crashReporter) + open fun obtainAccount(): FirefoxAccount = FirefoxAccount(serverConfig, crashReporter) } /** @@ -110,7 +109,7 @@ internal class AccountEventsIntegration( internal interface AccountStorage { @Throws(Exception::class) - fun read(): OAuthAccount? + fun read(): FirefoxAccount? fun write(accountState: String) fun clear() } @@ -156,7 +155,7 @@ internal class SharedPrefAccountStorage( * @throws FxaException if JSON failed to parse into a [FirefoxAccount]. */ @Throws(FxaException::class) - override fun read(): OAuthAccount? { + override fun read(): FirefoxAccount? { val savedJSON = accountPreferences().getString(FXA_STATE_KEY, null) ?: return null @@ -244,7 +243,7 @@ internal class SecureAbove22AccountStorage( * @throws FxaException if JSON failed to parse into a [FirefoxAccount]. */ @Throws(FxaException::class) - override fun read(): OAuthAccount? { + override fun read(): FirefoxAccount? { return store.getString(KEY_ACCOUNT_STATE).also { // If account state is missing, but we expected it to be present, report an exception. if (it == null && prefs.getBoolean(PREF_KEY_HAS_STATE, false)) { diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FirefoxAccount.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FirefoxAccount.kt index 7fc31785e3..14e3e7d105 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FirefoxAccount.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FirefoxAccount.kt @@ -17,6 +17,7 @@ import mozilla.components.concept.sync.DeviceConstellation import mozilla.components.concept.sync.FxAEntryPoint import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.StatePersistenceCallback +import mozilla.components.concept.sync.UserData import mozilla.components.support.base.log.logger.Logger typealias PersistCallback = mozilla.appservices.fxaclient.FxaClient.PersistCallback @@ -96,6 +97,10 @@ class FirefoxAccount internal constructor( internal fun getAuthState() = inner.getAuthState() + internal fun simulateNetworkError() = inner.simulateNetworkError() + internal fun simulateTemporaryAuthTokenIssue() = inner.simulateTemporaryAuthTokenIssue() + internal fun simulatePermanentAuthTokenIssue() = inner.simulatePermanentAuthTokenIssue() + override suspend fun beginOAuthFlow( scopes: Set<String>, entryPoint: FxAEntryPoint, @@ -128,6 +133,12 @@ class FirefoxAccount internal constructor( } } + override suspend fun setUserData(userData: UserData) { + handleFxaExceptions(logger, "setUserData", { null }) { + inner.setUserData(userData.into()) + } + } + override fun getCurrentDeviceId(): String? { // This is awkward, yes. Underlying method simply reads some data from in-memory state, and yet it throws // in case that data isn't there. See https://github.com/mozilla/application-services/issues/2202. diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt index 99c4fb196f..88e4eebd4c 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt @@ -191,6 +191,9 @@ class FxaDeviceConstellation( crashReporter?.submitCaughtException(error) } } + is DeviceCommandOutgoing.CloseTab -> { + account.closeTabs(targetDeviceId, outgoingCommand.urls) + } else -> logger.debug("Skipped sending unsupported command type: $outgoingCommand") } null diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/Types.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/Types.kt index 737ff3c273..d489686cdd 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/Types.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/Types.kt @@ -18,6 +18,7 @@ import mozilla.components.concept.sync.DeviceCapability import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.OAuthScopedKey import mozilla.components.concept.sync.SyncAuthInfo +import mozilla.components.concept.sync.UserData import mozilla.appservices.fxaclient.DeviceCapability as RustDeviceCapability import mozilla.appservices.fxaclient.DevicePushSubscription as RustDevicePushSubscription import mozilla.appservices.sync15.DeviceType as RustDeviceType @@ -106,6 +107,20 @@ fun Profile.into(): mozilla.components.concept.sync.Profile { ) } +/** + * Converts the android-components defined [UserData] type into + * the application-services one, so consumers of android-components + * do not have to know about application services. + */ +fun UserData.into(): mozilla.appservices.fxaclient.UserData { + return mozilla.appservices.fxaclient.UserData( + sessionToken, + uid, + email, + verified, + ) +} + internal fun RustDeviceType.into(): DeviceType { return when (this) { RustDeviceType.DESKTOP -> DeviceType.DESKTOP @@ -139,6 +154,7 @@ fun DeviceType.into(): RustDeviceType { fun DeviceCapability.into(): RustDeviceCapability { return when (this) { DeviceCapability.SEND_TAB -> RustDeviceCapability.SEND_TAB + DeviceCapability.CLOSE_TABS -> RustDeviceCapability.CLOSE_TABS } } @@ -149,6 +165,7 @@ fun DeviceCapability.into(): RustDeviceCapability { fun RustDeviceCapability.into(): DeviceCapability { return when (this) { RustDeviceCapability.SEND_TAB -> DeviceCapability.SEND_TAB + RustDeviceCapability.CLOSE_TABS -> DeviceCapability.CLOSE_TABS } } @@ -240,6 +257,7 @@ fun AccountEvent.into(): mozilla.components.concept.sync.AccountEvent { fun IncomingDeviceCommand.into(): mozilla.components.concept.sync.DeviceCommandIncoming { return when (this) { is IncomingDeviceCommand.TabReceived -> this.into() + is IncomingDeviceCommand.TabsClosed -> this.into() } } @@ -249,3 +267,10 @@ fun IncomingDeviceCommand.TabReceived.into(): mozilla.components.concept.sync.De entries = this.payload.entries.map { it.into() }, ) } + +fun IncomingDeviceCommand.TabsClosed.into(): mozilla.components.concept.sync.DeviceCommandIncoming.TabsClosed { + return mozilla.components.concept.sync.DeviceCommandIncoming.TabsClosed( + from = this.sender?.into(), + urls = this.payload.urls, + ) +} diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/FxaAccountManager.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/FxaAccountManager.kt index 03a7d25635..71232c0815 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/FxaAccountManager.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/FxaAccountManager.kt @@ -8,9 +8,11 @@ import android.content.Context import androidx.annotation.GuardedBy import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import mozilla.appservices.fxaclient.FxaStateCheckerEvent import mozilla.appservices.fxaclient.FxaStateCheckerState @@ -26,6 +28,7 @@ import mozilla.components.concept.sync.FxAEntryPoint import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile import mozilla.components.concept.sync.ServiceResult +import mozilla.components.concept.sync.UserData import mozilla.components.service.fxa.AccessTokenUnexpectedlyWithoutKey import mozilla.components.service.fxa.AccountManagerException import mozilla.components.service.fxa.AccountOnDisk @@ -344,11 +347,14 @@ open class FxaAccountManager( * @param pairingUrl Optional pairing URL in case a pairing flow is being initiated. * @param entrypoint an enum representing the feature entrypoint requesting the URL. * the entrypoint is used in telemetry. + * @param authScopes The oAuth scopes being requested, if none are provided + * we default to the scopes provided when constructing [FxaAccountManager] * @return An authentication url which is to be presented to the user. */ suspend fun beginAuthentication( pairingUrl: String? = null, entrypoint: FxAEntryPoint, + authScopes: Set<String> = scopes, ): String? = withContext(coroutineContext) { // It's possible that at this point authentication is considered to be "in-progress". // For example, if user started authentication flow, but cancelled it (closing a custom tab) @@ -357,9 +363,9 @@ open class FxaAccountManager( processQueue(Event.Progress.CancelAuth) val event = if (pairingUrl != null) { - Event.Account.BeginPairingFlow(pairingUrl, entrypoint) + Event.Account.BeginPairingFlow(pairingUrl, entrypoint, authScopes) } else { - Event.Account.BeginEmailFlow(entrypoint) + Event.Account.BeginEmailFlow(entrypoint, authScopes) } // Process the event, then use the new state to check the result of the operation @@ -375,6 +381,16 @@ open class FxaAccountManager( } /** + * Sets the user's data received from the web content. + * **NOTE**: This is only useful for applications that are user agents, that + * require the user's session token, and thus isn't a part of the state machine + * @param userData: The user's data as given by the web channel, including the session token + */ + suspend fun setUserData(userData: UserData) = withContext(coroutineContext) { + account.setUserData(userData) + } + + /** * Finalize authentication that was started via [beginAuthentication]. * * If authentication wasn't started via this manager we won't accept this authentication attempt, @@ -590,10 +606,10 @@ open class FxaAccountManager( } else { null } - val entrypoint = if (via is Event.Account.BeginEmailFlow) { - via.entrypoint + val (entrypoint, authScopes) = if (via is Event.Account.BeginEmailFlow) { + Pair(via.entrypoint, via.scopes) } else if (via is Event.Account.BeginPairingFlow) { - via.entrypoint + Pair(via.entrypoint, via.scopes) } else { // This should be impossible, both `BeginPairingFlow` and `BeginEmailFlow` // have a required `entrypoint` and we are matching against only instances @@ -601,7 +617,7 @@ open class FxaAccountManager( throw IllegalStateException("BeginningAuthentication with a flow that is neither email nor pairing") } val result = withRetries(logger, MAX_NETWORK_RETRIES) { - pairingUrl.asAuthFlowUrl(account, scopes, entrypoint = entrypoint) + pairingUrl.asAuthFlowUrl(account, authScopes, entrypoint = entrypoint) } when (result) { is Result.Success -> { @@ -935,4 +951,60 @@ open class FxaAccountManager( accountManager.syncStatusObserverRegistry.notifyObservers { onError(error) } } } + + /** + * Hook this up to the secret debug menu to simulate a network error + * + * Typical usage is: + * - `adb logcat | grep fxa_client` + * - Trigger this via the secret debug menu item. + * - Watch the logs. You should see the client perform a call to `get_profile', see a + * network error, then recover. + * - Note: the logs will be more clear once we switch the code to using the app-services state + * machine. + * - Check the UI, it should be in an authenticated state. + */ + public fun simulateNetworkError() { + account.simulateNetworkError() + CoroutineScope(coroutineContext).launch { + refreshProfile(true) + } + } + + /** + * Hook this up to the secret debug menu to simulate a temporary auth error + * + * Typical usage is: + * - `adb logcat | grep fxa_client` + * - Trigger this via the secret debug menu item. + * - Watch the logs. You should see the client perform a call to `get_profile', see an + * auth error, then recover. + * - Check the UI, it should be in an authenticated state. + */ + public fun simulateTemporaryAuthTokenIssue() { + account.simulateTemporaryAuthTokenIssue() + SyncAuthInfoCache(context).clear() + CoroutineScope(coroutineContext).launch { + refreshProfile(true) + } + } + + /** + * Hook this up to the secret debug menu to simulate an unrecoverable auth error + * + * Typical usage is: + * - `adb logcat | grep fxa_client` + * - Trigger this via the secret debug menu item. + * - Initiaite a sync, or perform some other action that requires authentication. + * - Watch the logs. You should see the client perform a call to `get_profile', see an + * auth error, then fail to recover. + * - Check the UI, it should be in an authentication problems state. + */ + public fun simulatePermanentAuthTokenIssue() { + account.simulatePermanentAuthTokenIssue() + SyncAuthInfoCache(context).clear() + CoroutineScope(coroutineContext).launch { + refreshProfile(true) + } + } } diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/State.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/State.kt index 111715703a..50858c2bbe 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/State.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/manager/State.kt @@ -52,10 +52,31 @@ import mozilla.components.service.fxa.FxaAuthData * State transitions are described by a transition matrix, which is described in [State.next]. */ -internal sealed class AccountState { +/** + * Represents a [State.Idle] in the accounts state machine detailing the state of the account + * lifecycle. + */ +sealed class AccountState { + /** + * Account is logged in and authenticated. + */ object Authenticated : AccountState() + + /** + * Account is authenticating. + * + * @property oAuthUrl OAuth URL to be loaded to go through the authentication flow. + */ data class Authenticating(val oAuthUrl: String) : AccountState() + + /** + * Account needs to be re-authenticated (e.g. due to a password change). + */ object AuthenticationProblem : AccountState() + + /** + * No authenticated account is available (e.g. account is logged out). + */ object NotAuthenticated : AccountState() } @@ -70,8 +91,12 @@ internal enum class ProgressState { internal sealed class Event { internal sealed class Account : Event() { internal object Start : Account() - data class BeginEmailFlow(val entrypoint: FxAEntryPoint) : Account() - data class BeginPairingFlow(val pairingUrl: String?, val entrypoint: FxAEntryPoint) : Account() + data class BeginEmailFlow(val entrypoint: FxAEntryPoint, val scopes: Set<String>) : Account() + data class BeginPairingFlow( + val pairingUrl: String?, + val entrypoint: FxAEntryPoint, + val scopes: Set<String>, + ) : Account() data class AuthenticationError(val operation: String, val errorCountWithinTheTimeWindow: Int = 1) : Account() { override fun toString(): String { return "${this.javaClass.simpleName} - $operation" diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncAction.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncAction.kt index b09e7f3dcc..eb2d7960cf 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncAction.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncAction.kt @@ -6,6 +6,7 @@ package mozilla.components.service.fxa.store import mozilla.components.concept.sync.ConstellationState import mozilla.components.lib.state.Action +import mozilla.components.service.fxa.manager.AccountState /** * Actions for updating the global [SyncState] via [SyncStore]. @@ -22,6 +23,11 @@ sealed class SyncAction : Action { data class UpdateAccount(val account: Account?) : SyncAction() /** + * Update the [SyncState.accountState] of the [SyncStore]. + */ + data class UpdateAccountState(val accountState: AccountState) : SyncAction() + + /** * Update the [SyncState.constellationState] of the [SyncStore]. */ data class UpdateDeviceConstellation(val deviceConstellation: ConstellationState) : SyncAction() diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncState.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncState.kt index 86c9d05d2a..91e3870251 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncState.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncState.kt @@ -9,18 +9,21 @@ import mozilla.components.concept.sync.ConstellationState import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile import mozilla.components.lib.state.State +import mozilla.components.service.fxa.manager.AccountState import mozilla.components.service.fxa.sync.WorkManagerSyncManager /** * Global state of Sync. * * @property status The current status of Sync. - * @property account The current Sync account, if any. + * @property account The current Sync [Account], if any. + * @property accountState The current [AccountState] of Sync. * @property constellationState The current constellation state, if any. */ data class SyncState( val status: SyncStatus = SyncStatus.NotInitialized, val account: Account? = null, + val accountState: AccountState = AccountState.NotAuthenticated, val constellationState: ConstellationState? = null, ) : State diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStore.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStore.kt index 50f4b6747e..487d9bd1ea 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStore.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStore.kt @@ -22,6 +22,7 @@ private fun reduce(syncState: SyncState, syncAction: SyncAction): SyncState { return when (syncAction) { is SyncAction.UpdateSyncStatus -> syncState.copy(status = syncAction.status) is SyncAction.UpdateAccount -> syncState.copy(account = syncAction.account) + is SyncAction.UpdateAccountState -> syncState.copy(accountState = syncAction.accountState) is SyncAction.UpdateDeviceConstellation -> syncState.copy(constellationState = syncAction.deviceConstellation) } diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStoreSupport.kt b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStoreSupport.kt index 4feda96e60..7674d8a8fc 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStoreSupport.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/store/SyncStoreSupport.kt @@ -10,12 +10,15 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.concept.sync.AccountObserver +import mozilla.components.concept.sync.AuthFlowError import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.ConstellationState import mozilla.components.concept.sync.DeviceConstellationObserver import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile +import mozilla.components.service.fxa.manager.AccountState import mozilla.components.service.fxa.manager.FxaAccountManager +import mozilla.components.service.fxa.manager.SCOPE_PROFILE import mozilla.components.service.fxa.sync.SyncStatusObserver import java.lang.Exception @@ -95,6 +98,24 @@ internal class FxaAccountObserver( private val autoPause: Boolean, private val coroutineScope: CoroutineScope, ) : AccountObserver { + override fun onReady(authenticatedAccount: OAuthAccount?) { + coroutineScope.launch { + if (authenticatedAccount == null) { + return@launch + } + + val syncAccount = + authenticatedAccount.getProfile()?.toAccount(authenticatedAccount) ?: return@launch + store.dispatch(SyncAction.UpdateAccount(account = syncAccount)) + + val accountState = when (authenticatedAccount.checkAuthorizationStatus(SCOPE_PROFILE)) { + true -> AccountState.Authenticated + null, false -> AccountState.AuthenticationProblem + } + store.dispatch(SyncAction.UpdateAccountState(accountState = accountState)) + } + } + override fun onAuthenticated(account: OAuthAccount, authType: AuthType) { coroutineScope.launch(Dispatchers.Main) { account.deviceConstellation().registerDeviceObserver( @@ -106,12 +127,23 @@ internal class FxaAccountObserver( coroutineScope.launch { val syncAccount = account.getProfile()?.toAccount(account) ?: return@launch store.dispatch(SyncAction.UpdateAccount(syncAccount)) + store.dispatch(SyncAction.UpdateAccountState(AccountState.Authenticated)) } } + override fun onAuthenticationProblems() { + store.dispatch(SyncAction.UpdateAccountState(accountState = AccountState.AuthenticationProblem)) + } + override fun onLoggedOut() { store.dispatch(SyncAction.UpdateSyncStatus(SyncStatus.LoggedOut)) store.dispatch(SyncAction.UpdateAccount(null)) + store.dispatch(SyncAction.UpdateAccountState(accountState = AccountState.NotAuthenticated)) + } + + override fun onFlowError(error: AuthFlowError) { + store.dispatch(SyncAction.UpdateAccount(account = null)) + store.dispatch(SyncAction.UpdateAccountState(accountState = AccountState.NotAuthenticated)) } } diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/FxaAccountManagerTest.kt b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/FxaAccountManagerTest.kt index afc2fc3ee9..3c6a3421f2 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/FxaAccountManagerTest.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/FxaAccountManagerTest.kt @@ -74,13 +74,13 @@ internal class TestableStorageWrapper( manager: FxaAccountManager, accountEventObserverRegistry: ObserverRegistry<AccountEventsObserver>, serverConfig: FxaConfig, - private val block: () -> OAuthAccount = { - val account: OAuthAccount = mock() + private val block: () -> FirefoxAccount = { + val account: FirefoxAccount = mock() `when`(account.deviceConstellation()).thenReturn(mock()) account }, ) : StorageWrapper(manager, accountEventObserverRegistry, serverConfig) { - override fun obtainAccount(): OAuthAccount = block() + override fun obtainAccount(): FirefoxAccount = block() } // Same as the actual account manager, except we get to control how FirefoxAccountShaped instances @@ -95,8 +95,8 @@ internal open class TestableFxaAccountManager( syncConfig: SyncConfig? = null, coroutineContext: CoroutineContext, crashReporter: CrashReporting? = null, - block: () -> OAuthAccount = { - val account: OAuthAccount = mock() + block: () -> FirefoxAccount = { + val account: FirefoxAccount = mock() `when`(account.deviceConstellation()).thenReturn(mock()) account }, @@ -201,7 +201,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile("testUid", "test@example.com", null, "Test Profile") val constellation: DeviceConstellation = mockDeviceConstellation() - val account = StatePersistenceTestableAccount(profile, constellation) + val account = statePersistenceTestableAccount(profile, constellation) val manager = TestableFxaAccountManager( testContext, @@ -218,17 +218,18 @@ class FxaAccountManagerTest { // We have an account at the start. `when`(accountStorage.read()).thenReturn(account) - assertNull(account.persistenceCallback) + verify(account, never()).registerPersistenceCallback(any()) manager.start() // Assert that persistence callback is set. - assertNotNull(account.persistenceCallback) + val captor = argumentCaptor<StatePersistenceCallback>() + verify(account).registerPersistenceCallback(captor.capture()) // Assert that ensureCapabilities fired, but not the device initialization (since we're restoring). verify(constellation).finalizeDevice(eq(AuthType.Existing), any()) // Assert that persistence callback is interacting with the storage layer. - account.persistenceCallback!!.persist("test") + captor.value.persist("test") verify(accountStorage).write("test") } @@ -237,7 +238,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile("testUid", "test@example.com", null, "Test Profile") val constellation: DeviceConstellation = mockDeviceConstellation() - val account = StatePersistenceTestableAccount(profile, constellation) + val account = statePersistenceTestableAccount(profile, constellation) val manager = TestableFxaAccountManager( testContext, @@ -254,17 +255,18 @@ class FxaAccountManagerTest { // We have an account at the start. `when`(accountStorage.read()).thenReturn(account) - assertNull(account.persistenceCallback) + verify(account, never()).registerPersistenceCallback(any()) manager.start() // Assert that persistence callback is set. - assertNotNull(account.persistenceCallback) + val captor = argumentCaptor<StatePersistenceCallback>() + verify(account).registerPersistenceCallback(captor.capture()) // Assert that finalizeDevice fired with a correct auth type. 3 times since we re-try. verify(constellation, times(3)).finalizeDevice(eq(AuthType.Existing), any()) // Assert that persistence callback is interacting with the storage layer. - account.persistenceCallback!!.persist("test") + captor.value.persist("test") verify(accountStorage).write("test") // Since we weren't able to finalize the account state, we're no longer authenticated. @@ -276,7 +278,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile("testUid", "test@example.com", null, "Test Profile") val constellation: DeviceConstellation = mockDeviceConstellation() - val account = StatePersistenceTestableAccount(profile, constellation, ableToRecoverFromAuthError = false) + val account = statePersistenceTestableAccount(profile, constellation, ableToRecoverFromAuthError = false) val accountObserver: AccountObserver = mock() val manager = TestableFxaAccountManager( @@ -295,19 +297,19 @@ class FxaAccountManagerTest { // We have an account at the start. `when`(accountStorage.read()).thenReturn(account) - assertNull(account.persistenceCallback) + verify(account, never()).registerPersistenceCallback(any()) assertFalse(manager.accountNeedsReauth()) - assertFalse(account.authErrorDetectedCalled) - assertFalse(account.checkAuthorizationStatusCalled) + verify(account, never()).authErrorDetected() + verify(account, never()).checkAuthorizationStatus(any()) verify(accountObserver, never()).onAuthenticationProblems() manager.start() assertTrue(manager.accountNeedsReauth()) verify(accountObserver, times(1)).onAuthenticationProblems() - assertTrue(account.authErrorDetectedCalled) - assertTrue(account.checkAuthorizationStatusCalled) + verify(account).authErrorDetected() + verify(account).checkAuthorizationStatus(any()) } @Test(expected = FxaPanicException::class) @@ -315,7 +317,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile("testUid", "test@example.com", null, "Test Profile") val constellation: DeviceConstellation = mock() - val account = StatePersistenceTestableAccount(profile, constellation) + val account = statePersistenceTestableAccount(profile, constellation) val accountObserver: AccountObserver = mock() val manager = TestableFxaAccountManager( @@ -339,7 +341,7 @@ class FxaAccountManagerTest { // We have an account at the start. `when`(accountStorage.read()).thenReturn(account) - assertNull(account.persistenceCallback) + verify(account, never()).registerPersistenceCallback(any()) assertFalse(manager.accountNeedsReauth()) verify(accountObserver, never()).onAuthenticationProblems() @@ -352,7 +354,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") val constellation: DeviceConstellation = mockDeviceConstellation() - val account = StatePersistenceTestableAccount(profile, constellation) + val account = statePersistenceTestableAccount(profile, constellation) val accountObserver: AccountObserver = mock() // We are not using the "prepareHappy..." helper method here, because our account isn't a mock, // but an actual implementation of the interface. @@ -388,7 +390,9 @@ class FxaAccountManagerTest { verify(constellation).finalizeDevice(eq(AuthType.Signin), any()) // Assert that persistence callback is interacting with the storage layer. - account.persistenceCallback!!.persist("test") + val captor = argumentCaptor<StatePersistenceCallback>() + verify(account).registerPersistenceCallback(captor.capture()) + captor.value.persist("test") verify(accountStorage).write("test") } @@ -397,7 +401,7 @@ class FxaAccountManagerTest { val accountStorage: AccountStorage = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") val constellation: DeviceConstellation = mockDeviceConstellation() - val account = StatePersistenceTestableAccount(profile, constellation) + val account = statePersistenceTestableAccount(profile, constellation) val accountObserver: AccountObserver = mock() // We are not using the "prepareHappy..." helper method here, because our account isn't a mock, // but an actual implementation of the interface. @@ -423,7 +427,7 @@ class FxaAccountManagerTest { manager.finishAuthentication(FxaAuthData(AuthType.Signin, "dummyCode", UNEXPECTED_AUTH_STATE)) assertTrue(manager.authenticatedAccount() == null) - // Start authentication. StatePersistenceTestableAccount will produce state=EXPECTED_AUTH_STATE. + // Start authentication. statePersistenceTestableAccount will produce state=EXPECTED_AUTH_STATE. assertEquals(testAuthFlowUrl(entrypoint = "home-menu").url, manager.beginAuthentication(entrypoint = entryPoint)) // Now attempt to finish it with a correct state. @@ -435,97 +439,17 @@ class FxaAccountManagerTest { assertEquals(account, manager.authenticatedAccount()) } - class StatePersistenceTestableAccount( - private val profile: Profile, - private val constellation: DeviceConstellation, - val ableToRecoverFromAuthError: Boolean = false, - val tokenServerEndpointUrl: String? = null, - val accessToken: (() -> AccessTokenInfo)? = null, - ) : OAuthAccount { - - var persistenceCallback: StatePersistenceCallback? = null - var checkAuthorizationStatusCalled = false - var authErrorDetectedCalled = false - - override suspend fun beginOAuthFlow(scopes: Set<String>, entryPoint: FxAEntryPoint): AuthFlowUrl? { - return AuthFlowUrl(EXPECTED_AUTH_STATE, testAuthFlowUrl(entrypoint = entryPoint.entryName).url) - } - - override suspend fun beginPairingFlow(pairingUrl: String, scopes: Set<String>, entryPoint: FxAEntryPoint): AuthFlowUrl? { - return AuthFlowUrl(EXPECTED_AUTH_STATE, testAuthFlowUrl(entrypoint = entryPoint.entryName).url) - } - - override suspend fun getProfile(ignoreCache: Boolean): Profile? { - return profile - } - - override fun getCurrentDeviceId(): String? { - return "testFxaDeviceId" - } - - override fun getSessionToken(): String? { - return null - } - - override suspend fun completeOAuthFlow(code: String, state: String): Boolean { - return true - } - - override suspend fun getAccessToken(singleScope: String): AccessTokenInfo? { - val token = accessToken?.invoke() - if (token != null) return token - - fail() - return null - } - - override fun authErrorDetected() { - authErrorDetectedCalled = true - } - - override suspend fun checkAuthorizationStatus(singleScope: String): Boolean? { - checkAuthorizationStatusCalled = true - return ableToRecoverFromAuthError - } - - override suspend fun getTokenServerEndpointURL(): String? { - if (tokenServerEndpointUrl != null) return tokenServerEndpointUrl - - fail() - return "" - } - - override suspend fun getManageAccountURL(entryPoint: FxAEntryPoint): String? { - return "https://firefox.com/settings" - } - - override fun getPairingAuthorityURL(): String { - return "https://firefox.com/pair" - } - - override fun registerPersistenceCallback(callback: StatePersistenceCallback) { - persistenceCallback = callback - } - - override fun deviceConstellation(): DeviceConstellation { - return constellation - } - - override suspend fun disconnect(): Boolean { - return true - } - - override fun toJSONString(): String { - fail() - return "" - } - - override fun close() { - // Only expect 'close' to be called if we can't recover from an auth error. - if (ableToRecoverFromAuthError) { - fail() - } - } + suspend fun statePersistenceTestableAccount(profile: Profile, constellation: DeviceConstellation, ableToRecoverFromAuthError: Boolean = false): FirefoxAccount { + val account = mock<FirefoxAccount>() + `when`(account.getProfile(anyBoolean())).thenReturn(profile) + `when`(account.deviceConstellation()).thenReturn(constellation) + `when`(account.checkAuthorizationStatus(any())).thenReturn(ableToRecoverFromAuthError) + `when`(account.beginOAuthFlow(any(), any())).thenReturn(testAuthFlowUrl(entrypoint = "home-menu")) + `when`(account.beginPairingFlow(any(), any(), any())).thenReturn(testAuthFlowUrl(entrypoint = "home-menu")) + `when`(account.completeOAuthFlow(anyString(), anyString())).thenReturn(true) + `when`(account.getCurrentDeviceId()).thenReturn("testFxaDeviceId") + + return account } @Test @@ -596,7 +520,7 @@ class FxaAccountManagerTest { @Test fun `with persisted account and profile`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() val profile = Profile( "testUid", @@ -667,7 +591,7 @@ class FxaAccountManagerTest { @Test fun `happy authentication and profile flow`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -712,7 +636,7 @@ class FxaAccountManagerTest { @Test(expected = FxaPanicException::class) fun `fxa panic during initDevice flow`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -740,7 +664,7 @@ class FxaAccountManagerTest { @Test(expected = FxaPanicException::class) fun `fxa panic during pairing flow`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() `when`(mockAccount.deviceConstellation()).thenReturn(mock()) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") val accountStorage = mock<AccountStorage>() @@ -769,7 +693,7 @@ class FxaAccountManagerTest { @Test fun `happy pairing authentication and profile flow`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -806,7 +730,7 @@ class FxaAccountManagerTest { @Test fun `repeated unfinished authentication attempts succeed`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -863,7 +787,7 @@ class FxaAccountManagerTest { @Test fun `unhappy authentication flow`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") val accountObserver: AccountObserver = mock() @@ -911,7 +835,7 @@ class FxaAccountManagerTest { @Test fun `unhappy pairing authentication flow`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") val accountObserver: AccountObserver = mock() @@ -970,7 +894,7 @@ class FxaAccountManagerTest { @Test fun `authentication issues are propagated via AccountObserver`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -1025,7 +949,7 @@ class FxaAccountManagerTest { @Test fun `authentication issues are recoverable via checkAuthorizationState`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -1072,7 +996,7 @@ class FxaAccountManagerTest { @Test fun `authentication recovery flow has a circuit breaker`() = runTest { - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) val profile = Profile(uid = "testUID", avatar = null, email = "test@example.com", displayName = "test profile") @@ -1163,7 +1087,7 @@ class FxaAccountManagerTest { @Test fun `unhappy profile fetching flow`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) @@ -1232,7 +1156,7 @@ class FxaAccountManagerTest { @Test fun `profile fetching flow hit an unrecoverable auth problem`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.getCurrentDeviceId()).thenReturn("testDeviceId") @@ -1292,7 +1216,7 @@ class FxaAccountManagerTest { @Test fun `profile fetching flow hit an unrecoverable auth problem for which we can't determine a recovery state`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.deviceConstellation()).thenReturn(constellation) @@ -1353,7 +1277,7 @@ class FxaAccountManagerTest { @Test fun `profile fetching flow hit a recoverable auth problem`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() val captor = argumentCaptor<AuthType>() @@ -1437,7 +1361,7 @@ class FxaAccountManagerTest { @Test(expected = FxaPanicException::class) fun `profile fetching flow hit an fxa panic, which is re-thrown`() = runTest { val accountStorage = mock<AccountStorage>() - val mockAccount: OAuthAccount = mock() + val mockAccount: FirefoxAccount = mock() val constellation: DeviceConstellation = mock() `when`(mockAccount.getCurrentDeviceId()).thenReturn("testDeviceId") @@ -1564,7 +1488,7 @@ class FxaAccountManagerTest { } private suspend fun prepareHappyAuthenticationFlow( - mockAccount: OAuthAccount, + mockAccount: FirefoxAccount, profile: Profile, accountStorage: AccountStorage, accountObserver: AccountObserver, @@ -1608,7 +1532,7 @@ class FxaAccountManagerTest { } private suspend fun prepareUnhappyAuthenticationFlow( - mockAccount: OAuthAccount, + mockAccount: FirefoxAccount, profile: Profile, accountStorage: AccountStorage, accountObserver: AccountObserver, diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/manager/StateKtTest.kt b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/manager/StateKtTest.kt index 6323861f0e..df37088ca7 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/manager/StateKtTest.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/manager/StateKtTest.kt @@ -83,8 +83,8 @@ class StateKtTest { private fun instantiateEvent(eventClassSimpleName: String): Event { return when (eventClassSimpleName) { "Start" -> Event.Account.Start - "BeginPairingFlow" -> Event.Account.BeginPairingFlow("http://some.pairing.url.com", mock()) - "BeginEmailFlow" -> Event.Account.BeginEmailFlow(mock()) + "BeginPairingFlow" -> Event.Account.BeginPairingFlow("http://some.pairing.url.com", mock(), mock()) + "BeginEmailFlow" -> Event.Account.BeginEmailFlow(mock(), mock()) "CancelAuth" -> Event.Progress.CancelAuth "StartedOAuthFlow" -> Event.Progress.StartedOAuthFlow("https://example.com/oauth-start") "AuthenticationError" -> Event.Account.AuthenticationError("fxa op") diff --git a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/store/SyncStoreSupportTest.kt b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/store/SyncStoreSupportTest.kt index e0d90118fa..975fd6a481 100644 --- a/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/store/SyncStoreSupportTest.kt +++ b/mobile/android/android-components/components/service/firefox-accounts/src/test/java/mozilla/components/service/fxa/store/SyncStoreSupportTest.kt @@ -12,13 +12,16 @@ import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain +import mozilla.components.concept.sync.AuthFlowError import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.Avatar import mozilla.components.concept.sync.ConstellationState import mozilla.components.concept.sync.DeviceConstellation import mozilla.components.concept.sync.OAuthAccount import mozilla.components.concept.sync.Profile +import mozilla.components.service.fxa.manager.AccountState import mozilla.components.service.fxa.manager.FxaAccountManager +import mozilla.components.service.fxa.manager.SCOPE_PROFILE import mozilla.components.support.test.any import mozilla.components.support.test.coMock import mozilla.components.support.test.eq @@ -26,9 +29,11 @@ import mozilla.components.support.test.libstate.ext.waitUntilIdle import mozilla.components.support.test.mock import mozilla.components.support.test.whenever import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` import java.lang.Exception @OptIn(ExperimentalCoroutinesApi::class) @@ -115,7 +120,7 @@ class SyncStoreSupportTest { } @Test - fun `GIVEN account observer WHEN onAuthenticated observed with profile THEN account state updated`() = coroutineScope.runTest { + fun `GIVEN account observer WHEN onAuthenticated observed with profile THEN account and account state are updated`() = coroutineScope.runTest { val profile = generateProfile() val constellation = mock<DeviceConstellation>() val account = coMock<OAuthAccount> { @@ -125,6 +130,8 @@ class SyncStoreSupportTest { whenever(getProfile()).thenReturn(profile) } + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + accountObserver.onAuthenticated(account, mock<AuthType.Existing>()) runCurrent() @@ -138,10 +145,11 @@ class SyncStoreSupportTest { ) store.waitUntilIdle() assertEquals(expected, store.state.account) + assertEquals(AccountState.Authenticated, store.state.accountState) } @Test - fun `GIVEN account observer WHEN onAuthenticated observed without profile THEN account not updated`() = coroutineScope.runTest { + fun `GIVEN account observer WHEN onAuthenticated observed without profile THEN account and account state are not updated`() = coroutineScope.runTest { val constellation = mock<DeviceConstellation>() val account = coMock<OAuthAccount> { whenever(deviceConstellation()).thenReturn(constellation) @@ -152,11 +160,12 @@ class SyncStoreSupportTest { runCurrent() store.waitUntilIdle() - assertEquals(null, store.state.account) + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) } @Test - fun `GIVEN user is logged in WHEN onLoggedOut observed THEN sync status and account updated`() = coroutineScope.runTest { + fun `GIVEN user is logged in WHEN onLoggedOut observed THEN sync status and account states are updated`() = coroutineScope.runTest { val account = coMock<OAuthAccount> { whenever(deviceConstellation()).thenReturn(mock()) whenever(getProfile()).thenReturn(null) @@ -169,7 +178,94 @@ class SyncStoreSupportTest { store.waitUntilIdle() assertEquals(SyncStatus.LoggedOut, store.state.status) - assertEquals(null, store.state.account) + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + } + + @Test + fun `GIVEN account observer WHEN onAuthenticationProblems observed THEN account state is updated`() = coroutineScope.runTest { + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + + accountObserver.onAuthenticationProblems() + runCurrent() + + store.waitUntilIdle() + assertEquals(AccountState.AuthenticationProblem, store.state.accountState) + } + + @Test + fun `GIVEN account observer WHEN onFlowError observed THEN account state is updated`() = coroutineScope.runTest { + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + + accountObserver.onFlowError(mock<AuthFlowError>()) + runCurrent() + + store.waitUntilIdle() + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + } + + @Test + fun `GIVEN account observer WHEN onReady observed with profile THEN account states are updated`() = coroutineScope.runTest { + val profile = generateProfile() + val currentDeviceId = "id" + val sessionToken = "token" + val constellation = mock<DeviceConstellation>() + val authenticatedAccount = coMock<OAuthAccount> { + whenever(deviceConstellation()).thenReturn(constellation) + whenever(getCurrentDeviceId()).thenReturn(currentDeviceId) + whenever(getSessionToken()).thenReturn(sessionToken) + whenever(getProfile()).thenReturn(profile) + } + val account = Account( + uid = profile.uid, + email = profile.email, + avatar = profile.avatar, + displayName = profile.displayName, + currentDeviceId = currentDeviceId, + sessionToken = sessionToken, + ) + + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + + `when`(authenticatedAccount.checkAuthorizationStatus(eq(SCOPE_PROFILE))).thenReturn(false) + + accountObserver.onReady(authenticatedAccount = authenticatedAccount) + runCurrent() + + store.waitUntilIdle() + assertEquals(account, store.state.account) + assertEquals(AccountState.AuthenticationProblem, store.state.accountState) + + `when`(authenticatedAccount.checkAuthorizationStatus(eq(SCOPE_PROFILE))).thenReturn(true) + + accountObserver.onReady(authenticatedAccount = authenticatedAccount) + runCurrent() + + store.waitUntilIdle() + assertEquals(account, store.state.account) + assertEquals(AccountState.Authenticated, store.state.accountState) + } + + @Test + fun `GIVEN account observer WHEN onReady observed without profile THEN account states are not updated`() = coroutineScope.runTest { + val constellation = mock<DeviceConstellation>() + val account = coMock<OAuthAccount> { + whenever(deviceConstellation()).thenReturn(constellation) + whenever(getProfile()).thenReturn(null) + } + + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) + + accountObserver.onReady(account) + runCurrent() + + store.waitUntilIdle() + assertNull(store.state.account) + assertEquals(AccountState.NotAuthenticated, store.state.accountState) } @Test diff --git a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/Glean.kt b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/Glean.kt index 232ac1b83f..2990220b31 100644 --- a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/Glean.kt +++ b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/Glean.kt @@ -116,8 +116,8 @@ object Glean { * * @param enabled Map of metrics' enabled state. */ - fun setMetricsEnabledConfig(enabled: Map<String, Boolean>) { - GleanCore.setMetricsEnabledConfig(JSONObject(enabled).toString()) + fun applyServerKnobsConfig(enabled: Map<String, Boolean>) { + GleanCore.applyServerKnobsConfig(JSONObject(enabled).toString()) } /** diff --git a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/config/Configuration.kt b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/config/Configuration.kt index 11911c7046..382078d3c9 100644 --- a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/config/Configuration.kt +++ b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/config/Configuration.kt @@ -19,6 +19,8 @@ import mozilla.telemetry.glean.config.Configuration as GleanCoreConfiguration * @property channel (optional )the release channel the application is on, if known. This will be * sent along with all the pings, in the `client_info` section. * @property maxEvents (optional) the number of events to store before the events ping is sent + * @property enableEventTimestamps (Experimental) Whether to add a wallclock timestamp to all events. + * @property delayPingLifetimeIo Whether Glean should delay persistence of data from metrics with ping lifetime. */ data class Configuration @JvmOverloads constructor( val httpClient: PingUploader, @@ -26,6 +28,7 @@ data class Configuration @JvmOverloads constructor( val channel: String? = null, val maxEvents: Int? = null, val enableEventTimestamps: Boolean = false, + val delayPingLifetimeIo: Boolean = false, ) { // The following is required to support calling our API from Java. companion object { @@ -45,6 +48,7 @@ data class Configuration @JvmOverloads constructor( maxEvents = maxEvents, httpClient = httpClient, enableEventTimestamps = enableEventTimestamps, + delayPingLifetimeIo = delayPingLifetimeIo, ) } } diff --git a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/private/MetricAliases.kt b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/private/MetricAliases.kt index e6e0be9424..b98af6a480 100644 --- a/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/private/MetricAliases.kt +++ b/mobile/android/android-components/components/service/glean/src/main/java/mozilla/components/service/glean/private/MetricAliases.kt @@ -4,8 +4,6 @@ package mozilla.components.service.glean.private -import androidx.annotation.VisibleForTesting - typealias CommonMetricData = mozilla.telemetry.glean.private.CommonMetricData typealias EventExtras = mozilla.telemetry.glean.private.EventExtras typealias Lifetime = mozilla.telemetry.glean.private.Lifetime @@ -18,12 +16,14 @@ typealias CounterMetricType = mozilla.telemetry.glean.private.CounterMetricType typealias CustomDistributionMetricType = mozilla.telemetry.glean.private.CustomDistributionMetricType typealias DatetimeMetricType = mozilla.telemetry.glean.private.DatetimeMetricType typealias DenominatorMetricType = mozilla.telemetry.glean.private.DenominatorMetricType +typealias EventMetricType<T> = mozilla.telemetry.glean.private.EventMetricType<T> typealias HistogramMetricBase = mozilla.telemetry.glean.private.HistogramBase typealias HistogramType = mozilla.telemetry.glean.private.HistogramType typealias LabeledMetricType<T> = mozilla.telemetry.glean.private.LabeledMetricType<T> typealias MemoryDistributionMetricType = mozilla.telemetry.glean.private.MemoryDistributionMetricType typealias MemoryUnit = mozilla.telemetry.glean.private.MemoryUnit typealias NumeratorMetricType = mozilla.telemetry.glean.private.NumeratorMetricType +typealias ObjectSerialize = mozilla.telemetry.glean.private.ObjectSerialize typealias PingType<T> = mozilla.telemetry.glean.private.PingType<T> typealias QuantityMetricType = mozilla.telemetry.glean.private.QuantityMetricType typealias RateMetricType = mozilla.telemetry.glean.private.RateMetricType @@ -31,89 +31,8 @@ typealias RecordedExperiment = mozilla.telemetry.glean.private.RecordedExperimen typealias StringListMetricType = mozilla.telemetry.glean.private.StringListMetricType typealias StringMetricType = mozilla.telemetry.glean.private.StringMetricType typealias TextMetricType = mozilla.telemetry.glean.private.TextMetricType -typealias TimeUnit = mozilla.telemetry.glean.private.TimeUnit typealias TimespanMetricType = mozilla.telemetry.glean.private.TimespanMetricType +typealias TimeUnit = mozilla.telemetry.glean.private.TimeUnit typealias TimingDistributionMetricType = mozilla.telemetry.glean.private.TimingDistributionMetricType typealias UrlMetricType = mozilla.telemetry.glean.private.UrlMetricType typealias UuidMetricType = mozilla.telemetry.glean.private.UuidMetricType - -// FIXME(bug 1885170): Wrap the Glean SDK `EventMetricType` to overwrite the `testGetValue` function. -/** - * This implements the developer facing API for recording events. - * - * Instances of this class type are automatically generated by the parsers at built time, - * allowing developers to record events that were previously registered in the metrics.yaml file. - * - * The Events API only exposes the [record] method, which takes care of validating the input - * data and making sure that limits are enforced. - */ -class EventMetricType<ExtraObject> internal constructor( - private var inner: mozilla.telemetry.glean.private.EventMetricType<ExtraObject>, -) where ExtraObject : EventExtras { - /** - * The public constructor used by automatically generated metrics. - */ - constructor(meta: CommonMetricData, allowedExtraKeys: List<String>) : - this(inner = mozilla.telemetry.glean.private.EventMetricType(meta, allowedExtraKeys)) - - /** - * Record an event by using the information provided by the instance of this class. - * - * @param extra The event extra properties. - * Values are converted to strings automatically - * This is used for events where additional richer context is needed. - * The maximum length for values is 100 bytes. - * - * Note: `extra` is not optional here to avoid overlapping with the above definition of `record`. - * If no `extra` data is passed the above function will be invoked correctly. - */ - fun record(extra: ExtraObject? = null) { - inner.record(extra) - } - - /** - * Returns the stored value for testing purposes only. This function will attempt to await the - * last task (if any) writing to the the metric's storage engine before returning a value. - * - * @param pingName represents the name of the ping to retrieve the metric for. - * Defaults to the first value in `sendInPings`. - * @return value of the stored events - */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - @JvmOverloads - fun testGetValue(pingName: String? = null): List<mozilla.telemetry.glean.private.RecordedEvent>? { - var events = inner.testGetValue(pingName) - if (events == null) { - return events - } - - // Remove the `glean_timestamp` extra. - // This is added by Glean and does not need to be exposed to testing. - for (event in events) { - if (event.extra == null) { - continue - } - - // We know it's not null - var map = event.extra!!.toMutableMap() - map.remove("glean_timestamp") - if (map.isEmpty()) { - event.extra = null - } else { - event.extra = map - } - } - - return events - } - - /** - * Returns the number of errors recorded for the given metric. - * - * @param errorType The type of the error recorded. - * @return the number of errors recorded for the metric. - */ - @VisibleForTesting(otherwise = VisibleForTesting.NONE) - fun testGetNumRecordedErrors(errorType: mozilla.components.service.glean.testing.ErrorType) = - inner.testGetNumRecordedErrors(errorType) -} diff --git a/mobile/android/android-components/components/service/nimbus/messaging.fml.yaml b/mobile/android/android-components/components/service/nimbus/messaging.fml.yaml index c53456e31e..a37818f8e8 100644 --- a/mobile/android/android-components/components/service/nimbus/messaging.fml.yaml +++ b/mobile/android/android-components/components/service/nimbus/messaging.fml.yaml @@ -111,16 +111,20 @@ objects: default: {} title: type: Option<Text> - description: "The title text displayed to the user" + description: The title text displayed to the user default: null text: type: Text - description: "The message text displayed to the user" + description: The message text displayed to the user # This should never be defaulted. default: "" + microsurveyConfig: + type: Option<MicrosurveyConfig> + description: Optional configuration data for a microsurvey. + default: null is-control: type: Boolean - description: "Indicates if this message is the control message, if true shouldn't be displayed" + description: Indicates if this message is the control message, if true shouldn't be displayed default: false experiment: type: Option<ExperimentSlug> @@ -183,6 +187,17 @@ objects: How often, in minutes, the notification message worker will wake up and check for new messages. default: 240 # 4 hours + MicrosurveyConfig: + description: Attributes relating to microsurvey content. + fields: + target-feature: + type: MicrosurveyTargetFeature + description: The type of feature the microsurvey is for e.g. Printing. + default: unknown # Should not be defaulted + options: + description: The list of options to present to the user e.g. "Satisfied, Dissatisfied...". + type: List<Text> + default: [] # Should not be defaulted enums: ControlMessageBehavior: @@ -192,3 +207,11 @@ enums: description: The next eligible message should be shown. show-none: description: The surface should show no message. + + MicrosurveyTargetFeature: + description: The specific feature the microsurvey is for e.g Printing. + variants: + printing: + description: The printing feature. + unknown: + description: No target feature set. Only used in an invalid experiment configuration. diff --git a/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/stories_recommendations_response.json b/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/stories_recommendations_response.json index da2b9a2953..f410fd7d3d 100644 --- a/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/stories_recommendations_response.json +++ b/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/stories_recommendations_response.json @@ -1,44 +1,44 @@ { - "recommendations": [ - { - "category": "general", - "url": "https://getpocket.com/explore/item/how-to-remember-anything-you-really-want-to-remember-backed-by-science", - "title": "How to Remember Anything You Really Want to Remember, Backed by Science", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fwww.incimages.com%252Fuploaded_files%252Fimage%252F1920x1080%252Fgetty-862457080_394628.jpg", - "publisher": "Pocket", - "timeToRead": 3 - }, - { - "category": "general", - "url": "https://www.thecut.com/article/i-dont-want-to-be-like-a-family-with-my-co-workers.html", - "title": "‘I Don’t Want to Be Like a Family With My Co-Workers’", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpyxis.nymag.com%2Fv1%2Fimgs%2Fac8%2Fd22%2F315cd0cf1e3a43edfe0e0548f2edbcb1a1-ask-a-boss.1x.rsocial.w1200.jpg", - "publisher": "The Cut", - "timeToRead": 5 - }, - { - "category": "general", - "url": "https://www.newyorker.com/news/q-and-a/how-america-failed-in-afghanistan", - "title": "How America Failed in Afghanistan", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fmedia.newyorker.com%2Fphotos%2F6119484157b611aec9c99b43%2F16%3A9%2Fw_1280%2Cc_limit%2FChotiner-Afghanistan01.jpg", - "publisher": "The New Yorker", - "timeToRead": 14 - }, - { - "category": "general", - "url": "https://www.technologyreview.com/2021/08/15/1031804/digital-beauty-filters-photoshop-photo-editing-colorism-racism/", - "title": "How digital beauty filters perpetuate colorism", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fwp.technologyreview.com%2Fwp-content%2Fuploads%2F2021%2F08%2FBeautyScoreColorism.jpg%3Fresize%3D1200%2C600", - "publisher": "MIT Technology Review", - "timeToRead": 11 - }, - { - "category": "general", - "url": "https://getpocket.com/explore/item/how-to-get-rid-of-black-mold-naturally", - "title": "How to Get Rid of Black Mold Naturally", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fpocket-syndicated-images.s3.amazonaws.com%252Farticles%252F6757%252F1628024495_6109ae86db6cc.png", - "publisher": "Pocket", - "timeToRead": 4 - } - ] + "recommendations": [ + { + "category": "general", + "url": "https://getpocket.com/explore/item/how-to-remember-anything-you-really-want-to-remember-backed-by-science", + "title": "How to Remember Anything You Really Want to Remember, Backed by Science", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fwww.incimages.com%252Fuploaded_files%252Fimage%252F1920x1080%252Fgetty-862457080_394628.jpg", + "publisher": "Pocket", + "timeToRead": 3 + }, + { + "category": "general", + "url": "https://www.thecut.com/article/i-dont-want-to-be-like-a-family-with-my-co-workers.html", + "title": "‘I Don’t Want to Be Like a Family With My Co-Workers’", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpyxis.nymag.com%2Fv1%2Fimgs%2Fac8%2Fd22%2F315cd0cf1e3a43edfe0e0548f2edbcb1a1-ask-a-boss.1x.rsocial.w1200.jpg", + "publisher": "The Cut", + "timeToRead": 5 + }, + { + "category": "general", + "url": "https://www.newyorker.com/news/q-and-a/how-america-failed-in-afghanistan", + "title": "How America Failed in Afghanistan", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fmedia.newyorker.com%2Fphotos%2F6119484157b611aec9c99b43%2F16%3A9%2Fw_1280%2Cc_limit%2FChotiner-Afghanistan01.jpg", + "publisher": "The New Yorker", + "timeToRead": 14 + }, + { + "category": "general", + "url": "https://www.technologyreview.com/2021/08/15/1031804/digital-beauty-filters-photoshop-photo-editing-colorism-racism/", + "title": "How digital beauty filters perpetuate colorism", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fwp.technologyreview.com%2Fwp-content%2Fuploads%2F2021%2F08%2FBeautyScoreColorism.jpg%3Fresize%3D1200%2C600", + "publisher": "MIT Technology Review", + "timeToRead": 11 + }, + { + "category": "general", + "url": "https://getpocket.com/explore/item/how-to-get-rid-of-black-mold-naturally", + "title": "How to Get Rid of Black Mold Naturally", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fpocket-syndicated-images.s3.amazonaws.com%252Farticles%252F6757%252F1628024495_6109ae86db6cc.png", + "publisher": "Pocket", + "timeToRead": 4 + } + ] } diff --git a/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/story_recommendation_response.json b/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/story_recommendation_response.json index 8fa6e33ad7..99b6ef44d0 100644 --- a/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/story_recommendation_response.json +++ b/mobile/android/android-components/components/service/pocket/src/test/resources/pocket/story_recommendation_response.json @@ -1,12 +1,12 @@ { - "recommendations": [ - { - "category": "science", - "url": "https://getpocket.com/explore/item/you-think-you-know-what-blue-is-but-you-have-no-idea", - "title": "You Think You Know What Blue Is, But You Have No Idea", - "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fpocket-syndicated-images.s3.amazonaws.com%252Farticles%252F3713%252F1584373694_GettyImages-83522858.jpg", - "publisher": "Pocket", - "timeToRead": 3 - } - ] + "recommendations": [ + { + "category": "science", + "url": "https://getpocket.com/explore/item/you-think-you-know-what-blue-is-but-you-have-no-idea", + "title": "You Think You Know What Blue Is, But You Have No Idea", + "imageUrl": "https://img-getpocket.cdn.mozilla.net/{wh}/filters:format(jpeg):quality(60):no_upscale():strip_exif()/https%3A%2F%2Fpocket-image-cache.com%2F1200x%2Ffilters%3Aformat(jpg)%3Aextract_focal()%2Fhttps%253A%252F%252Fpocket-syndicated-images.s3.amazonaws.com%252Farticles%252F3713%252F1584373694_GettyImages-83522858.jpg", + "publisher": "Pocket", + "timeToRead": 3 + } + ] } diff --git a/mobile/android/android-components/components/service/sync-logins/src/main/java/mozilla/components/service/sync/logins/GeckoLoginStorageDelegate.kt b/mobile/android/android-components/components/service/sync-logins/src/main/java/mozilla/components/service/sync/logins/GeckoLoginStorageDelegate.kt index 892930e28d..f66b727cf1 100644 --- a/mobile/android/android-components/components/service/sync-logins/src/main/java/mozilla/components/service/sync/logins/GeckoLoginStorageDelegate.kt +++ b/mobile/android/android-components/components/service/sync-logins/src/main/java/mozilla/components/service/sync/logins/GeckoLoginStorageDelegate.kt @@ -4,6 +4,7 @@ package mozilla.components.service.sync.logins +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers @@ -42,10 +43,15 @@ import mozilla.components.concept.storage.LoginsStorage * what the result of the operation will be: saving a new login, * updating an existing login, or filling in a blank username. * - If the user accepts: GV calls [onLoginSave] with the [LoginEntry] + * + * @param loginStorage The [LoginsStorage] used for looking up saved credentials to autofill. + * @param scope [CoroutineScope] for long running operations. Defaults to using the [Dispatchers.IO]. + * @param isLoginAutofillEnabled callback allowing to limit [loginStorage] operations if autofill is disabled. */ class GeckoLoginStorageDelegate( private val loginStorage: Lazy<LoginsStorage>, private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO), + private val isLoginAutofillEnabled: () -> Boolean = { false }, ) : LoginStorageDelegate { override fun onLoginUsed(login: Login) { @@ -55,6 +61,9 @@ class GeckoLoginStorageDelegate( } override fun onLoginFetch(domain: String): Deferred<List<Login>> { + if (!isLoginAutofillEnabled()) { + return CompletableDeferred(listOf()) + } return scope.async { loginStorage.value.getByBaseDomain(domain) } diff --git a/mobile/android/android-components/components/support/base/build.gradle b/mobile/android/android-components/components/support/base/build.gradle index 76918b4c21..bc7bffa7e7 100644 --- a/mobile/android/android-components/components/support/base/build.gradle +++ b/mobile/android/android-components/components/support/base/build.gradle @@ -74,6 +74,7 @@ android { dependencies { implementation ComponentsDependencies.kotlin_coroutines + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.androidx_lifecycle_viewmodel api project(":concept-base") diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/BuildVersionProvider.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/BuildVersionProvider.kt new file mode 100644 index 0000000000..406e851049 --- /dev/null +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/BuildVersionProvider.kt @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.support.base.android + +import android.os.Build + +/** + * This class provides information about the build version without exposing the android framework + * APIs directly, making it easier to test the code that depends on it. + */ +interface BuildVersionProvider { + + /** + * Returns the SDK_INT of the current build version. + */ + fun sdkInt(): Int + + companion object { + const val FOREGROUND_SERVICE_RESTRICTIONS_STARTING_VERSION = Build.VERSION_CODES.S + } +} + +/** + * @see BuildVersionProvider + */ +class DefaultBuildVersionProvider : BuildVersionProvider { + + override fun sdkInt(): Int = Build.VERSION.SDK_INT +} diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/PowerManagerInfoProvider.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/PowerManagerInfoProvider.kt new file mode 100644 index 0000000000..0d8a78efb3 --- /dev/null +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/PowerManagerInfoProvider.kt @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.support.base.android + +import android.content.Context +import android.os.Build +import android.os.PowerManager +import androidx.core.content.ContextCompat + +/** + * This class provides information about battery optimisations without exposing the android + * framework APIs directly, making it easier to test the code that depends on it. + */ +interface PowerManagerInfoProvider { + + /** + * Returns true if the user has disabled battery optimisations for the app. + */ + fun isIgnoringBatteryOptimizations(): Boolean +} + +/** + * @see PowerManagerInfoProvider + */ +class DefaultPowerManagerInfoProvider(private val context: Context) : PowerManagerInfoProvider { + + private val powerManager by lazy { + ContextCompat.getSystemService(context, PowerManager::class.java) + } + + override fun isIgnoringBatteryOptimizations(): Boolean = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + powerManager?.isIgnoringBatteryOptimizations(context.packageName) ?: false + } else { + true + } +} diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/ProcessInfoProvider.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/ProcessInfoProvider.kt new file mode 100644 index 0000000000..2890b8c4c4 --- /dev/null +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/ProcessInfoProvider.kt @@ -0,0 +1,32 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.support.base.android + +import android.app.ActivityManager + +/** + * This class provides information the running app process without exposing the android framework + * APIs directly, making easier to test the code that depends on it. + */ +interface ProcessInfoProvider { + + /** + * Returns true if the current app process is in the foreground. + */ + fun isForegroundImportance(): Boolean +} + +/** + * @see ProcessInfoProvider + */ +class DefaultProcessInfoProvider : ProcessInfoProvider { + + override fun isForegroundImportance(): Boolean { + val appProcessInfo = ActivityManager.RunningAppProcessInfo() + ActivityManager.getMyMemoryState(appProcessInfo) + + return appProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND + } +} diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/StartForegroundService.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/StartForegroundService.kt new file mode 100644 index 0000000000..9bfa946205 --- /dev/null +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/android/StartForegroundService.kt @@ -0,0 +1,41 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.support.base.android + +/** + * This class is used to start a foreground service safely. For api levels >= 31. It will only + * start the service if the app is in the foreground to prevent throwing the + * ForegroundServiceStartNotAllowedException. + * + * @param processInfoProvider The provider to check if the app is in the foreground. + * @param buildVersionProvider The provider to get the sdk version. + */ +class StartForegroundService( + private val processInfoProvider: ProcessInfoProvider = DefaultProcessInfoProvider(), + private val buildVersionProvider: BuildVersionProvider = DefaultBuildVersionProvider(), + private val powerManagerInfoProvider: PowerManagerInfoProvider, +) { + + /** + * @see StartForegroundService + * + * @param func The function to run if the app is in the foreground to follow the foreground + * service restrictions for sdk version >= 31. For lower versions, the function will always run. + */ + operator fun invoke(func: () -> Unit): Boolean = + if (buildVersionProvider.sdkInt() >= BuildVersionProvider.FOREGROUND_SERVICE_RESTRICTIONS_STARTING_VERSION) { + if (powerManagerInfoProvider.isIgnoringBatteryOptimizations() || + processInfoProvider.isForegroundImportance() + ) { + func() + true + } else { + false + } + } else { + func() + true + } +} diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/UserInteractionHandler.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/UserInteractionHandler.kt index 25e16ffcce..f52b19b93c 100644 --- a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/UserInteractionHandler.kt +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/UserInteractionHandler.kt @@ -19,6 +19,13 @@ interface UserInteractionHandler { fun onBackPressed(): Boolean /** + * Called when this [UserInteractionHandler] gets the option to handle the user pressing the forward key. + * + * Returns true if this [UserInteractionHandler] consumed the event and no other components need to be notified. + */ + fun onForwardPressed(): Boolean = false + + /** * In most cases, when the home button is pressed, we invoke this callback to inform the app that the user * is going to leave the app. * diff --git a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapper.kt b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapper.kt index a6d1e8709c..02a48abdab 100644 --- a/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapper.kt +++ b/mobile/android/android-components/components/support/base/src/main/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapper.kt @@ -157,6 +157,24 @@ class ViewBoundFeatureWrapper<T : LifecycleAwareFeature>() { } /** + * Convenience method for invoking [UserInteractionHandler.onForwardPressed] on a wrapped + * [LifecycleAwareFeature] that implements [UserInteractionHandler]. Returns false if + * the [LifecycleAwareFeature] was cleared already. + */ + @Synchronized + fun onForwardPressed(): Boolean { + val feature = feature ?: return false + + if (feature !is UserInteractionHandler) { + throw IllegalAccessError( + "Feature does not implement ${UserInteractionHandler::class.java.simpleName} interface", + ) + } + + return feature.onForwardPressed() + } + + /** * Convenience method for invoking [ActivityResultHandler.onActivityResult] on a wrapped * [LifecycleAwareFeature] that implements [ActivityResultHandler]. Returns false if * the [LifecycleAwareFeature] was cleared already. diff --git a/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/android/StartForegroundServiceTest.kt b/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/android/StartForegroundServiceTest.kt new file mode 100644 index 0000000000..b583ed055c --- /dev/null +++ b/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/android/StartForegroundServiceTest.kt @@ -0,0 +1,98 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package mozilla.components.support.base.android + +import android.os.Build +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class StartForegroundServiceTest { + + @Test + fun `WHEN build version below S THEN start foreground service should return true regardless of foreground importance`() { + val tested = StartForegroundService( + FakeProcessInfoProvider(false), + FakeBuildVersionProvider(Build.VERSION_CODES.P), + FakePowerManagerInfoProvider(false), + ) + + var isInvoked = false + val actual = tested.invoke { + isInvoked = true + } + val expected = true + + assertEquals(expected, actual) + assertTrue(isInvoked) + } + + @Test + fun `WHEN build version is S and above and foreground importance is false THEN start foreground service should return false`() { + val tested = StartForegroundService( + FakeProcessInfoProvider(false), + FakeBuildVersionProvider(Build.VERSION_CODES.S), + FakePowerManagerInfoProvider(false), + ) + + var isInvoked = false + val actual = tested.invoke { + isInvoked = true + } + + assertFalse(actual) + assertFalse(isInvoked) + } + + @Test + fun `WHEN build version is S and above and foreground importance is true THEN start foreground service should return true`() { + val tested = StartForegroundService( + FakeProcessInfoProvider(true), + FakeBuildVersionProvider(Build.VERSION_CODES.S), + FakePowerManagerInfoProvider(false), + ) + + var isInvoked = false + val actual = tested.invoke { + isInvoked = true + } + + assertTrue(actual) + assertTrue(isInvoked) + } + + @Test + fun `WHEN build version is S, foreground importance is false and battery optimisations are disabled THEN start foreground service should return true`() { + val tested = StartForegroundService( + FakeProcessInfoProvider(false), + FakeBuildVersionProvider(Build.VERSION_CODES.S), + FakePowerManagerInfoProvider(true), + ) + + var isInvoked = true + val actual = tested.invoke { + isInvoked = true + } + + assertTrue(actual) + assertTrue(isInvoked) + } + + class FakeProcessInfoProvider(private val isForegroundImportance: Boolean) : + ProcessInfoProvider { + override fun isForegroundImportance(): Boolean = isForegroundImportance + } + + class FakeBuildVersionProvider(private val sdkInt: Int) : BuildVersionProvider { + override fun sdkInt(): Int = sdkInt + } + + class FakePowerManagerInfoProvider( + private val isIgnoringBatteryOptimizations: Boolean, + ) : PowerManagerInfoProvider { + override fun isIgnoringBatteryOptimizations(): Boolean = isIgnoringBatteryOptimizations + } +} diff --git a/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapperTest.kt b/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapperTest.kt index a07364acc2..73c71caec8 100644 --- a/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapperTest.kt +++ b/mobile/android/android-components/components/support/base/src/test/java/mozilla/components/support/base/feature/ViewBoundFeatureWrapperTest.kt @@ -61,6 +61,34 @@ class ViewBoundFeatureWrapperTest { } @Test + fun `Calling onForwardPressed on an empty wrapper returns false`() { + val wrapper = ViewBoundFeatureWrapper<MockFeature>() + assertFalse(wrapper.onForwardPressed()) + } + + @Test + fun `onForwardPressed is forwarded to feature`() { + val feature = MockFeatureWithUserInteractionHandler(onForwardPressed = true) + + val wrapper = ViewBoundFeatureWrapper( + feature = feature, + owner = MockedLifecycleOwner(MockedLifecycle(Lifecycle.State.CREATED)), + view = mock(), + ) + + assertTrue(wrapper.onForwardPressed()) + assertTrue(feature.onForwardPressedInvoked) + + assertFalse( + ViewBoundFeatureWrapper( + feature = MockFeatureWithUserInteractionHandler(onForwardPressed = false), + owner = MockedLifecycleOwner(MockedLifecycle(Lifecycle.State.CREATED)), + view = mock(), + ).onForwardPressed(), + ) + } + + @Test fun `Calling onActivityResult on an empty wrapper returns false`() { val wrapper = ViewBoundFeatureWrapper<MockFeature>() assertFalse(wrapper.onActivityResult(0, mock(), RESULT_OK)) @@ -350,6 +378,19 @@ class ViewBoundFeatureWrapperTest { wrapper.onBackPressed() } + @Test(expected = IllegalAccessError::class) + fun `onForwardPressed throws if feature does not implement ForwardHandler`() { + val feature = MockFeature() + + val wrapper = ViewBoundFeatureWrapper( + feature = feature, + owner = MockedLifecycleOwner(MockedLifecycle(Lifecycle.State.CREATED)), + view = mock(), + ) + + wrapper.onForwardPressed() + } + @Test fun `Setting a feature clears a previously existing feature`() { val feature = MockFeature() @@ -434,6 +475,7 @@ private open class MockFeature : LifecycleAwareFeature { private class MockFeatureWithUserInteractionHandler( private val onBackPressed: Boolean = false, + private val onForwardPressed: Boolean = false, ) : MockFeature(), UserInteractionHandler { var onBackPressedInvoked = false private set @@ -442,6 +484,14 @@ private class MockFeatureWithUserInteractionHandler( onBackPressedInvoked = true return onBackPressed } + + var onForwardPressedInvoked = false + private set + + override fun onForwardPressed(): Boolean { + onForwardPressedInvoked = true + return onForwardPressed + } } private class MockFeatureWithActivityResultHandler( diff --git a/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/android/view/View.kt b/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/android/view/View.kt index 625eae2c96..1efbb4db83 100644 --- a/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/android/view/View.kt +++ b/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/android/view/View.kt @@ -13,7 +13,6 @@ import android.view.ViewTreeObserver import android.view.inputmethod.InputMethodManager import androidx.annotation.MainThread import androidx.core.content.getSystemService -import androidx.core.view.ViewCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel @@ -25,13 +24,13 @@ import java.lang.ref.WeakReference * Is the horizontal layout direction of this view from Right to Left? */ val View.isRTL: Boolean - get() = layoutDirection == ViewCompat.LAYOUT_DIRECTION_RTL + get() = layoutDirection == View.LAYOUT_DIRECTION_RTL /** * Is the horizontal layout direction of this view from Left to Right? */ val View.isLTR: Boolean - get() = layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR + get() = layoutDirection == View.LAYOUT_DIRECTION_LTR /** * Tries to focus this view and show the soft input window for it. diff --git a/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt b/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt index abcd1a741c..8b20bfd1e5 100644 --- a/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt +++ b/mobile/android/android-components/components/support/ktx/src/main/java/mozilla/components/support/ktx/kotlin/String.kt @@ -307,7 +307,16 @@ fun String.sanitizeFileName(): String { file.name.replace("\\.\\.+".toRegex(), ".") } else { file.name.replace(".", "") - } + }.replaceEscapedCharacters() +} + +/** + * Replaces control characters from ASCII 0 to ASCII 19 with '_' so the file name is valid + * and is correctly displayed. + */ +private fun String.replaceEscapedCharacters(): String { + val controlCharactersRegex = "[\\x00-\\x13]".toRegex() + return replace(controlCharactersRegex, "_") } /** @@ -330,6 +339,15 @@ fun String.urlEncode(): String { } /** + * Decodes '%'-escaped octets in the given string using the UTF-8 scheme. + * Replaces invalid octets with the unicode replacement character + * ("\\uFFFD"). + * + * @see [Uri.decode] + */ +fun String.decode(): String = Uri.decode(this) + +/** * Returns the string if it's length is not higher than @param[maximumLength] or * a @param[replacement] string if String length is higher than @param[maximumLength] */ diff --git a/mobile/android/android-components/components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt b/mobile/android/android-components/components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt index 89ade2aace..eaa9e78c9a 100644 --- a/mobile/android/android-components/components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt +++ b/mobile/android/android-components/components/support/ktx/src/test/java/mozilla/components/support/ktx/kotlin/StringTest.kt @@ -181,24 +181,80 @@ class StringTest { @Test fun sanitizeFileName() { - var file = "/../../../../../../../../../../directory/file.......txt" - val fileName = "file.txt" - - assertEquals(fileName, file.sanitizeFileName()) - - file = "/root/directory/file.txt" - - assertEquals(fileName, file.sanitizeFileName()) - - assertEquals("file", "file".sanitizeFileName()) - - assertEquals("file", "file..".sanitizeFileName()) - - assertEquals("file", "file.".sanitizeFileName()) + val testCases = listOf( + "/../../../../../../../../../../directory/file.......txt" to "file.txt", + "/root/directory/file.txt" to "file.txt", + "file" to "file", + "file.." to "file", + "file." to "file", + ".file" to "file", + "test.2020.12.01.txt" to "test.2020.12.01.txt", + "\u0000filename" to "_filename", + "file\u0001name" to "file_name", + "data\u0002stream" to "data_stream", + "end\u0003text" to "end_text", + "trans\u0004mission" to "trans_mission", + "query\u0005result" to "query_result", + "acknowledge\u0006signal" to "acknowledge_signal", + "bell\u0007sound" to "bell_sound", + "back\u0008space" to "back_space", + "horizontal\u0009tab" to "horizontal_tab", + "new\u000Aline" to "new_line", + "vertical\u000Btab" to "vertical_tab", + "form\u000Cfeed" to "form_feed", + "return\u000Dcarriage" to "return_carriage", + "shift\u000Eout" to "shift_out", + "shift\u000Fin" to "shift_in", + "escape\u0010data" to "escape_data", + "device\u0011control1" to "device_control1", + "device\u0012control2" to "device_control2", + "device\u0013control3" to "device_control3", + ) - assertEquals("file", ".file".sanitizeFileName()) + testCases.forEach { (raw, escaped) -> + assertEquals(escaped, raw.sanitizeFileName()) + } + } + + @Test + fun `WHEN a string contains utf 8 encoded characters decode decodes it`() { + // List of pairs of encoded strings and their expected decoded results + val testCases = listOf( + "hello%20world" to "hello world", + "wow%21amazing" to "wow!amazing", + "quote%22here%22" to "quote\"here\"", + "hash%23tag" to "hash#tag", + "save%24money" to "save\$money", + "100%25complete" to "100%complete", + "you%26me" to "you&me", + "it%27s%20easy" to "it's easy", + "open%28now%29" to "open(now)", + "star%2Ashine" to "star*shine", + "add%2Bmore" to "add+more", + "comma%2Cseparated" to "comma,separated", + "dash%2Dbetween" to "dash-between", + "end%2Eperiod" to "end.period", + "path%2Fto%2Ffile" to "path/to/file", + "time%3A12%3A00" to "time:12:00", + "wait%3Bplease" to "wait;please", + "less%3Cthan" to "less<than", + "equals%3Dsign" to "equals=sign", + "greater%3Ethan" to "greater>than", + "what%3Fwhere" to "what?where", + "email%40domain.com" to "email@domain.com", + "bracket%5Bopen%5D" to "bracket[open]", + "escape%5Cbackslash" to "escape\\backslash", + "bracket%5Dclose%5D" to "bracket]close]", + "high%5Efive" to "high^five", + "accent%60grave" to "accent`grave", + "brace%7Bopenclose%7D" to "brace{openclose}", + "pipe%7Csymbol" to "pipe|symbol", + "tilde%7Ewave" to "tilde~wave", + ) - assertEquals("test.2020.12.01.txt", "test.2020.12.01.txt".sanitizeFileName()) + testCases.forEach { (encoded, decoded) -> + assertEquals(decoded, encoded.decode()) + } } @Test diff --git a/mobile/android/android-components/components/support/webextensions/src/main/java/mozilla/components/support/webextensions/WebExtensionSupport.kt b/mobile/android/android-components/components/support/webextensions/src/main/java/mozilla/components/support/webextensions/WebExtensionSupport.kt index b4b78d6272..3945a2fd06 100644 --- a/mobile/android/android-components/components/support/webextensions/src/main/java/mozilla/components/support/webextensions/WebExtensionSupport.kt +++ b/mobile/android/android-components/components/support/webextensions/src/main/java/mozilla/components/support/webextensions/WebExtensionSupport.kt @@ -269,6 +269,10 @@ object WebExtensionSupport { store.dispatch(WebExtensionAction.UpdateWebExtensionEnabledAction(extension.id, true)) } + override fun onOptionalPermissionsChanged(extension: WebExtension) { + installedExtensions[extension.id] = extension + } + override fun onDisabled(extension: WebExtension) { installedExtensions[extension.id] = extension store.dispatch(WebExtensionAction.UpdateWebExtensionEnabledAction(extension.id, false)) diff --git a/mobile/android/android-components/components/support/webextensions/src/test/java/mozilla/components/support/webextensions/WebExtensionSupportTest.kt b/mobile/android/android-components/components/support/webextensions/src/test/java/mozilla/components/support/webextensions/WebExtensionSupportTest.kt index b4e45b3f55..ec61832cef 100644 --- a/mobile/android/android-components/components/support/webextensions/src/test/java/mozilla/components/support/webextensions/WebExtensionSupportTest.kt +++ b/mobile/android/android-components/components/support/webextensions/src/test/java/mozilla/components/support/webextensions/WebExtensionSupportTest.kt @@ -598,6 +598,25 @@ class WebExtensionSupportTest { } @Test + fun `reacts to optional permissions for an extension being changed`() { + val store = spy(BrowserStore()) + val engine: Engine = mock() + val ext: WebExtension = mock() + whenever(ext.id).thenReturn("extensionId") + whenever(ext.url).thenReturn("url") + + val delegateCaptor = argumentCaptor<WebExtensionDelegate>() + WebExtensionSupport.initialize(engine, store) + verify(engine).registerWebExtensionDelegate(delegateCaptor.capture()) + + assertNull(WebExtensionSupport.installedExtensions[ext.id]) + + delegateCaptor.value.onOptionalPermissionsChanged(ext) + + assertEquals(ext, WebExtensionSupport.installedExtensions[ext.id]) + } + + @Test fun `observes store and registers handlers on new engine sessions`() { val tab = createTab(id = "1", url = "https://www.mozilla.org") val customTab = createCustomTab(id = "2", url = "https://www.mozilla.org", source = SessionState.Source.Internal.CustomTab) diff --git a/mobile/android/android-components/components/ui/autocomplete/src/main/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditText.kt b/mobile/android/android-components/components/ui/autocomplete/src/main/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditText.kt index c029f226eb..1ae1fe739a 100644 --- a/mobile/android/android-components/components/ui/autocomplete/src/main/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditText.kt +++ b/mobile/android/android-components/components/ui/autocomplete/src/main/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditText.kt @@ -182,7 +182,7 @@ open class InlineAutocompleteEditText @JvmOverloads constructor( return false } - if (keyCode == KeyEvent.KEYCODE_ENTER) { + if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER) { // If the edit text has a composition string, don't submit the text yet. // ENTER is needed to commit the composition string. val content = text @@ -201,7 +201,7 @@ open class InlineAutocompleteEditText @JvmOverloads constructor( } private val onKey = fun (_: View, keyCode: Int, event: KeyEvent): Boolean { - if (keyCode == KeyEvent.KEYCODE_ENTER) { + if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER) { if (event.action != KeyEvent.ACTION_DOWN) { return true } diff --git a/mobile/android/android-components/components/ui/autocomplete/src/test/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditTextTest.kt b/mobile/android/android-components/components/ui/autocomplete/src/test/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditTextTest.kt index d455b0a28e..bf519e81a1 100644 --- a/mobile/android/android-components/components/ui/autocomplete/src/test/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditTextTest.kt +++ b/mobile/android/android-components/components/ui/autocomplete/src/test/java/mozilla/components/ui/autocomplete/InlineAutocompleteEditTextTest.kt @@ -101,8 +101,8 @@ class InlineAutocompleteEditTextTest { doReturn(false).`when`(et).isShown doReturn(mock(ViewParent::class.java)).`when`(et).parent - val event = AccessibilityEvent() - event.eventType = AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED + val event = mock<AccessibilityEvent>() + doReturn(AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED).`when`(event).eventType et.sendAccessibilityEventUnchecked(event) verify(et).onInitializeAccessibilityEvent(event) @@ -227,6 +227,17 @@ class InlineAutocompleteEditTextTest { } @Test + fun `onCommitListenerInvocation with Numpad ENTER`() { + val et = InlineAutocompleteEditText(testContext, attributes) + var invoked = false + et.setOnCommitListener { invoked = true } + et.onAttachedToWindow() + + et.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_NUMPAD_ENTER)) + assertTrue(invoked) + } + + @Test fun onTextChangeListenerInvocation() { val et = InlineAutocompleteEditText(testContext, attributes) var invokedWithParams: List<Any>? = null diff --git a/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_20.xml b/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_20.xml index b6ce9a33e8..8c6fc9b212 100644 --- a/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_20.xml +++ b/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_20.xml @@ -2,16 +2,14 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20"> <path - android:fillColor="?mozac_ic_private_mode_circle_fill_background_color" - android:pathData="M10,18c-4.411,0 -8,-3.589 -8,-8s3.589,-8 8,-8 8,3.589 8,8 -3.589,8 -8,8z" /> + android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M7.5,11.148c0.558,0 1.054,-0.25 1.374,-0.637a0.586,0.586 0,0 0,0 -0.726A1.775,1.775 0,0 0,7.5 9.148c-0.558,0 -1.054,0.249 -1.374,0.636a0.587,0.587 0,0 0,0 0.727c0.32,0.388 0.816,0.637 1.374,0.637zM12.5,11.148c0.558,0 1.054,-0.25 1.374,-0.637a0.587,0.587 0,0 0,0 -0.727,1.775 1.775,0 0,0 -1.374,-0.637c-0.558,0 -1.054,0.25 -1.374,0.637a0.587,0.587 0,0 0,0 0.727c0.32,0.388 0.816,0.637 1.374,0.637z" /> <path - android:fillColor="?mozac_ic_private_mode_circle_fill_icon_color" - android:pathData="M14.957,8.51a1.02,1.02 0,0 0,-0.793 -1.046,3.714 3.714,0 0,0 -3.351,0.902l-0.154,0.143a0.968,0.968 0,0 1,-1.321 0l-0.15,-0.14a3.712,3.712 0,0 0,-3.354 -0.905c-0.482,0.11 -0.817,0.549 -0.794,1.043v0.003c-0.123,0.488 0.067,2.287 0.175,2.571 0.217,1.144 1.152,2.004 2.272,2.004 0.56,0 1.066,-0.223 1.467,-0.581l0.244,-0.209a1.219,1.219 0,0 1,1.57 -0.012l0.366,0.303v-0.002c0.386,0.31 0.859,0.5 1.377,0.5 1.12,0 2.055,-0.86 2.272,-2.004 0.107,-0.283 0.304,-2.075 0.174,-2.57zM8.874,10.511c-0.32,0.387 -0.816,0.637 -1.374,0.637a1.775,1.775 0,0 1,-1.374 -0.637,0.587 0.587,0 0,1 0,-0.727c0.32,-0.387 0.816,-0.636 1.374,-0.636 0.558,0 1.054,0.249 1.374,0.637a0.586,0.586 0,0 1,0 0.726zM13.874,10.511c-0.32,0.387 -0.816,0.637 -1.374,0.637a1.775,1.775 0,0 1,-1.374 -0.637,0.587 0.587,0 0,1 0,-0.727c0.32,-0.387 0.816,-0.637 1.374,-0.637 0.558,0 1.054,0.249 1.374,0.637a0.587,0.587 0,0 1,0 0.727z" - tools:ignore="VectorPath" /> + android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M2,10c0,4.411 3.589,8 8,8s8,-3.589 8,-8 -3.589,-8 -8,-8 -8,3.589 -8,8zM14.164,7.464c0.483,0.109 0.818,0.551 0.793,1.046 0.13,0.495 -0.067,2.287 -0.174,2.57 -0.217,1.144 -1.152,2.004 -2.272,2.004a2.19,2.19 0,0 1,-1.377 -0.5v0.002l-0.366,-0.303a1.219,1.219 0,0 0,-1.57 0.012l-0.244,0.209a2.194,2.194 0,0 1,-1.467 0.58c-1.12,0 -2.055,-0.86 -2.272,-2.003 -0.108,-0.284 -0.298,-2.083 -0.175,-2.571v-0.003a1.022,1.022 0,0 1,0.794 -1.043,3.712 3.712,0 0,1 3.354,0.905l0.15,0.14a0.972,0.972 0,0 0,1.321 0l0.154,-0.143a3.714,3.714 0,0 1,3.351 -0.902z" /> </vector> diff --git a/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_24.xml b/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_24.xml index bcb350e8fd..995a646e66 100644 --- a/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_24.xml +++ b/mobile/android/android-components/components/ui/icons/src/main/res/drawable/mozac_ic_private_mode_circle_fill_24.xml @@ -2,16 +2,14 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path - android:fillColor="?mozac_ic_private_mode_circle_fill_background_color" - android:pathData="M12,22C6.486,22 2,17.514 2,12S6.486,2 12,2s10,4.486 10,10 -4.486,10 -10,10z" /> + android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M9,13.267c0.65,0 1.23,-0.291 1.603,-0.743a0.685,0.685 0,0 0,0 -0.848A2.072,2.072 0,0 0,9 10.933c-0.651,0 -1.23,0.291 -1.603,0.743a0.685,0.685 0,0 0,0 0.848c0.373,0.452 0.952,0.743 1.603,0.743zM15,13.267c0.651,0 1.23,-0.291 1.603,-0.743a0.685,0.685 0,0 0,0 -0.848A2.072,2.072 0,0 0,15 10.933c-0.651,0 -1.23,0.291 -1.603,0.743a0.685,0.685 0,0 0,0 0.848c0.373,0.452 0.952,0.743 1.603,0.743z" /> <path - android:fillColor="?mozac_ic_private_mode_circle_fill_icon_color" - android:pathData="M18.196,10.053a1.275,1.275 0,0 0,-0.992 -1.308,4.642 4.642,0 0,0 -4.189,1.127l-0.192,0.179a1.208,1.208 0,0 1,-1.651 -0.001l-0.188,-0.175a4.643,4.643 0,0 0,-4.192 -1.13,1.277 1.277,0 0,0 -0.992,1.304v0.004c-0.154,0.609 0.084,2.859 0.219,3.213 0.271,1.429 1.439,2.505 2.84,2.505 0.699,0 1.332,-0.279 1.833,-0.726l0.305,-0.261a1.524,1.524 0,0 1,1.962 -0.016l0.458,0.379v-0.002a2.734,2.734 0,0 0,1.72 0.626c1.4,0 2.569,-1.075 2.841,-2.505 0.134,-0.354 0.38,-2.594 0.218,-3.213zM10.603,12.524A2.072,2.072 0,0 1,9 13.267c-0.651,0 -1.23,-0.291 -1.603,-0.743a0.685,0.685 0,0 1,0 -0.848A2.072,2.072 0,0 1,9 10.933c0.65,0 1.23,0.291 1.603,0.743a0.685,0.685 0,0 1,0 0.848zM16.603,12.524a2.072,2.072 0,0 1,-1.603 0.743c-0.651,0 -1.23,-0.291 -1.603,-0.743a0.685,0.685 0,0 1,0 -0.848A2.072,2.072 0,0 1,15 10.933c0.651,0 1.23,0.291 1.603,0.743a0.685,0.685 0,0 1,0 0.848z" - tools:ignore="VectorPath" /> + android:fillColor="@color/mozac_ui_icons_fill" + android:pathData="M2,12c0,5.514 4.486,10 10,10s10,-4.486 10,-10S17.514,2 12,2 2,6.486 2,12zM17.204,8.745c0.605,0.137 1.023,0.689 0.992,1.308 0.163,0.619 -0.084,2.859 -0.218,3.213 -0.272,1.43 -1.44,2.505 -2.84,2.505a2.733,2.733 0,0 1,-1.721 -0.626v0.002l-0.458,-0.379a1.524,1.524 0,0 0,-1.962 0.016l-0.305,0.261c-0.501,0.447 -1.134,0.726 -1.833,0.726 -1.401,0 -2.569,-1.076 -2.84,-2.505 -0.135,-0.354 -0.373,-2.604 -0.22,-3.213v-0.004a1.277,1.277 0,0 1,0.993 -1.304,4.643 4.643,0 0,1 4.192,1.13l0.188,0.175a1.21,1.21 0,0 0,1.651 0.001l0.192,-0.179a4.642,4.642 0,0 1,4.189 -1.127z" /> </vector> diff --git a/mobile/android/android-components/components/ui/icons/src/main/res/values/attrs.xml b/mobile/android/android-components/components/ui/icons/src/main/res/values/attrs.xml index c41244c9c1..3fa2851901 100644 --- a/mobile/android/android-components/components/ui/icons/src/main/res/values/attrs.xml +++ b/mobile/android/android-components/components/ui/icons/src/main/res/values/attrs.xml @@ -3,10 +3,8 @@ - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <resources> - <!-- Background color for mozac_ic_private_mode_circle_fill_20, - mozac_ic_private_mode_circle_fill_24 and mozac_ic_private_mode_circle_fill_48 --> + <!-- Background color for mozac_ic_private_mode_circle_fill_48 --> <attr name="mozac_ic_private_mode_circle_fill_background_color" format="reference" /> - <!-- Icon color for mozac_ic_private_mode_circle_fill_20, - mozac_ic_private_mode_circle_fill_24 and mozac_ic_private_mode_circle_fill_48 --> + <!-- Icon color for mozac_ic_private_mode_circle_fill_48 --> <attr name="mozac_ic_private_mode_circle_fill_icon_color" format="reference" /> </resources> diff --git a/mobile/android/android-components/components/ui/widgets/src/test/java/mozilla/components/ui/widgets/behavior/EngineViewScrollingBehaviorTest.kt b/mobile/android/android-components/components/ui/widgets/src/test/java/mozilla/components/ui/widgets/behavior/EngineViewScrollingBehaviorTest.kt index 0f0c10b71a..d00b657f10 100644 --- a/mobile/android/android-components/components/ui/widgets/src/test/java/mozilla/components/ui/widgets/behavior/EngineViewScrollingBehaviorTest.kt +++ b/mobile/android/android-components/components/ui/widgets/src/test/java/mozilla/components/ui/widgets/behavior/EngineViewScrollingBehaviorTest.kt @@ -534,7 +534,7 @@ class EngineViewScrollingBehaviorTest { } val behavior = spy(EngineViewScrollingBehavior(testContext, null, ViewPosition.BOTTOM)) - behavior.onLayoutChild(container, view, ViewCompat.LAYOUT_DIRECTION_LTR) + behavior.onLayoutChild(container, view, View.LAYOUT_DIRECTION_LTR) assertEquals(view, behavior.dynamicScrollView) assertEquals(engineView, behavior.engineView) diff --git a/mobile/android/android-components/config/detekt-baseline.xml b/mobile/android/android-components/config/detekt-baseline.xml index e779572390..1e583de30b 100644 --- a/mobile/android/android-components/config/detekt-baseline.xml +++ b/mobile/android/android-components/config/detekt-baseline.xml @@ -307,6 +307,7 @@ <ID>UndocumentedPublicFunction:Types.kt$fun AccountEvent.into(): mozilla.components.concept.sync.AccountEvent</ID> <ID>UndocumentedPublicFunction:Types.kt$fun Device.into(): mozilla.components.concept.sync.Device</ID> <ID>UndocumentedPublicFunction:Types.kt$fun IncomingDeviceCommand.TabReceived.into(): mozilla.components.concept.sync.DeviceCommandIncoming.TabReceived</ID> + <ID>UndocumentedPublicFunction:Types.kt$fun IncomingDeviceCommand.TabsClosed.into(): mozilla.components.concept.sync.DeviceCommandIncoming.TabsClosed</ID> <ID>UndocumentedPublicFunction:Types.kt$fun IncomingDeviceCommand.into(): mozilla.components.concept.sync.DeviceCommandIncoming</ID> <ID>UndocumentedPublicFunction:Types.kt$fun Profile.into(): mozilla.components.concept.sync.Profile</ID> <ID>UndocumentedPublicFunction:Types.kt$fun ScopedKey.into(): OAuthScopedKey</ID> diff --git a/mobile/android/android-components/docs/_includes/header.html b/mobile/android/android-components/docs/_includes/header.html index 7a989f7de9..b32fc0298d 100644 --- a/mobile/android/android-components/docs/_includes/header.html +++ b/mobile/android/android-components/docs/_includes/header.html @@ -2,22 +2,24 @@ <div class="wrapper"> <a class="site-title" rel="author" href="/">Mozilla Android Components</a> - <nav class="site-nav"> - <input type="checkbox" id="nav-trigger" class="nav-trigger" /> - <label for="nav-trigger"> - <span class="menu-icon"> - <svg viewBox="0 0 18 15" width="18px" height="15px"> - <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/> - </svg> - </span> - </label> + <nav class="site-nav"> + <input type="checkbox" id="nav-trigger" class="nav-trigger" /> + <label for="nav-trigger"> + <span class="menu-icon"> + <svg viewBox="0 0 18 15" width="18px" height="15px"> + <path + d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z" + /> + </svg> + </span> + </label> - <div class="trigger"> - <a class="page-link" href="/components/">Components</a> - <a class="page-link" href="/changelog/">Changelog</a> - <a class="page-link" href="/blog/">Blog</a> - <a class="page-link" href="/contributing/">Contributing</a> - </div> - </nav> + <div class="trigger"> + <a class="page-link" href="/components/">Components</a> + <a class="page-link" href="/changelog/">Changelog</a> + <a class="page-link" href="/blog/">Blog</a> + <a class="page-link" href="/contributing/">Contributing</a> + </div> + </nav> </div> </header> diff --git a/mobile/android/android-components/docs/_includes/post_detail.html b/mobile/android/android-components/docs/_includes/post_detail.html index bceb37d5bc..2cb5a8a9cd 100644 --- a/mobile/android/android-components/docs/_includes/post_detail.html +++ b/mobile/android/android-components/docs/_includes/post_detail.html @@ -1,16 +1,16 @@ <h1 class="entry-title"> - <!--<a href="{{ root_url }}{{ page.url }}">{{ page.title }}</a>--> + <!--<a href="{{ root_url }}{{ page.url }}">{{ page.title }}</a>--> </h1> <ul> - {% if post.title %} - <li> - {{ post.date | date: '%B %d, %Y' }} - <br/> - {% if post.external_url %} - <a href="{{ post.external_url }}">{{ post.title | escape }}</a> - {% else %} - <a href="{{ post.url | relative_url }}">{{ post.title | escape }}</a> - {% endif %} - </li> + {% if post.title %} + <li> + {{ post.date | date: '%B %d, %Y' }} + <br /> + {% if post.external_url %} + <a href="{{ post.external_url }}">{{ post.title | escape }}</a> + {% else %} + <a href="{{ post.url | relative_url }}">{{ post.title | escape }}</a> {% endif %} + </li> + {% endif %} </ul> diff --git a/mobile/android/android-components/docs/_layouts/post.html b/mobile/android/android-components/docs/_layouts/post.html index 29f841f336..cf3d23a3c5 100644 --- a/mobile/android/android-components/docs/_layouts/post.html +++ b/mobile/android/android-components/docs/_layouts/post.html @@ -1,38 +1,53 @@ --- layout: default --- -<article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting"> +<article + class="post h-entry" + itemscope + itemtype="http://schema.org/BlogPosting" +> <header class="post-header"> - <h1 class="post-title p-name" itemprop="name headline">{{ page.title | escape }}</h1> + <h1 class="post-title p-name" itemprop="name headline"> + {{ page.title | escape }} + </h1> <p class="post-meta"> - <time class="dt-published" datetime="{{ page.date | date_to_xmlschema }}" itemprop="datePublished"> - {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" -%} - {{ page.date | date: date_format }} + <time + class="dt-published" + datetime="{{ page.date | date_to_xmlschema }}" + itemprop="datePublished" + > + {%- assign date_format = site.minima.date_format | default: "%b %-d, %Y" + -%} {{ page.date | date: date_format }} </time> - {%- if page.author -%} - - - {% assign author = site.data.authors[page.author] %} - <span itemprop="author" itemscope itemtype="http://schema.org/Person"> - <span class="p-author h-card" itemprop="name"> - <img src="{{ author.image }}" width="20" height="20" style="margin:5px;" /> - {{ author.name }} - {%- if author.twitter -%} - <a href="{{ author.twitter }}"><svg class="svg-icon" style="margin-left:10px;"><use xlink:href="{{ '/assets/minima-social-icons.svg#twitter' | relative_url }}"></use></svg></a> - {%- endif -%} - </span> - </span> + {%- if page.author -%} - {% assign author = site.data.authors[page.author] + %} + <span itemprop="author" itemscope itemtype="http://schema.org/Person"> + <span class="p-author h-card" itemprop="name"> + <img + src="{{ author.image }}" + width="20" + height="20" + style="margin: 5px" + /> + {{ author.name }} {%- if author.twitter -%} + <a href="{{ author.twitter }}" + ><svg class="svg-icon" style="margin-left: 10px"> + <use + xlink:href="{{ '/assets/minima-social-icons.svg#twitter' | relative_url }}" + ></use></svg + ></a> + {%- endif -%} + </span> + </span> {%- endif -%} </p> </header> - <div class="post-content e-content" itemprop="articleBody"> - {{ content }} - </div> + <div class="post-content e-content" itemprop="articleBody">{{ content }}</div> - {%- if site.disqus.shortname -%} - {%- include disqus_comments.html -%} - {%- endif -%} + {%- if site.disqus.shortname -%} {%- include disqus_comments.html -%} {%- + endif -%} <a class="u-url" href="{{ page.url | relative_url }}" hidden></a> </article> diff --git a/mobile/android/android-components/docs/assets/js/icon-js.js b/mobile/android/android-components/docs/assets/js/icon-js.js index 6c5ca1a226..41ace3daf7 100644 --- a/mobile/android/android-components/docs/assets/js/icon-js.js +++ b/mobile/android/android-components/docs/assets/js/icon-js.js @@ -3,11 +3,11 @@ * @return {Element} */ function htmlToElement(html) { - let template = document.createElement('template'); - html = html.trim(); // Never return a text node of whitespace as the result - template.innerHTML = html; - //firstChild may be a comment so we must use firstElementChild to avoid picking it - return template.content.firstElementChild; + let template = document.createElement("template"); + html = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = html; + //firstChild may be a comment so we must use firstElementChild to avoid picking it + return template.content.firstElementChild; } /** @@ -17,81 +17,90 @@ function htmlToElement(html) { * @returns {String} The same string but in the standard SVG representation */ function androidSVGtoNormalSVG(s) { - s = s.replace(/<\?xml version="1\.0" encoding="utf-8"\?>/g, ''); - s = s.replace(/<vector xmlns:android="http:\/\/schemas.android.com\/apk\/res\/android"/g, '<svg xmlns="http://www.w3.org/2000/svg"'); - s = s.replace(/<\/vector>/g, '</svg>'); - s = s.replace(/android:(height|width)="(\d+)dp"/g, ''); - s = s.replace(/android:viewportHeight="(\d+\.?\d+)"/g, 'height="$1"'); - s = s.replace(/android:viewportWidth="(\d+\.?\d+)"/g, 'width="$1"'); - s = s.replace(/android:fillColor=/g, 'fill='); - s = s.replace(/android:pathData=/g, 'd='); - //s = s.replace(/android:/g, ''); - return s; + s = s.replace(/<\?xml version="1\.0" encoding="utf-8"\?>/g, ""); + s = s.replace( + /<vector xmlns:android="http:\/\/schemas.android.com\/apk\/res\/android"/g, + '<svg xmlns="http://www.w3.org/2000/svg"' + ); + s = s.replace(/<\/vector>/g, "</svg>"); + s = s.replace(/android:(height|width)="(\d+)dp"/g, ""); + s = s.replace(/android:viewportHeight="(\d+\.?\d+)"/g, 'height="$1"'); + s = s.replace(/android:viewportWidth="(\d+\.?\d+)"/g, 'width="$1"'); + s = s.replace(/android:fillColor=/g, "fill="); + s = s.replace(/android:pathData=/g, "d="); + //s = s.replace(/android:/g, ''); + return s; } function addToTable(name, svg) { - let table = document.querySelector("#preview_table > tbody"); - let row = htmlToElement("<tr></tr>"); - row.appendChild(htmlToElement("<td>" + name + "</td>")); - let td = htmlToElement("<td></td>"); - td.appendChild(svg); - row.appendChild(td); - table.appendChild(row); + let table = document.querySelector("#preview_table > tbody"); + let row = htmlToElement("<tr></tr>"); + row.appendChild(htmlToElement("<td>" + name + "</td>")); + let td = htmlToElement("<td></td>"); + td.appendChild(svg); + row.appendChild(td); + table.appendChild(row); } function addSingleItemToTable(str) { - let table = document.querySelector("#preview_table > tbody"); - table.append(htmlToElement("<tr><td colspan='2'>" + str + "</td></tr>")) + let table = document.querySelector("#preview_table > tbody"); + table.append(htmlToElement("<tr><td colspan='2'>" + str + "</td></tr>")); } function getFile(iconName, downloadUrl) { - return new Promise((resolve, reject) => { - let request = new XMLHttpRequest(); - request.open('GET', downloadUrl, true); - request.onreadystatechange = function () { - if (request.readyState === 4 && request.status === 200) { - let androidXmlText = request.responseText; - androidXmlText = androidSVGtoNormalSVG(androidXmlText); - resolve([iconName, androidXmlText]); - } else if (request.readyState === 4) { - //Request completed with an error - resolve([iconName, "<span>Error during download</span>"]); - } - }; - request.send(null); - }); - + return new Promise((resolve, reject) => { + let request = new XMLHttpRequest(); + request.open("GET", downloadUrl, true); + request.onreadystatechange = function () { + if (request.readyState === 4 && request.status === 200) { + let androidXmlText = request.responseText; + androidXmlText = androidSVGtoNormalSVG(androidXmlText); + resolve([iconName, androidXmlText]); + } else if (request.readyState === 4) { + //Request completed with an error + resolve([iconName, "<span>Error during download</span>"]); + } + }; + request.send(null); + }); } // This function recovers all icons inside the drawable folder via github API (function getIcons() { - let request = new XMLHttpRequest(); - request.open("GET", "https://api.github.com/repos/mozilla-mobile/android-components/contents/components/ui/icons/src/main/res/drawable", true); - //Explicit request of the V3 version of the API - request.setRequestHeader("Accept", "application/vnd.github.v3+json"); - request.onreadystatechange = function () { - if (request.readyState === XMLHttpRequest.DONE && request.status === 200) { - let response = JSON.parse(request.response); - if (response.message) { - //Something went wrong - addSingleItemToTable("Error: " + response.message); - return; - } - addSingleItemToTable("Loading"); - let promises = []; - for (let i = 0; i < response.length; i++) { - let iconName = response[i]['name'].substr(0, response[i]['name'].length - 4); - promises.push(getFile(iconName, response[i]['download_url'])); - } - Promise.all(promises).then((values) => { - document.querySelector("#preview_table > tbody").innerHTML = ""; - for (let i = 0; i < values.length; i++) { - let name = values[i][0], svg = values[i][1]; - addToTable(name, htmlToElement(svg)); - } - }); + let request = new XMLHttpRequest(); + request.open( + "GET", + "https://api.github.com/repos/mozilla-mobile/android-components/contents/components/ui/icons/src/main/res/drawable", + true + ); + //Explicit request of the V3 version of the API + request.setRequestHeader("Accept", "application/vnd.github.v3+json"); + request.onreadystatechange = function () { + if (request.readyState === XMLHttpRequest.DONE && request.status === 200) { + let response = JSON.parse(request.response); + if (response.message) { + //Something went wrong + addSingleItemToTable("Error: " + response.message); + return; + } + addSingleItemToTable("Loading"); + let promises = []; + for (let i = 0; i < response.length; i++) { + let iconName = response[i]["name"].substr( + 0, + response[i]["name"].length - 4 + ); + promises.push(getFile(iconName, response[i]["download_url"])); + } + Promise.all(promises).then(values => { + document.querySelector("#preview_table > tbody").innerHTML = ""; + for (let i = 0; i < values.length; i++) { + let name = values[i][0], + svg = values[i][1]; + addToTable(name, htmlToElement(svg)); } - }; - request.send(null); + }); + } + }; + request.send(null); })(); - diff --git a/mobile/android/android-components/docs/changelog.md b/mobile/android/android-components/docs/changelog.md index 6dce7f4966..d14bbca8c8 100644 --- a/mobile/android/android-components/docs/changelog.md +++ b/mobile/android/android-components/docs/changelog.md @@ -4,7 +4,32 @@ title: Changelog permalink: /changelog/ --- -# 126.0 (In Development) +# 127.0 (In Development) + +* **feature-prompts** **browser-storage-sync** + * A new `isLoginAutofillEnabled` callback is available in `PromptFeature` and `GeckoLoginStorageDelegate` to allow clients controlling whether saved logins should be autofilled or not. Default is false + +* **browser-state** + * Added `TabSessionState.getUrl()` extension function that will return the URL that could be + used for various features such as bookmarks or share regardless of the mode the browser is in (e.g. Reader mode). [Bug 1885628](https://bugzilla.mozilla.org/show_bug.cgi?id=1885628). + +* **support-base** + * Added `StartForegroundService` to safely start a foreground service, see [Bug 1839039](https://bugzilla.mozilla.org/show_bug.cgi?id=1839039) for crash reference. + * Added `ProcessInfoProvider` and `BuildVersionProvider` to get information about the app process and the build version. + +* **browser-engine-gecko** + * For screenshot capture, include exception in failure result rather than throwing. + +* **feature-accounts-push** + * 🆕 New `CloseTabsFeature` for closing tabs on this device from other devices that are signed to the same Mozilla account. + * 🆕 New `CloseTabsUseCase` for closing tabs on other devices from this device. + +* **concept-sync** + * 🆕 New `DeviceCapability.CLOSE_TABS` variant to indicate that a device supports closing synced tabs. + * 🆕 New `DeviceCommandIncoming.TabsClosed` variant to represent a "close synced tabs" command received from another device. + * 🆕 New `DeviceCommandOutgoing.CloseTab` variant to represent a "close synced tabs" sent to another device. + +# 126.0 * **browser-menu** * Added enabled state to `BrowserMenuImageText`, see [Bug 1884769](https://bugzilla.mozilla.org/show_bug.cgi?id=1884769). diff --git a/mobile/android/android-components/gradle/wrapper/gradle-wrapper.properties b/mobile/android/android-components/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f..23e87f9b0b 100644 --- a/mobile/android/android-components/gradle/wrapper/gradle-wrapper.properties +++ b/mobile/android/android-components/gradle/wrapper/gradle-wrapper.properties @@ -1,3 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip diff --git a/mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt b/mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt index 5476c263fe..bcac9abb74 100644 --- a/mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt +++ b/mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ // These lines are generated by android-components/automation/application-services-nightly-bump.py -val VERSION = "126.0" +val VERSION = "127.0" val CHANNEL = ApplicationServicesChannel.RELEASE object ApplicationServicesConfig { diff --git a/mobile/android/android-components/plugins/dependencies/src/main/java/DependenciesPlugin.kt b/mobile/android/android-components/plugins/dependencies/src/main/java/DependenciesPlugin.kt index 0dbc6cf837..17fe0dbeaf 100644 --- a/mobile/android/android-components/plugins/dependencies/src/main/java/DependenciesPlugin.kt +++ b/mobile/android/android-components/plugins/dependencies/src/main/java/DependenciesPlugin.kt @@ -6,7 +6,7 @@ import org.gradle.api.Plugin import org.gradle.api.initialization.Settings // If you ever need to force a toolchain rebuild (taskcluster) then edit the following comment. -// FORCE REBUILD 2023-05-24 +// FORCE REBUILD 2024-05-02 class DependenciesPlugin : Plugin<Settings> { override fun apply(settings: Settings) = Unit @@ -19,10 +19,10 @@ object Versions { const val serialization = "1.6.3" const val python_envs_plugin = "0.0.31" - const val mozilla_glean = "59.0.0" + const val mozilla_glean = "60.0.1" const val junit = "4.13.2" - const val robolectric = "4.11.1" + const val robolectric = "4.12.1" const val mockito = "5.11.0" const val maven_ant_tasks = "2.1.3" const val jacoco = "0.8.11" @@ -38,20 +38,20 @@ object Versions { const val detekt = "1.23.6" const val ktlint = "0.49.1" - const val sentry = "7.5.0" + const val sentry = "7.8.0" const val zxing = "3.5.3" const val disklrucache = "2.0.2" - const val leakcanary = "2.13" + const val leakcanary = "2.14" const val material = "1.9.0" - const val ksp = "1.0.19" + const val ksp = "1.0.20" val ksp_plugin = "$kotlin-$ksp" // see https://android-developers.googleblog.com/2022/06/independent-versioning-of-Jetpack-Compose-libraries.html // for Jetpack Compose libraries versioning - const val compose_compiler = "1.5.11" + const val compose_compiler = "1.5.13" object AndroidX { const val activityCompose = "1.7.2" @@ -61,10 +61,11 @@ object Versions { const val browser = "1.8.0" const val biometric = "1.1.0" const val cardview = "1.0.0" - const val compose_bom = "2024.04.01" + const val collection = "1.4.0" + const val compose_bom = "2024.05.00" const val constraintlayout = "2.1.4" const val coordinatorlayout = "1.2.0" - const val core = "1.12.0" + const val core = "1.13.1" const val drawerlayout = "1.2.0" const val fragment = "1.6.2" const val recyclerview = "1.3.2" @@ -85,12 +86,14 @@ object Versions { const val uiautomator = "2.3.0" const val localbroadcastmanager = "1.0.0" const val swiperefreshlayout = "1.1.0" - const val data_store_preferences="1.0.0" + const val datastore="1.1.1" } object Firebase { - const val messaging = "23.4.1" + const val messaging = "24.0.0" } + + const val play_services = "18.4.0" } // Synchronized dependencies used by (some) modules @@ -117,6 +120,7 @@ object ComponentsDependencies { const val androidx_biometric = "androidx.biometric:biometric:${Versions.AndroidX.biometric}" const val androidx_browser = "androidx.browser:browser:${Versions.AndroidX.browser}" const val androidx_cardview = "androidx.cardview:cardview:${Versions.AndroidX.cardview}" + const val androidx_collection = "androidx.collection:collection:${Versions.AndroidX.collection}" const val androidx_compose_bom = "androidx.compose:compose-bom:${Versions.AndroidX.compose_bom}" const val androidx_compose_animation = "androidx.compose.animation:animation" @@ -165,7 +169,8 @@ object ComponentsDependencies { const val androidx_espresso_core = "androidx.test.espresso:espresso-core:${Versions.AndroidX.espresso}" const val androidx_localbroadcastmanager = "androidx.localbroadcastmanager:localbroadcastmanager:${Versions.AndroidX.localbroadcastmanager}" const val androidx_swiperefreshlayout = "androidx.swiperefreshlayout:swiperefreshlayout:${Versions.AndroidX.swiperefreshlayout}" - const val androidx_data_store_preferences = "androidx.datastore:datastore-preferences:${Versions.AndroidX.data_store_preferences}" + const val androidx_datastore = "androidx.datastore:datastore:${Versions.AndroidX.datastore}" + const val androidx_datastore_preferences = "androidx.datastore:datastore-preferences:${Versions.AndroidX.datastore}" const val google_material = "com.google.android.material:material:${Versions.material}" @@ -212,4 +217,6 @@ object ComponentsDependencies { const val thirdparty_androidsvg = "com.caverock:androidsvg-aar:${Versions.androidsvg}" const val firebase_messaging = "com.google.firebase:firebase-messaging:${Versions.Firebase.messaging}" + + const val play_services_base = "com.google.android.gms:play-services-base:${Versions.play_services}" } diff --git a/mobile/android/android-components/plugins/dependencies/src/main/java/moz.yaml b/mobile/android/android-components/plugins/dependencies/src/main/java/moz.yaml index c0d1433487..d493398ae3 100644 --- a/mobile/android/android-components/plugins/dependencies/src/main/java/moz.yaml +++ b/mobile/android/android-components/plugins/dependencies/src/main/java/moz.yaml @@ -31,11 +31,11 @@ origin: # Human-readable identifier for this version/release # Generally "version NNN", "tag SSS", "bookmark SSS" - release: 2550d98ec22599dd1b1d45915ad5b119d1b7d64c (2024-04-10T05:03:14). + release: 74b4b850d93c1ec7b305042fb6c3f44712767f3d (2024-05-11T05:02:41). # Revision to pull in # Must be a long or short commit SHA (long preferred) - revision: 2550d98ec22599dd1b1d45915ad5b119d1b7d64c + revision: 74b4b850d93c1ec7b305042fb6c3f44712767f3d # The package's license, where possible using the mnemonic from # https://spdx.org/licenses/ diff --git a/mobile/android/android-components/samples/browser/src/androidTest/assets/index.html b/mobile/android/android-components/samples/browser/src/androidTest/assets/index.html index 9f5632c044..1b7817eef2 100644 --- a/mobile/android/android-components/samples/browser/src/androidTest/assets/index.html +++ b/mobile/android/android-components/samples/browser/src/androidTest/assets/index.html @@ -1,5 +1,5 @@ <html> -<body> -<h1 id="website_title">Hello World!</h1> -</body> + <body> + <h1 id="website_title">Hello World!</h1> + </body> </html> diff --git a/mobile/android/android-components/samples/browser/src/main/assets/extensions/borderify/borderify.js b/mobile/android/android-components/samples/browser/src/main/assets/extensions/borderify/borderify.js index af58957d88..b9a5d6bc18 100644 --- a/mobile/android/android-components/samples/browser/src/main/assets/extensions/borderify/borderify.js +++ b/mobile/android/android-components/samples/browser/src/main/assets/extensions/borderify/borderify.js @@ -2,4 +2,4 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -document.body.style.border = "5px solid red";
\ No newline at end of file +document.body.style.border = "5px solid red"; diff --git a/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/background.js b/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/background.js index 950936be4c..f3ee460d9b 100644 --- a/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/background.js +++ b/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/background.js @@ -6,7 +6,7 @@ * inadvertently match elements in the article content. */ // Counts to three and sends a greeting via the browser action of a newly created tab. -browser.tabs.onCreated.addListener((tab) => { +browser.tabs.onCreated.addListener(tab => { let counter = 0; let intervalId = setInterval(() => { var message; @@ -16,9 +16,12 @@ browser.tabs.onCreated.addListener((tab) => { message = "Hi!"; clearInterval(intervalId); } - browser.browserAction.setBadgeTextColor({tabId: tab.id, color: "#FFFFFF"}); - browser.browserAction.setBadgeText({tabId: tab.id, text: message}); + browser.browserAction.setBadgeTextColor({ + tabId: tab.id, + color: "#FFFFFF", + }); + browser.browserAction.setBadgeText({ tabId: tab.id, text: message }); }, 1000); }); -browser.browserAction.setBadgeBackgroundColor({color: "#AAAAAA"});
\ No newline at end of file +browser.browserAction.setBadgeBackgroundColor({ color: "#AAAAAA" }); diff --git a/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/manifest.template.json b/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/manifest.template.json index 04dc17aa2f..57e0949ec0 100644 --- a/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/manifest.template.json +++ b/mobile/android/android-components/samples/browser/src/main/assets/extensions/test/manifest.template.json @@ -16,7 +16,5 @@ "default_title": "Test", "default_popup": "popup.html" }, - "permissions": [ - "tabs" - ] + "permissions": ["tabs"] } diff --git a/mobile/android/android-components/samples/browser/src/main/java/org/mozilla/samples/browser/BaseBrowserFragment.kt b/mobile/android/android-components/samples/browser/src/main/java/org/mozilla/samples/browser/BaseBrowserFragment.kt index 7cef15d75f..bf5efccc2b 100644 --- a/mobile/android/android-components/samples/browser/src/main/java/org/mozilla/samples/browser/BaseBrowserFragment.kt +++ b/mobile/android/android-components/samples/browser/src/main/java/org/mozilla/samples/browser/BaseBrowserFragment.kt @@ -82,6 +82,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit feature = SessionFeature( components.store, components.sessionUseCases.goBack, + components.sessionUseCases.goForward, binding.engineView, sessionId, ), diff --git a/mobile/android/android-components/samples/crash/build.gradle b/mobile/android/android-components/samples/crash/build.gradle index 9ea07c4d9f..776cb2d8f4 100644 --- a/mobile/android/android-components/samples/crash/build.gradle +++ b/mobile/android/android-components/samples/crash/build.gradle @@ -42,6 +42,7 @@ dependencies { implementation ComponentsDependencies.kotlin_coroutines implementation ComponentsDependencies.androidx_appcompat + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.google_material implementation ComponentsDependencies.androidx_recyclerview } diff --git a/mobile/android/android-components/samples/firefox-accounts/build.gradle b/mobile/android/android-components/samples/firefox-accounts/build.gradle index c6a7d616e9..cade498470 100644 --- a/mobile/android/android-components/samples/firefox-accounts/build.gradle +++ b/mobile/android/android-components/samples/firefox-accounts/build.gradle @@ -45,6 +45,7 @@ dependencies { implementation project(':lib-fetch-httpurlconnection') implementation ComponentsDependencies.androidx_constraintlayout + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.kotlin_coroutines diff --git a/mobile/android/android-components/samples/sync/src/main/java/org/mozilla/samples/sync/MainActivity.kt b/mobile/android/android-components/samples/sync/src/main/java/org/mozilla/samples/sync/MainActivity.kt index 06f889d441..55d243d4cd 100644 --- a/mobile/android/android-components/samples/sync/src/main/java/org/mozilla/samples/sync/MainActivity.kt +++ b/mobile/android/android-components/samples/sync/src/main/java/org/mozilla/samples/sync/MainActivity.kt @@ -278,15 +278,20 @@ class MainActivity : events.forEach { when (it) { is AccountEvent.DeviceCommandIncoming -> { - when (it.command) { + val cmd = it.command + when (cmd) { is DeviceCommandIncoming.TabReceived -> { - val cmd = it.command as DeviceCommandIncoming.TabReceived var tabsStringified = "Tab(s) from: ${cmd.from?.displayName}\n" cmd.entries.forEach { tab -> tabsStringified += "${tab.title}: ${tab.url}\n" } txtView.text = tabsStringified } + is DeviceCommandIncoming.TabsClosed -> { + var urlsStringified = "Tabs closed from: ${cmd.from?.displayName}\n" + cmd.urls.forEach { url -> urlsStringified += "${url}\n" } + txtView.text = urlsStringified + } } } is AccountEvent.ProfileUpdated -> { diff --git a/mobile/android/android-components/samples/toolbar/build.gradle b/mobile/android/android-components/samples/toolbar/build.gradle index 896f3c77f1..80c58683dc 100644 --- a/mobile/android/android-components/samples/toolbar/build.gradle +++ b/mobile/android/android-components/samples/toolbar/build.gradle @@ -53,5 +53,6 @@ dependencies { implementation ComponentsDependencies.kotlin_coroutines implementation ComponentsDependencies.androidx_appcompat + implementation ComponentsDependencies.androidx_core_ktx implementation ComponentsDependencies.androidx_recyclerview } diff --git a/mobile/android/android-components/settings.gradle b/mobile/android/android-components/settings.gradle index 50c58ed003..75297593e1 100644 --- a/mobile/android/android-components/settings.gradle +++ b/mobile/android/android-components/settings.gradle @@ -27,6 +27,7 @@ plugins { ext.topsrcdir = rootProject.projectDir.absolutePath.minus("mobile/android/android-components") apply from: file('../shared-settings.gradle') +apply from: file('../autopublish-settings.gradle') buildCache { local { @@ -35,67 +36,13 @@ buildCache { } } -def runCmd(cmd, workingDir, successMessage) { - def proc = cmd.execute(null, new File(workingDir)) - proc.consumeProcessOutput(System.out, System.err) - proc.waitFor() - if (proc.exitValue() != 0) { - throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}") - } else { - logger.lifecycle(successMessage) +def projectLocalProperties = file("local.properties").with { localPropertiesFile -> + def localProperties = new Properties() + if (localPropertiesFile.canRead()) { + localPropertiesFile.withInputStream { localProperties.load(it) } } + localProperties } - -////////////////////////////////////////////////////////////////////////// -// Local Development overrides -////////////////////////////////////////////////////////////////////////// - -Properties localProperties = null; -String settingAppServicesPath = "autoPublish.application-services.dir" -String settingGleanPath = "autoPublish.glean.dir"; - -if (file('local.properties').canRead()) { - localProperties = new Properties() - localProperties.load(file('local.properties').newDataInputStream()) - logger.lifecycle('Local configuration: loaded local.properties') -} else { - logger.lifecycle('Local configuration: absent local.properties; proceeding as normal.') -} - -if (localProperties != null) { - localProperties.each { prop -> - gradle.ext.set("localProperties.${prop.key}", prop.value) - } - - String appServicesLocalPath = localProperties.getProperty(settingAppServicesPath); - - if (appServicesLocalPath != null) { - logger.lifecycle("Enabling automatic publication of application-services from: $appServicesLocalPath") - // Windows can't execute .py files directly, so we assume a "manually installed" python, - // which comes with a "py" launcher and respects the shebang line to specify the version. - def publishAppServicesCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishAppServicesCmd << "py"; - } - publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py"; - runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.") - } else { - logger.lifecycle("Disabled auto-publication of application-services. Enable it by settings '$settingAppServicesPath' in local.properties") - } - - String gleanLocalPath = localProperties.getProperty(settingGleanPath); - - if (gleanLocalPath != null) { - logger.lifecycle("Enabling automatic publication of Glean from: $gleanLocalPath") - // Windows can't execute .py files directly, so we assume a "manually installed" python, - // which comes with a "py" launcher and respects the shebang line to specify the version. - def publishGleanCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishGleanCmd << "py"; - } - publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py"; - runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.") - } else { - logger.lifecycle("Disabled auto-publication of Glean. Enable it by settings '$settingGleanPath' in local.properties") - } +projectLocalProperties.each { prop -> + gradle.ext."localProperties.${prop.key}" = prop.value } diff --git a/mobile/android/app/geckoview-prefs.js b/mobile/android/app/geckoview-prefs.js index d0906f0711..ece1bbf69b 100644 --- a/mobile/android/app/geckoview-prefs.js +++ b/mobile/android/app/geckoview-prefs.js @@ -208,9 +208,6 @@ pref("dom.serviceWorkers.disable_open_click_delay", 5000); // Enable WebShare support (bug 1402369) pref("dom.webshare.enabled", true); -// The abuse report feature needs some UI that we do not have on mobile -pref("extensions.abuseReport.amWebAPI.enabled", false); - // Disable add-ons that are not installed by the user in all scopes by default (See the SCOPE // constants in AddonManager.sys.mjs for values to use here, and Bug 1405528 for a rationale) pref("extensions.autoDisableScopes", 15); diff --git a/mobile/android/autopublish-settings.gradle b/mobile/android/autopublish-settings.gradle new file mode 100644 index 0000000000..8d233abb12 --- /dev/null +++ b/mobile/android/autopublish-settings.gradle @@ -0,0 +1,114 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This settings file configures an Android project for substituting a +// local Application Services and/or Glean. +// +// For convenience, this file reads the `autoPublish.*` properties from +// `$topsrcdir/local.properties`, so that you only need to set them once +// for all Android projects. +// +// You can also set or override these properties on a per-project basis, +// by setting them in `$topsrcdir/mobile/android/{project}/local.properties`, +// if you want to only substitute App Services or Glean for a specific project, +// or to substitute different versions for different projects. +// +// This settings file configures the build to automatically publish the +// contents of your Application Services and Glean checkouts to the +// Maven local repository. Any dependencies are then substituted to use +// the locally published versions. + +def rootLocalProperties = new File(gradle.mozconfig.topsrcdir, "local.properties").with { localPropertiesFile -> + def localProperties = new Properties() + if (localPropertiesFile.canRead()) { + localPropertiesFile.withInputStream { localProperties.load(it) } + } + localProperties +} + +[ + "autoPublish.application-services.dir", + "autoPublish.glean.dir", +].each { key -> + def relativeOrAbsolutePath = rootLocalProperties."$key" + if (relativeOrAbsolutePath != null) { + def autoPublishDir = new File(gradle.mozconfig.topsrcdir).toPath().resolve(relativeOrAbsolutePath) + gradle.ext."localProperties.$key" = autoPublishDir.toString() + } +} + +gradle.settingsEvaluated { + if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) { + // The project that we're configuring now might have overridden + // the path from `$topsrcdir/local.properties`, so we need to + // resolve it again. + def appServicesLocalPath = gradle."localProperties.autoPublish.application-services.dir".with { relativeOrAbsolutePath -> + def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString() + gradle."localProperties.autoPublish.application-services.dir" = absolutePath + absolutePath + } + + logger.lifecycle("settings.gradle> Enabling automatic publication of application-services from: $appServicesLocalPath") + // Windows can't execute .py files directly, so we assume a "manually installed" python, + // which comes with a "py" launcher and respects the shebang line to specify the version. + def publishAppServicesCmd = []; + if (System.properties["os.name"].toLowerCase().contains("windows")) { + publishAppServicesCmd << "py"; + } + publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py"; + runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.", false) + } else { + logger.lifecycle("settings.gradle> Disabled auto-publication of application-services. Enable it by settings 'autoPublish.application-services.dir' in local.properties") + } + + if (gradle.hasProperty("localProperties.autoPublish.glean.dir")) { + // As above, absolutize the path. + def gleanLocalPath = gradle."localProperties.autoPublish.glean.dir".with { relativeOrAbsolutePath -> + def absolutePath = rootDir.toPath().resolve(relativeOrAbsolutePath).toString() + gradle."localProperties.autoPublish.glean.dir" = absolutePath + absolutePath + } + + logger.lifecycle("settings.gradle> Enabling automatic publication of Glean from: $gleanLocalPath") + // As above, hacks to execute .py files on Windows. + def publishGleanCmd = []; + if (System.properties["os.name"].toLowerCase().contains("windows")) { + publishGleanCmd << "py"; + } + publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py"; + runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.", false) + } else { + logger.lifecycle("settings.gradle> Disabled auto-publication of Glean. Enable it by settings 'autoPublish.glean.dir' in local.properties") + } +} + +gradle.projectsLoaded { -> + gradle.rootProject.allprojects { + // Allow local appservices substitution in each project. + if (gradle.hasProperty("localProperties.autoPublish.application-services.dir")) { + def appServicesSrcDir = gradle."localProperties.autoPublish.application-services.dir" + apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" + } + + // Allow local Glean substitution in each project. + if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) { + def gleanSrcDir = gradle."localProperties.autoPublish.glean.dir" + apply from: "${gleanSrcDir}/build-scripts/substitute-local-glean.gradle" + } + } +} + +def runCmd(cmd, workingDir, successMessage, captureStdout = true) { + def proc = cmd.execute(null, new File(workingDir)) + def standardOutput = captureStdout ? new ByteArrayOutputStream() : System.out + proc.consumeProcessOutput(standardOutput, System.err) + proc.waitFor() + + if (proc.exitValue() != 0) { + throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}"); + } else { + logger.lifecycle("settings.gradle> ${successMessage}") + } + return captureStdout ? standardOutput : null +} diff --git a/mobile/android/chrome/geckoview/geckoview.js b/mobile/android/chrome/geckoview/geckoview.js index dc7ceab7f8..f60610799c 100644 --- a/mobile/android/chrome/geckoview/geckoview.js +++ b/mobile/android/chrome/geckoview/geckoview.js @@ -239,7 +239,7 @@ var ModuleManager = { Object.assign(this._settings, aSettings); this._frozenSettings = Object.freeze(Object.assign({}, this._settings)); - const windowType = aSettings.isPopup + const windowType = aSettings.isExtensionPopup ? "navigator:popup" : "navigator:geckoview"; window.document.documentElement.setAttribute("windowtype", windowType); diff --git a/mobile/android/components/extensions/ext-android.js b/mobile/android/components/extensions/ext-android.js index 4524c4529b..13f91fb617 100644 --- a/mobile/android/components/extensions/ext-android.js +++ b/mobile/android/components/extensions/ext-android.js @@ -129,8 +129,7 @@ class WindowTracker extends WindowTrackerBase { getCurrentWindow(context) { // In GeckoView the popup is on a separate window so getCurrentWindow for // the popup should return whatever is the topWindow. - // TODO: Bug 1651506 use context?.viewType === "popup" instead - if (context?.currentWindow?.moduleManager.settings.isPopup) { + if (context?.viewType === "popup") { return this.topWindow; } return super.getCurrentWindow(context); @@ -283,6 +282,18 @@ class TabTracker extends TabTrackerBase { }; } + getBrowserDataForContext(context) { + if (["tab", "background"].includes(context.viewType)) { + return this.getBrowserData(context.xulBrowser); + } else if (context.viewType === "popup") { + const chromeWindow = windowTracker.getCurrentWindow(context); + const windowId = chromeWindow ? windowTracker.getId(chromeWindow) : -1; + return { tabId: -1, windowId }; + } + + return { tabId: -1, windowId: -1 }; + } + get activeTab() { const window = windowTracker.topWindow; if (window) { @@ -467,8 +478,7 @@ class Window extends WindowBase { isCurrentFor(context) { // In GeckoView the popup is on a separate window so the current window for // the popup is whatever is the topWindow. - // TODO: Bug 1651506 use context?.viewType === "popup" instead - if (context?.currentWindow?.moduleManager.settings.isPopup) { + if (context?.viewType === "popup") { return mobileWindowTracker.topWindow == this.window; } return super.isCurrentFor(context); diff --git a/mobile/android/components/geckoview/GeckoViewStartup.sys.mjs b/mobile/android/components/geckoview/GeckoViewStartup.sys.mjs index e8114b7581..4483941f8e 100644 --- a/mobile/android/components/geckoview/GeckoViewStartup.sys.mjs +++ b/mobile/android/components/geckoview/GeckoViewStartup.sys.mjs @@ -243,6 +243,10 @@ export class GeckoViewStartup { }); ChromeUtils.importESModule( + "resource://gre/modules/MemoryNotificationDB.sys.mjs" + ); + + ChromeUtils.importESModule( "resource://gre/modules/NotificationDB.sys.mjs" ); diff --git a/mobile/android/components/geckoview/SessionStoreFunctions.sys.mjs b/mobile/android/components/geckoview/SessionStoreFunctions.sys.mjs new file mode 100644 index 0000000000..16acc2789f --- /dev/null +++ b/mobile/android/components/geckoview/SessionStoreFunctions.sys.mjs @@ -0,0 +1,61 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import { GeckoViewSessionStore } from "resource://gre/modules/GeckoViewSessionStore.sys.mjs"; + +export class SessionStoreFunctions { + UpdateSessionStore( + aBrowser, + aBrowsingContext, + aPermanentKey, + aEpoch, + aCollectSHistory, + aData + ) { + return GeckoViewSessionStoreFuncInternal.updateSessionStore( + aBrowser, + aBrowsingContext, + aPermanentKey, + aEpoch, + aCollectSHistory, + aData + ); + } +} + +var GeckoViewSessionStoreFuncInternal = { + updateSessionStore: function SSF_updateSessionStore( + aBrowser, + aBrowsingContext, + aPermanentKey, + aEpoch, + aCollectSHistory, + aData + ) { + const { formdata, scroll } = aData; + + if (formdata) { + aData.formdata = formdata.toJSON(); + } + + if (scroll) { + aData.scroll = scroll.toJSON(); + } + + GeckoViewSessionStore.updateSessionStoreFromTabListener( + aBrowser, + aBrowsingContext, + aPermanentKey, + { + data: aData, + epoch: aEpoch, + sHistoryNeeded: aCollectSHistory, + } + ); + }, +}; + +SessionStoreFunctions.prototype.QueryInterface = ChromeUtils.generateQI([ + "nsISessionStoreFunctions", +]); diff --git a/mobile/android/components/geckoview/components.conf b/mobile/android/components/geckoview/components.conf index ea9b9eba09..230abc5cf4 100644 --- a/mobile/android/components/geckoview/components.conf +++ b/mobile/android/components/geckoview/components.conf @@ -91,6 +91,12 @@ Classes = [ ], }, }, + { + 'cid': '{ad643d9e-52e3-4385-a57c-b42deb2f5daf}', + 'contract_ids': ['@mozilla.org/toolkit/sessionstore-functions;1'], + 'esModule': 'resource://gre/modules/SessionStoreFunctions.sys.mjs', + 'constructor': 'SessionStoreFunctions', + }, ] if defined('MOZ_ANDROID_HISTORY'): diff --git a/mobile/android/components/geckoview/moz.build b/mobile/android/components/geckoview/moz.build index 7b115ed03b..75b8c1bf32 100644 --- a/mobile/android/components/geckoview/moz.build +++ b/mobile/android/components/geckoview/moz.build @@ -49,6 +49,7 @@ EXTRA_JS_MODULES += [ "GeckoViewStartup.sys.mjs", "LoginStorageDelegate.sys.mjs", "PromptCollection.sys.mjs", + "SessionStoreFunctions.sys.mjs", "ShareDelegate.sys.mjs", ] diff --git a/mobile/android/config/mozconfigs/android-arm-gradle-dependencies/base b/mobile/android/config/mozconfigs/android-arm-gradle-dependencies/base index 606a724eda..91640adad3 100644 --- a/mobile/android/config/mozconfigs/android-arm-gradle-dependencies/base +++ b/mobile/android/config/mozconfigs/android-arm-gradle-dependencies/base @@ -12,7 +12,7 @@ NO_NDK=1 # We want to download Gradle. ac_add_options --with-gradle # We want to use (and populate!) the local Nexus repositories. -export GRADLE_MAVEN_REPOSITORIES="http://localhost:8081/nexus/content/repositories/mozilla/","http://localhost:8081/nexus/content/repositories/google/","http://localhost:8081/nexus/content/repositories/central/","http://localhost:8081/nexus/content/repositories/gradle-plugins","file://$MOZ_FETCHES_DIR/plugins.gradle.org/m2" +export GRADLE_MAVEN_REPOSITORIES="http://localhost:8081/nexus/content/repositories/mozilla/","http://localhost:8081/nexus/content/repositories/google/","http://localhost:8081/nexus/content/repositories/central/","http://localhost:8081/nexus/content/repositories/gradle-plugins","file://$WORKSPACE/android-gradle-dependencies/plugins.gradle.org/m2/" # Nexus runs on HTTP ac_add_options --allow-insecure-gradle-repositories # Some dependencies may be conditionally-loaded (eg. semanticdb compiler plugins) diff --git a/mobile/android/config/mozconfigs/common b/mobile/android/config/mozconfigs/common index 0dfcf20507..6c54d45e48 100644 --- a/mobile/android/config/mozconfigs/common +++ b/mobile/android/config/mozconfigs/common @@ -8,7 +8,7 @@ ac_add_options --enable-project=mobile/android ac_add_options --with-gradle="$MOZ_FETCHES_DIR/android-gradle-dependencies/gradle-dist/bin/gradle" -export GRADLE_MAVEN_REPOSITORIES="file://$MOZ_FETCHES_DIR/android-gradle-dependencies/mozilla","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/google","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/central","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/gradle-plugins","file:///$MOZ_FETCHES_DIR/plugins.gradle.org/m2" +export GRADLE_MAVEN_REPOSITORIES="file://$MOZ_FETCHES_DIR/android-gradle-dependencies/mozilla","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/google","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/central","file://$MOZ_FETCHES_DIR/android-gradle-dependencies/gradle-plugins","file:///$MOZ_FETCHES_DIR/android-gradle-dependencies/plugins.gradle.org/m2" if [ -z "$NO_NDK" -a -z "$USE_ARTIFACT" ]; then CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" diff --git a/mobile/android/docs/fenix.rst b/mobile/android/docs/fenix.rst index 56dd6eec8d..c22e55cc28 100644 --- a/mobile/android/docs/fenix.rst +++ b/mobile/android/docs/fenix.rst @@ -3,79 +3,15 @@ Building Firefox for Android ============================ -1. Cloning the repo -------------------- - -First, you'll want to `set up your machine to build Firefox </setup>`_. -Follow the instructions there, choosing "GeckoView/Firefox for Android" or "GeckoView/Firefox for Android Artifact Mode" as -the bootstrap option. Please refer to the "Bootstrap" section below to understand better those options. - -Once you're set up and have a GeckoView build from the above, please -continue with the following steps. - -2. Bootstrap ------------- - -If you intend to work mainly on GeckoView, you can find more information `here <geckoview/contributor/for-gecko-engineers.html>`_. - -Bootstrap configures everything for GeckoView and Fenix (Firefox for Android) development. - -.. code-block:: shell - - ./mach bootstrap - -You should then choose one the following options: - -A- You will not change any GeckoView code, or only Java and JS code on GeckoView: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Choose: ``3. GeckoView/Firefox for Android Artifact Mode`` - -Artifact mode downloads pre-built C++ components rather than building them locally, trading bandwidth for time. -(more on Artifact mode) - -B- You intend to change GeckoView code: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Choose: ``4. GeckoView/Firefox for Android`` - -This will build GeckoView from scratch, and take more time than the option above. - -Once ``./mach bootstrap`` is complete, it will automatically write the configuration into a new ``mozconfig`` file. -If you already have a ``mozconfig``, mach will instead output a new configuration that you should append to your existing file. - -3. Build GeckoView ------------------- - -You can now build GeckoView, using +Run Fenix using command line +---------------------------- -.. code-block:: shell - - ./mach build - -.. _build_fenix: - -4. Build Fenix or other Android projects Using Android Studio -------------------------------------------------------------- - -1. **You will only work on one of those projects: Fenix, Focus, Android Components** - -Open your project's folder on Android Studio. You can find it under: ``[your mozilla-central path]/mobile/android`` - -After ``./mach build`` completed successfully, you will need to use `File/Sync Project with Gradle files`. - -2. **You will work on GeckoView only, or GeckoView in integration with the other projects** - -Open the root folder (meaning the ``mozilla-central`` folder you just checked out) on Android Studio. -From there, you should be able to choose the project you want to build. - -.. image:: img/android-studio-build-toolbar.png - :alt: Screenshot Android Studio's toolbar, showing the projects that can be built +As a first step, you need to set up your development environment using the instruction :ref:`here <firefox_for_android>`. -After ``./mach build`` completed successfully, you will need to do a full Gradle Sync. -3. Run Fenix or other Android projects using command line +Run Fenix or other Android projects using command line --------------------------------------------------------- +.. _run_fenix_from_commandline: From the root mozilla-central directory, you can run an emulator with the following command: @@ -83,7 +19,6 @@ From the root mozilla-central directory, you can run an emulator with the follow ./mach android-emulator - From the `mobile/android/fenix` working directory, build, install and launch Fenix with: .. code-block:: shell @@ -92,3 +27,23 @@ From the `mobile/android/fenix` working directory, build, install and launch Fen export ANDROID_HOME=$HOME/.mozbuild/android-sdk-<os_name> ./gradlew :app:installFenixDebug "$ANDROID_HOME/platform-tools/adb" shell am start -n org.mozilla.fenix.debug/org.mozilla.fenix.debug.App + + +Run Fenix tests +------------------- + +You can run tests via all the normal routes: + +- For individual test files, click the little green play button at the top +- For a module/component: + + - Right click in project explorer → run all tests + - Select from gradle tasks window + - On command line: ``./gradlew :$module:$variant`` e.g. ``./gradlew :feature-downloads:testDebugUnitTest`` + +If you see the error "Test events were not received", check your top level folder - this happens if you try and run tests in Android Components from ``mozilla-unified/mobile/android/fenix/``. +To build tests for Android Components you need to be using the ``build.gradle`` in ``mozilla-unified/mobile/android/android-components/``. + +If after running tests on your Android device, you can no longer long press, this is because the connected Android tests mess around with your phone’s accessibility settings. +They set the long press delay to 3 seconds, which is an uncomfortably long time. +To fix this, go to Settings → Accessibility → Touch and hold delay, and reset this to default or short (depends on manufacturer). diff --git a/mobile/android/docs/geckoview/contributor/contributing-to-mc.rst b/mobile/android/docs/geckoview/contributor/contributing-to-mc.rst index ee4f5be877..fa92a3466d 100644 --- a/mobile/android/docs/geckoview/contributor/contributing-to-mc.rst +++ b/mobile/android/docs/geckoview/contributor/contributing-to-mc.rst @@ -11,6 +11,7 @@ Table of contents Submitting a patch to Firefox using Git. ======================================== +.. _contribute_with_git: This guide will take you through submitting and updating a patch to ``mozilla-central`` as a git user. You need to already be `set up to use diff --git a/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst b/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst index 140dd62784..d111f54b01 100644 --- a/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst +++ b/mobile/android/docs/geckoview/contributor/geckoview-quick-start.rst @@ -19,141 +19,13 @@ project. If you want to get started using GeckoView in your app then you should refer to the `wiki <https://wiki.mozilla.org/Mobile/GeckoView#Get_Started>`_. -Get set up with Mozilla Central -------------------------------- - -The GeckoView codebase is part of the main Firefox tree and can be found -in ``mozilla-central``. You will need to get set up as a contributor to -Firefox in order to contribute to GeckoView. To get set up with -``mozilla-central``, follow the `Quick Start Guide for Git -Users <mc-quick-start.html>`_, or the `Contributing to the Mozilla code -base <https://firefox-source-docs.mozilla.org/setup/contributing_code.html>`_ -guide and `Firefox Contributors’ Quick Reference -<https://firefox-source-docs.mozilla.org/contributing/contribution_quickref.html>`_ -for Mercurial users. - -Once you have a copy of ``mozilla-central``, you will need to build -GeckoView. - -Bootstrap Gecko ---------------- - -Bootstrap configures everything for GeckoView and Fennec (Firefox for Android) development. - -- Ensure you have ``mozilla-central`` checked out. If this is the first - time you are doing this, it may take some time. - -.. code:: bash - - git checkout central/default - -If you are on a mac, you will need to have the Xcode build tools -installed. You can do this by either `installing -Xcode <https://developer.apple.com/xcode/>`__ or installing only the -tools from the command line by running ``xcode-select --install`` and -following the on screen instructions. - -You will need to ``bootstrap`` for GeckoView/Firefox for Android. The easiest way is to run the following command: - -.. code:: bash - - ./mach --no-interactive bootstrap --application-choice="GeckoView/Firefox for Android" - -.. note:: - - - The ``--no-interactive`` argument will make ``bootstrap`` run start to finish without requiring any input from you. It will automatically accept any license agreements. - - The ``--application-choice="GeckoView/Firefox for Android"`` argument is needed when using ``--no-interactive`` so that "bootstrapping" is done for the correct application (instead of the default). - - If you want to make all the selections yourself and/or read through the license agreements, you can simply run: - - .. code:: bash - - ./mach bootstrap - - Select ``4. GeckoView/Firefox for Android`` when prompted and respond to any subsequent prompts as they appear. - -Once ``./mach bootstrap`` is complete, it will automatically write -the configuration into a new ``mozconfig`` file. If you already -have a ``mozconfig``, ``mach`` will instead output new configuration -that you should append to your existing file. - -Build from the command line ---------------------------- - -In order to pick up the configuration changes we just made we need to -build from the command line. This will update generated sources, compile -native code, and produce GeckoView AARs and example and test APKs. - -.. code:: bash - - ./mach build - -Build Using Android Studio --------------------------- - -- Install `Android - Studio <https://developer.android.com/studio/install>`_. -- Choose File->Open from the toolbar -- Navigate to the root of your ``mozilla-central`` source directory and - click “Open” -- Click yes if it asks if you want to use the gradle wrapper. - - - If the gradle sync does not automatically start, select File > - Sync Project with Gradle Files. - -- Wait for the project to index and gradle to sync. Once synced, the - workspace will reconfigure to display the different projects. - - - annotations contains custom Java annotations used inside GeckoView - - app contains geckoview build settings and omnijar. omnijar contains - the parts of Gecko and GeckoView that are not written in Java or Kotlin - - geckoview is the GeckoView project. Here is all the Java files - related to GeckoView - - geckoview_example is an example browser built using GeckoView. - - |alt text 1| - -Now you’re set up and ready to go. - -**Important: at this time, building from Android Studio or directly from -Gradle does not (re-)compile native code, including C++ and Rust.** This -means you will need to run ``mach build`` yourself to pick up changes to -native code. `Bug -1509539 <https://bugzilla.mozilla.org/show_bug.cgi?id=1509539>`_ tracks -making Android Studio and Gradle do this automatically. - -If you want set up code formatting for Kotlin, please reference -`IntelliJ IDEA configuration -<https://pinterest.github.io/ktlint/rules/configuration-intellij-idea/>`_. - -Custom mozconfig with Android Studio ------------------------------------- - -Out of the box, Android Studio will use the default mozconfig file, normally -located at ``mozconfig`` in the root directory of your ``mozilla-central`` -checkout. - -To make Android Studio use a mozconfig in a custom location, you can add the -following to your ``local.properties``: - -:: - - mozilla-central.mozconfig=relative/path/to/mozconfig - -Note that, when running mach from the command line, this value will be ignored, -and the mozconfig from the mach environment will be used instead. - -To override the mozconfig used by mach, you can use the `MOZCONFIG` environment -variable, for example: - -:: - - MOZCONFIG=debug.mozconfig ./mach build - Performing a bug fix -------------------- -One you have got GeckoView building and running, you will want to start +As a first step, you need to set up :ref:`mozilla-central <mozilla-central-setup>`, +and :ref:`Bootstrap <bootstrap-setup>` and build the project. + +Once you have got GeckoView building and running, you will want to start contributing. There is a general guide to `Performing a Bug Fix for Git Developers <contributing-to-mc.html>`_ for you to follow. To contribute to GeckoView specifically, you will need the following additional diff --git a/mobile/android/docs/index.rst b/mobile/android/docs/index.rst index 232363b934..8fc986d19a 100644 --- a/mobile/android/docs/index.rst +++ b/mobile/android/docs/index.rst @@ -1,10 +1,172 @@ -Fennec Legacy -============= +Firefox for Android +=================== +.. _firefox_for_android: -This collection of linked pages contains old fennec documentation -which are still useful for other projects +Firefox for Android consists of three layers: -.. toctree:: - :maxdepth: 1 +- GeckoView: This is a library that brings the Gecko API to Android. - mma +- Android Components: This is a library of reusable browser building blocks. + +- Frontend (Fenix): This refers to the frontend interface. + +All three components can be found in ``mozilla-central``. +To contribute to any of the three, you will need to get set up as a contributor to Firefox. + +Mozilla Central Setup +--------------------- +.. _mozilla-central-setup: + +To set up Mozilla Central, you can follow the general instructions provided in the Mozilla Source Docs: + +- :ref:`Getting Set Up To Work On The Firefox Codebase <Getting Set Up To Work On The Firefox Codebase>` + +Additionally, to set up specifically for mozilla-central, you can refer to the following guide: + +- :ref:`Mozilla Central Quick Start <Mozilla Central Quick Start>` +- :ref:`Quick Start Guide for Git Users <contribute_with_git>` + +Bootstrap +---------- +.. _bootstrap-setup: + +Bootstrap configures everything for GeckoView and Fenix (Firefox for Android) development. + +- Ensure you have ``mozilla-central`` checked out. If this is the first + time you are doing this, it may take some time. + +.. code:: bash + + git checkout central/default + +If you are on a mac, you will need to have the Xcode build tools +installed. You can do this by either `installing +Xcode <https://developer.apple.com/xcode/>`__ or installing only the +tools from the command line by running ``xcode-select --install`` and +following the on screen instructions. + +If you are on a newer mac with an Apple Silicon M2 or M3 processor, +you also need to install rosetta for backwards compatilibilty: + +.. code:: bash + + softwareupdate --install-rosetta + +You will need to ``bootstrap`` for GeckoView/Firefox for Android. The easiest way is to run the following command: + +.. code:: bash + + ./mach --no-interactive bootstrap --application-choice="GeckoView/Firefox for Android" + +.. note:: + + - The ``--no-interactive`` argument will make ``bootstrap`` run start to finish without requiring any input from you. It will automatically accept any license agreements. + - The ``--application-choice="GeckoView/Firefox for Android"`` argument is needed when using ``--no-interactive`` so that "bootstrapping" is done for the correct application (instead of the default). + + If you want to make all the selections yourself and/or read through the license agreements, you can simply run: + + .. code:: bash + + ./mach bootstrap + +You should then choose one the following options: + +A- You will not change or debug any C++ code: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Choose: ``3. GeckoView/Firefox for Android Artifact Mode`` + +Artifact mode downloads pre-built C++ components rather than building them locally, trading bandwidth for time. +(more on Artifact mode) + +B- You intend to change or debug C++ code: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Choose: ``4. GeckoView/Firefox for Android`` + +This will build GeckoView from scratch, and take more time than the option above. + +Once ``./mach bootstrap`` is complete, it will automatically write the configuration into a new ``mozconfig`` file. +If you already have a ``mozconfig``, mach will instead output a new configuration that you should append to your existing file. + +Build from the command line +--------------------------- +.. _build_from_cmd_line: + +In order to pick up the configuration changes we just made we need to +build from the command line. This will update generated sources, compile +native code, and produce GeckoView AARs and example and test APKs. + +.. code:: bash + + ./mach build + +Build Using Android Studio +-------------------------- +.. _build_with_android_studio: + +- Install `Android + Studio <https://developer.android.com/studio/install>`_. +- Choose File->Open from the toolbar +- Navigate to the root of your ``mozilla-central`` source directory and + click “Open” +- Click yes if it asks if you want to use the gradle wrapper. + + - If the gradle sync does not automatically start, select File > + Sync Project with Gradle Files. + +- Wait for the project to index and gradle to sync. Once synced, the + workspace will reconfigure to display the different projects. + + - annotations contains custom Java annotations used inside GeckoView + - app contains geckoview build settings and omnijar. omnijar contains + the parts of Gecko and GeckoView that are not written in Java or Kotlin + - geckoview is the GeckoView project. Here is all the Java files + related to GeckoView + - geckoview_example is an example browser built using GeckoView. + +Now you’re set up and ready to go. + +**Important: at this time, building from Android Studio or directly from +Gradle does not (re-)compile native code, including C++ and Rust.** This +means you will need to run ``mach build`` yourself to pick up changes to +native code. `Bug +1509539 <https://bugzilla.mozilla.org/show_bug.cgi?id=1509539>`_ tracks +making Android Studio and Gradle do this automatically. + +If you want set up code formatting for Kotlin, please reference +`IntelliJ IDEA configuration +<https://pinterest.github.io/ktlint/rules/configuration-intellij-idea/>`_. + +Custom mozconfig with Android Studio +------------------------------------ + +Out of the box, Android Studio will use the default mozconfig file, normally +located at ``mozconfig`` in the root directory of your ``mozilla-central`` +checkout. + +To make Android Studio use a mozconfig in a custom location, you can add the +following to your ``local.properties``: + +:: + + mozilla-central.mozconfig=relative/path/to/mozconfig + +Note that, when running mach from the command line, this value will be ignored, +and the mozconfig from the mach environment will be used instead. + +To override the mozconfig used by mach, you can use the `MOZCONFIG` environment +variable, for example: + +:: + + MOZCONFIG=debug.mozconfig ./mach build + +Project-Specific Instructions +------------------------------ + +Now that you're prepared and set up, you can access specific project instructions below: + +- GeckoView: :ref:`Contributing to GeckoView <Contributing to GeckoView>` +- Android Components: `Mozilla Android Components <https://mozac.org/>`_ +- Frontend: :ref:`Building Firefox for Android <Building Firefox for Android>` diff --git a/mobile/android/docs/overview.rst b/mobile/android/docs/overview.rst deleted file mode 100644 index 97f6d19541..0000000000 --- a/mobile/android/docs/overview.rst +++ /dev/null @@ -1,26 +0,0 @@ -Firefox for Android -=================== - -GeckoView ---------- - -GeckoView is a full-featured webview that can be embedded into Android apps using Gecko as the -rendering engine. - -:ref:`Read more <GeckoView>` - -Android Components ------------------- - -Android components is a collection of components useful for building web browser applications on -Android using GeckoView as the rendering engine. - -`Read more <https://mozac.org/>`_ - -Frontend --------- - -The frontend for Firefox for Android is built as a native Android UI in Kotlin and makes use of -Android Components and GeckoView. - -:ref:`Read more <Building Firefox for Android>` diff --git a/mobile/android/docs/shared/android/device_testing.md b/mobile/android/docs/shared/android/device_testing.md index f2e89b1a9b..ddf1c6c601 100644 --- a/mobile/android/docs/shared/android/device_testing.md +++ b/mobile/android/docs/shared/android/device_testing.md @@ -18,7 +18,7 @@ By default the Fenix CI runs tests using virtual devices on `x86`. That's faster when the host is also a `x86(_64)` system, but most physical devices use the Arm platform. So first we need to instruct it to run tests on Arm. -Which platform to test on is defined in [`taskcluster/ci/ui-test/kind.yml`](https://github.com/mozilla-mobile/fenix/blob/58e12b18e6e9f4f67c059fe9c9bf9f02579a55db/taskcluster/ci/ui-test/kind.yml#L65). +Which platform to test on is defined in [`taskcluster/kinds/ui-test/kind.yml`](https://searchfox.org/mozilla-central/source/taskcluster/kinds/ui-test/kind.yml). Find the line where it downloads the `target.apk` produced in a previous step and change it from `x86` to `arm64-v8a`: ```patch diff --git a/mobile/android/fenix/app/build.gradle b/mobile/android/fenix/app/build.gradle index a3e5442372..196c4b6401 100644 --- a/mobile/android/fenix/app/build.gradle +++ b/mobile/android/fenix/app/build.gradle @@ -681,8 +681,8 @@ dependencies { implementation FenixDependencies.androidx_core_splashscreen implementation FenixDependencies.androidx_transition implementation ComponentsDependencies.androidx_work_runtime - implementation FenixDependencies.androidx_datastore - implementation ComponentsDependencies.androidx_data_store_preferences + implementation ComponentsDependencies.androidx_datastore + implementation ComponentsDependencies.androidx_datastore_preferences implementation FenixDependencies.protobuf_javalite implementation ComponentsDependencies.google_material @@ -894,15 +894,10 @@ if (gradle.hasProperty('localProperties.dependencySubstitutions.geckoviewTopsrcd if (gradle.hasProperty('localProperties.dependencySubstitutions.geckoviewTopobjdir')) { ext.topobjdir = gradle."localProperties.dependencySubstitutions.geckoviewTopobjdir" } - ext.topsrcdir = StringUtils.removeSuffix(gradle."localProperties.dependencySubstitutions.geckoviewTopsrcdir", File.separator) + ext.topsrcdir = gradle."localProperties.dependencySubstitutions.geckoviewTopsrcdir" apply from: "${topsrcdir}/substitute-local-geckoview.gradle" } -if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) { - ext.gleanSrcDir = gradle."localProperties.autoPublish.glean.dir" - apply from: "../${gleanSrcDir}/build-scripts/substitute-local-glean.gradle" -} - android.applicationVariants.configureEach { variant -> tasks.register("apkSize${variant.name.capitalize()}", ApkSizeTask) { variantName = variant.name diff --git a/mobile/android/fenix/app/lint-baseline.xml b/mobile/android/fenix/app/lint-baseline.xml index c9eb994da1..11d01800db 100644 --- a/mobile/android/fenix/app/lint-baseline.xml +++ b/mobile/android/fenix/app/lint-baseline.xml @@ -157,28 +157,6 @@ <issue id="UnusedAttribute" - message="Attribute `shortcutLongLabel` is only used in API level 25 and higher (current min is 21)" - errorLine1=" android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2">" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/debug/res/xml/shortcuts.xml" - line="12" - column="9"/> - </issue> - - <issue - id="UnusedAttribute" - message="Attribute `shortcutLongLabel` is only used in API level 25 and higher (current min is 21)" - errorLine1=" android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2">" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/main/res/xml/shortcuts.xml" - line="12" - column="9"/> - </issue> - - <issue - id="UnusedAttribute" message="Attribute `shortcutId` is only used in API level 25 and higher (current min is 21)" errorLine1=" android:shortcutId="open_new_private_tab"" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -223,28 +201,6 @@ <issue id="UnusedAttribute" - message="Attribute `shortcutLongLabel` is only used in API level 25 and higher (current min is 21)" - errorLine1=" android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2">" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/debug/res/xml/shortcuts.xml" - line="23" - column="9"/> - </issue> - - <issue - id="UnusedAttribute" - message="Attribute `shortcutLongLabel` is only used in API level 25 and higher (current min is 21)" - errorLine1=" android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2">" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="src/main/res/xml/shortcuts.xml" - line="23" - column="9"/> - </issue> - - <issue - id="UnusedAttribute" message="Attribute `android:foreground` has no effect on API levels lower than 23 (current min is 21)" errorLine1=" android:foreground="?android:selectableItemBackground">" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1370,4 +1326,9 @@ column="21"/> </issue> + <issue id="UnusedResources" + message="The resource R.drawable.microsurvey_success appears to be unused"> + <location file="src/main/res/drawable/microsurvey_success.xml" /> + </issue> + </issues> diff --git a/mobile/android/fenix/app/messaging-fenix.fml.yaml b/mobile/android/fenix/app/messaging-fenix.fml.yaml index 07bc54fd4a..ac40a5e35b 100644 --- a/mobile/android/fenix/app/messaging-fenix.fml.yaml +++ b/mobile/android/fenix/app/messaging-fenix.fml.yaml @@ -44,6 +44,9 @@ import: INACTIVE_4_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 4" INACTIVE_5_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 5" + # Behavioral Targeting Events + RECENTLY_PRINTED: "'print_tapped'|eventLastSeen('Hours') <= 24" + # Has the user signed in the last 4 years FXA_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) <= 4" FXA_NOT_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) > 4" @@ -94,10 +97,14 @@ import: NOTIFICATION: priority: 50 max-display-count: 1 + MICRO_SURVEY: + priority: 50 + max-display-count: 5 $$surfaces: - homescreen - notification - survey + - microsurvey - channel: developer value: diff --git a/mobile/android/fenix/app/metrics.yaml b/mobile/android/fenix/app/metrics.yaml index 470186c2a5..a620eb4d39 100644 --- a/mobile/android/fenix/app/metrics.yaml +++ b/mobile/android/fenix/app/metrics.yaml @@ -868,11 +868,12 @@ translations: A string containing the name of the item the user tapped. These items include: main_flow_toolbar, main_flow_browser, page_settings, global_settings, - global_lang_settings, global_site_settings, downloads + global_lang_settings, global_site_settings, downloads, global_settings_from_preferences type: string bugs: - https://bugzilla.mozilla.org/show_bug.cgi?id=1883968 - https://bugzilla.mozilla.org/show_bug.cgi?id=1886851 + - https://bugzilla.mozilla.org/show_bug.cgi?id=1890838 data_reviews: - https://bugzilla.mozilla.org/show_bug.cgi?id=1883968#c6 - https://bugzilla.mozilla.org/show_bug.cgi?id=1886851#c8 @@ -2826,11 +2827,11 @@ customize_home: notification_emails: - android-probes@mozilla.com expires: never - recently_saved: + bookmarks: type: boolean description: | An indication of whether the recently - saved section is enabled to be displayed + saved section is enabled to be displayed. This was previously customize_home.recently_saved. send_in_pings: - metrics bugs: @@ -2936,7 +2937,8 @@ customize_home: toggled. We currently track: most_visited_sites, jump_back_in, - recently_visited, recently_saved, pocket, and contile. + recently_visited, bookmarks, pocket, and contile. + We previously tracked bookmarks as recently_saved. enabled: type: boolean description: "Whether or not the preference is *now* enabled" @@ -9892,11 +9894,11 @@ recent_tabs: - android-probes@mozilla.com expires: never -recent_bookmarks: +home_bookmarks: shown: type: event description: | - Recent bookmarks section was shown to the user. + Bookmarks section of home was shown to the user. This was previously recent_bookmarks.shown. bugs: - https://github.com/mozilla-mobile/fenix/issues/22103 data_reviews: @@ -9913,8 +9915,8 @@ recent_bookmarks: lifetime: application description: | A counter that indicates the number of times that a user - has clicked on a recently saved bookmark from the home - screen. + has clicked on a bookmark from the home + screen. This was previously recent_bookmarks.bookmark_clicked. send_in_pings: - metrics bugs: @@ -9934,8 +9936,8 @@ recent_bookmarks: lifetime: application description: | A counter that indicates the number of times that a user - has clicked the show all button for recently saved bookmarks - on the home screen. + has clicked the show all button for bookmarks + on the home screen. This was previously recent_bookmarks.show_all_bookmarks. send_in_pings: - metrics bugs: @@ -9950,11 +9952,11 @@ recent_bookmarks: notification_emails: - android-probes@mozilla.com expires: never - recent_bookmarks_count: + bookmarks_count: type: quantity description: | The number of bookmarked items appearing in the - Recently Saved section on the home page. + Bookmarks section on the home page. This was previously recent_bookmarks.recent_bookmarks_count. bugs: - https://github.com/mozilla-mobile/fenix/issues/22075 data_reviews: @@ -11587,6 +11589,29 @@ debug_drawer: - android-probes@mozilla.com expires: never +micro_survey: + response: + type: event + description: User response data for a micro survey. + extra_keys: + feature_name: + description: The name of the feature the survey is for e.g. "printing PDF". + type: string + user_selection: + description: | + The users selected option. For example, possible values are: + "Very satisfied", "satisfied", "neutral", "dissatisfied" and "Very dissatisfied". + type: string + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1891509 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1891509 + data_sensitivity: + - interaction + notification_emails: + - android-probes@mozilla.com + expires: never + navigation_bar: home_search_tapped: type: event diff --git a/mobile/android/fenix/app/nimbus.fml.yaml b/mobile/android/fenix/app/nimbus.fml.yaml index d16e1286f6..e0f76f8883 100644 --- a/mobile/android/fenix/app/nimbus.fml.yaml +++ b/mobile/android/fenix/app/nimbus.fml.yaml @@ -53,7 +53,7 @@ features: { "top-sites": true, "jump-back-in": true, - "recently-saved": true, + "bookmarks": true, "recent-explorations": true, "pocket": true, "pocket-sponsored-stories": true, @@ -64,7 +64,7 @@ features: "sections-enabled": { "top-sites": true, "jump-back-in": true, - "recently-saved": true, + "bookmarks": true, "recent-explorations": true, "pocket": true, } @@ -248,6 +248,7 @@ features: glean: description: "A feature that provides server-side configurations for Glean metrics (aka Server Knobs)." + allow-coenrollment: true variables: metrics-enabled: description: "A map of metric base-identifiers to booleans representing the state of the 'enabled' flag for that metric." @@ -257,6 +258,10 @@ features: description: "Enables precise event timestamps for Glean events" type: Boolean default: false + delay-ping-lifetime-io: + description: "Glean will delay io for ping lifetime metrics" + type: Boolean + default: true splash-screen: description: "A feature that extends splash screen duration, allowing additional data fetching time for the app's initial run." @@ -435,6 +440,20 @@ features: value: enabled: true + remote-tab-management: + description: > + Features that let users manage tabs on other devices that are + connected to the same Mozilla account. + variables: + close-tabs-enabled: + description: > + Whether the feature to close synced tabs is enabled. When enabled, + this device will allow other devices to close tabs that are open on this device, and + show a "close" button for tabs that are currently open on other supported devices + in the synced tabs tray. + type: Boolean + default: false + types: objects: {} @@ -444,8 +463,8 @@ types: variants: top-sites: description: The frecency and pinned sites. - recently-saved: - description: The sites the user has bookmarked recently. + bookmarks: + description: The sites the user has bookmarked. jump-back-in: description: The tabs the user was looking immediately before being interrupted. recent-explorations: diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/addressForm.html b/mobile/android/fenix/app/src/androidTest/assets/pages/addressForm.html index 0ca8bf3bf5..a09fab9788 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/addressForm.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/addressForm.html @@ -1,17 +1,17 @@ <html> -<head> - <meta name="viewport" content="width=device-width"> + <head> + <meta name="viewport" content="width=device-width" /> <title>Address_Form</title> -</head> -<body> + </head> + <body> <form> - <p>Street Address: <input id="streetAddress" type="text"></p> - <p>City: <input id="city" type="text"></p> - <p>Zip Code: <input id="zipCode" type="text"></p> - <p>Country: <input id="country" type="text"></p> - <p>Telephone: <input id="telephone" type="text"></p> - <p>Email: <input id="email" type="text"></p> - <p>Apartment, suite, etc. <input id="apartment" type="text"></p> + <p>Street Address: <input id="streetAddress" type="text" /></p> + <p>City: <input id="city" type="text" /></p> + <p>Zip Code: <input id="zipCode" type="text" /></p> + <p>Country: <input id="country" type="text" /></p> + <p>Telephone: <input id="telephone" type="text" /></p> + <p>Email: <input id="email" type="text" /></p> + <p>Apartment, suite, etc. <input id="apartment" type="text" /></p> </form> -</body> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/audioMediaPage.html b/mobile/android/fenix/app/src/androidTest/assets/pages/audioMediaPage.html index 4d82abb822..94393e6bdb 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/audioMediaPage.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/audioMediaPage.html @@ -1,13 +1,13 @@ <html> -<head> + <head> <title>Audio_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: audio player</p> -<div class="audioPlayer"> - <audio id="audioSample" controls loop> - <source src="../resources/audioSample.mp3"> - </audio> -</div> -</body> + </head> + <body> + <p id="testContent">Page content: audio player</p> + <div class="audioPlayer"> + <audio id="audioSample" controls loop> + <source src="../resources/audioSample.mp3" /> + </audio> + </div> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/creditCardForm.html b/mobile/android/fenix/app/src/androidTest/assets/pages/creditCardForm.html index 7b77e92872..57ede7ddf8 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/creditCardForm.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/creditCardForm.html @@ -1,17 +1,31 @@ <html> -<head> - <meta name="viewport" content="width=device-width"> + <head> + <meta name="viewport" content="width=device-width" /> <title>Credit_Card_Form</title> -</head> -<body> + </head> + <body> <form> - <p>Card information</p> - <p>Card Number: <input id="cardNumber" type="text" placeholder="1234 1234 1234 1234"></p> - <p>Name on card: <input id="nameOnCard"type="text" placeholder="Name on card"></p> - <p> Expiry date: - <input id="expiryMonthAndYear" inputmode="numerical" placeholder="MM / YYYY" type="text" /> - </p> - <p><input type="submit" id="submit" value="Submit" aria-label="submit"/></p> + <p>Card information</p> + <p> + Card Number: + <input id="cardNumber" type="text" placeholder="1234 1234 1234 1234" /> + </p> + <p> + Name on card: + <input id="nameOnCard" type="text" placeholder="Name on card" /> + </p> + <p> + Expiry date: + <input + id="expiryMonthAndYear" + inputmode="numerical" + placeholder="MM / YYYY" + type="text" + /> + </p> + <p> + <input type="submit" id="submit" value="Submit" aria-label="submit" /> + </p> </form> -</body> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/cross-site-cookies.html b/mobile/android/fenix/app/src/androidTest/assets/pages/cross-site-cookies.html index 8b81b3b3f4..1dc01c669a 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/cross-site-cookies.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/cross-site-cookies.html @@ -1,15 +1,19 @@ <html> -<!-- This Source Code Form is subject to the terms of the Mozilla Public + <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<!-- This asset is using the code behind + <!-- This asset is using the code behind - https://www.mozilla-anti-tracking.com/test/dfpi/storage_access_api.html - test page. - Source repository: https://github.com/mozilla/anti-tracking-test-pages --> -<body> -<h2>Cross-site cookies storage access test</h2> -<h3>anti-tracker-test.com</h3> -<h4>different site, cross-origin iframe</h4> -<iframe width=500 height=1000 src="https://mozilla-mobile.github.io/testapp/anti-tracker-test_set_storage_with_sa_api.html"></iframe> -</body> + <body> + <h2>Cross-site cookies storage access test</h2> + <h3>anti-tracker-test.com</h3> + <h4>different site, cross-origin iframe</h4> + <iframe + width="500" + height="1000" + src="https://mozilla-mobile.github.io/testapp/anti-tracker-test_set_storage_with_sa_api.html" + ></iframe> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/externalLinks.html b/mobile/android/fenix/app/src/androidTest/assets/pages/externalLinks.html index 755d15ac84..88652d283f 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/externalLinks.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/externalLinks.html @@ -1,29 +1,31 @@ <!DOCTYPE html> <html> -<head> + <head> <title>Html_Control_Form</title> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width"> -</head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width" /> + </head> -<p>Misc Link Types</p> -<section> + <p>Misc Link Types</p> + <section> <a href="mailto://example@example.com">Email link</a> -</section> + </section> -<section> + <section> <a href="tel://1234567890">Telephone link</a> -</section> + </section> -<section> + <section> <a href="vnd.youtube://@Mozilla">Youtube schema link</a> -</section> + </section> -<section> + <section> <a href="https://m.youtube.com/user/mozilla?cbrd=1">Youtube full link</a> -</section> + </section> -<section> - <a href="http://play.google.com/store/apps/details?id=org.mozilla.firefox">Playstore link</a> -</section> + <section> + <a href="http://play.google.com/store/apps/details?id=org.mozilla.firefox" + >Playstore link</a + > + </section> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/generic1.html b/mobile/android/fenix/app/src/androidTest/assets/pages/generic1.html index 4aa0dfb819..b4b8d9f159 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/generic1.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/generic1.html @@ -1,10 +1,10 @@ <html> -<head> + <head> <title>Test_Page_1</title> -</head> -<body> -<h1> - <p id="testContent">Page content: 1</p> -</h1> -</body> + </head> + <body> + <h1> + <p id="testContent">Page content: 1</p> + </h1> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/generic2.html b/mobile/android/fenix/app/src/androidTest/assets/pages/generic2.html index 39a7220f53..8cf29b5c18 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/generic2.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/generic2.html @@ -1,10 +1,10 @@ <html> -<head> + <head> <title>Test_Page_2</title> -</head> -<body> -<h1> - <p id="testContent">Page content: 2</p> -</h1> -</body> + </head> + <body> + <h1> + <p id="testContent">Page content: 2</p> + </h1> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/generic3.html b/mobile/android/fenix/app/src/androidTest/assets/pages/generic3.html index 2f033ec8dc..ff9c4032f2 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/generic3.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/generic3.html @@ -1,16 +1,19 @@ <html> -<head> + <head> <title>Test_Page_3</title> -</head> -<body> -<h1> - <p id="testContent">Page content: 3</p> - <p> - <a href="https://play.google.com/store/apps/details?id=org.mozilla.fenix">Mozilla Playstore link</a> - </p> - <p> + </head> + <body> + <h1> + <p id="testContent">Page content: 3</p> + <p> + <a + href="https://play.google.com/store/apps/details?id=org.mozilla.fenix" + >Mozilla Playstore link</a + > + </p> + <p> <a href="../resources/pdfForm.pdf">PDF form file</a> - </p> -</h1> -</body> + </p> + </h1> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/generic4.html b/mobile/android/fenix/app/src/androidTest/assets/pages/generic4.html index 368cfb9270..18a8a7a629 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/generic4.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/generic4.html @@ -1,20 +1,20 @@ <html> -<head> + <head> <meta name="viewport" content="width=device-width" /> <title>Test_Page_4</title> -</head> -<body> + </head> + <body> <p id="testContent">Page content: 4</p> <a href="generic1.html">Link 1</a> <a href="generic2.html">Link 2</a> <a href="generic3.html">Link 3</a> <p> - <a href="../resources/rabbit.jpg"> - <img src="../resources/rabbit.jpg" alt="test_link_image"> - </a> + <a href="../resources/rabbit.jpg"> + <img src="../resources/rabbit.jpg" alt="test_link_image" /> + </a> </p> <p> - <img src="../resources/rabbit.jpg" alt="test_no_link_image"> + <img src="../resources/rabbit.jpg" alt="test_no_link_image" /> </p> -</body> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/global_privacy_control.html b/mobile/android/fenix/app/src/androidTest/assets/pages/global_privacy_control.html index e08df8c17f..d8961ebc0a 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/global_privacy_control.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/global_privacy_control.html @@ -1,15 +1,14 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> -<script type = "text/javascript" > - const gpcValue = navigator.globalPrivacyControl - if (gpcValue) { - document.write('<p>GPC is enabled.</p>'); - } else { - document.write('<p>GPC not enabled.</p>'); - } -</script> - -</body> + <meta name="viewport" content="width=device-width" /> + <body> + <script type="text/javascript"> + const gpcValue = navigator.globalPrivacyControl; + if (gpcValue) { + document.write("<p>GPC is enabled.</p>"); + } else { + document.write("<p>GPC not enabled.</p>"); + } + </script> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/lorem-ipsum.html b/mobile/android/fenix/app/src/androidTest/assets/pages/lorem-ipsum.html index ca519d6176..8fac0ecf68 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/lorem-ipsum.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/lorem-ipsum.html @@ -1,36 +1,36 @@ <!DOCTYPE html> <html lang="en"> + <head> + <meta charset="utf-8" /> + <title> + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy + eirmod tempor invidunt + </title> + <meta content="width=device-width, initial-scale=1" name="viewport" /> + </head> -<head> - <meta charset="utf-8"/> - <title>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy - eirmod tempor invidunt</title> - <meta content="width=device-width, initial-scale=1" - name="viewport"/> -</head> + <body> + <p id="testContent">Page content: lorem ipsum</p> -<body> - -<p id="testContent">Page content: lorem ipsum</p> - -<h1>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt</h1> - -<p> - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy - eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam - voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet - clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit - amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam - nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, - sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor - sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed - diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, - sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. - Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor - sit amet. -</p> - -</body> + <h1> + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy + eirmod tempor invidunt + </h1> + <p> + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy + eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam + voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet + clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit + amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam + nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed + diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. + Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor + sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed + diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam + erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum + dolor sit amet. + </p> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/mutedVideoPage.html b/mobile/android/fenix/app/src/androidTest/assets/pages/mutedVideoPage.html index 51f93c7e78..6963088be5 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/mutedVideoPage.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/mutedVideoPage.html @@ -1,49 +1,51 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html> -<head> + <head> <title>Muted_Video_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: muted video player</p> -<div class="playbackState"> - <p>Media file not playing</p> -</div> -<div id="video-container" style="text-align:center"> - <button onclick="play()">Play</button> - <button onclick="pause()">Pause</button> - <button onclick="fullscreen()">Full Screen</button> - <br><br> - <video id="mutedVideo" width="420" autoplay muted controls loop> - <source src="../resources/clip.mp4" type="video/mp4"> + </head> + <body> + <p id="testContent">Page content: muted video player</p> + <div class="playbackState"> + <p>Media file not playing</p> + </div> + <div id="video-container" style="text-align: center"> + <button onclick="play()">Play</button> + <button onclick="pause()">Pause</button> + <button onclick="fullscreen()">Full Screen</button> + <br /><br /> + <video id="mutedVideo" width="420" autoplay muted controls loop> + <source src="../resources/clip.mp4" type="video/mp4" /> Your browser does not support HTML video. - </video> -</div> + </video> + </div> -<script> - const mutedVideo = document.getElementById("mutedVideo"); + <script> + const mutedVideo = document.getElementById("mutedVideo"); - function play() { + function play() { mutedVideo.play(); - } + } - function pause() { + function pause() { mutedVideo.pause(); - } + } - function fullscreen() { + function fullscreen() { mutedVideo.requestFullscreen(); - } + } - mutedVideo.addEventListener('playing', (event) => { - document.querySelector('.playbackState').innerHTML="Media file is playing"; - }); + mutedVideo.addEventListener("playing", event => { + document.querySelector(".playbackState").innerHTML = + "Media file is playing"; + }); - mutedVideo.addEventListener('pause', (event) => { - document.querySelector('.playbackState').innerHTML="Media file is paused"; - }); -</script> -</body> + mutedVideo.addEventListener("pause", event => { + document.querySelector(".playbackState").innerHTML = + "Media file is paused"; + }); + </script> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/password.html b/mobile/android/fenix/app/src/androidTest/assets/pages/password.html index f906d33707..0faf69511f 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/password.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/password.html @@ -1,22 +1,23 @@ - <html> + <head> + <meta name="viewport" content="width=device-width" /> + </head> -<head> -<meta name="viewport" content="width=device-width"> -</head> - -<body aria-label="body"> - -<form method="GET" action="passwordsubmit.html"> -<p>Username: <input id="username" type="text" value="test@example.com"></p> -<p>Password: <input id="password" type="password" value="verysecret"></p> -<p><input type="submit" id="submit" value="Login" aria-label="submit"/></p> -</form> - -</body> - -<script> -document.getElementById("password").value = Math.random().toString(); -</script> + <body aria-label="body"> + <form method="GET" action="passwordsubmit.html"> + <p> + Username: <input id="username" type="text" value="test@example.com" /> + </p> + <p> + Password: <input id="password" type="password" value="verysecret" /> + </p> + <p> + <input type="submit" id="submit" value="Login" aria-label="submit" /> + </p> + </form> + </body> + <script> + document.getElementById("password").value = Math.random().toString(); + </script> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/passwordsubmit.html b/mobile/android/fenix/app/src/androidTest/assets/pages/passwordsubmit.html index 5f55881be2..e3cdfdf9eb 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/passwordsubmit.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/passwordsubmit.html @@ -1,8 +1,8 @@ <html> -<head> -<meta name="viewport" content="width=device-width"> -</head> -<body aria-label="body"> -<p>Password submitted. Nope just a test.</p> -</body> + <head> + <meta name="viewport" content="width=device-width" /> + </head> + <body aria-label="body"> + <p>Password submitted. Nope just a test.</p> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/refresh.html b/mobile/android/fenix/app/src/androidTest/assets/pages/refresh.html index 1b8ff6fe9c..1951f917bb 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/refresh.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/refresh.html @@ -1,44 +1,41 @@ - <html> -<script> - - function setCookie(newVal){ - window.document.cookie = "pageStatus = " + newVal + ";"; + <script> + function setCookie(newVal) { + window.document.cookie = "pageStatus = " + newVal + ";"; } - function readCookie(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); - } - return null; + var nameEQ = name + "="; + var ca = document.cookie.split(";"); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == " ") c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + } + return null; } - function valSwap(){ - currentCookie = readCookie("pageStatus"); - if(currentCookie == null) { - setCookie("DEFAULT"); - } + function valSwap() { + currentCookie = readCookie("pageStatus"); + if (currentCookie == null) { + setCookie("DEFAULT"); + } - if (currentCookie.localeCompare("REFRESHED") == 0) { - setCookie("DEFAULT"); - return "DEFAULT"; - } else { - setCookie("REFRESHED"); - return "REFRESHED"; - } + if (currentCookie.localeCompare("REFRESHED") == 0) { + setCookie("DEFAULT"); + return "DEFAULT"; + } else { + setCookie("REFRESHED"); + return "REFRESHED"; + } } var textToShow = valSwap(); - window.addEventListener('DOMContentLoaded', (event) => { - document.querySelector('h1').innerHTML = textToShow; + window.addEventListener("DOMContentLoaded", event => { + document.querySelector("h1").innerHTML = textToShow; }); -</script> -<body> -<h1>DEFAULT</h1> -</body> + </script> + <body> + <h1>DEFAULT</h1> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/storage_check.html b/mobile/android/fenix/app/src/androidTest/assets/pages/storage_check.html index 23d030a4f7..79731be911 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/storage_check.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/storage_check.html @@ -1,23 +1,21 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> + <meta name="viewport" content="width=device-width" /> + <body> + <h1>Storage check</h1> -<h1>Storage check</h1> + <script type="text/javascript"> + if (sessionStorage.getItem("sessionTest") == "session storage") { + document.write("<p>Session storage has value</p>"); + } else { + document.write("<p>Session storage empty</p>"); + } -<script type="text/javascript"> - if (sessionStorage.getItem('sessionTest') == 'session storage') { - document.write('<p>Session storage has value</p>'); - } else { - document.write('<p>Session storage empty</p>'); - } - - if (localStorage.getItem('localTest') == 'local storage') { - document.write('<p>Local storage has value</p>'); - } else { - document.write('<p>Local storage empty</p>'); - } -</script> - -</body> + if (localStorage.getItem("localTest") == "local storage") { + document.write("<p>Local storage has value</p>"); + } else { + document.write("<p>Local storage empty</p>"); + } + </script> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/storage_write.html b/mobile/android/fenix/app/src/androidTest/assets/pages/storage_write.html index a10b469462..e90ebed9e0 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/storage_write.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/storage_write.html @@ -1,28 +1,30 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> + <meta name="viewport" content="width=device-width" /> + <body> + <h1>Storage Write</h1> -<h1>Storage Write</h1> + <p id="cookies"></p> + <button id="setCookies">Set cookies</button> -<p id="cookies"></p> -<button id="setCookies">Set cookies</button> + <script type="text/javascript"> + (function () { + document.getElementById("cookies").textContent = document.cookie + ? document.cookie + : "No cookies set"; + })(); -<script type="text/javascript"> - (function() { - document.getElementById("cookies").textContent = document.cookie?document.cookie:"No cookies set"; - })(); + document + .getElementById("setCookies") + .addEventListener("click", function () { + document.cookie = "user=android"; + document.getElementById("cookies").textContent = document.cookie; + }); - document.getElementById("setCookies").addEventListener("click", function() { - document.cookie = "user=android"; - document.getElementById("cookies").textContent = document.cookie; - }); + sessionStorage.setItem("sessionTest", "session storage"); + localStorage.setItem("localTest", "local storage"); - sessionStorage.setItem('sessionTest', 'session storage'); - localStorage.setItem('localTest', 'local storage'); - - document.write('<p>Values written to storage</p>'); -</script> - -</body> + document.write("<p>Values written to storage</p>"); + </script> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/assets/pages/videoMediaPage.html b/mobile/android/fenix/app/src/androidTest/assets/pages/videoMediaPage.html index 50af35c170..3245cb5fa2 100644 --- a/mobile/android/fenix/app/src/androidTest/assets/pages/videoMediaPage.html +++ b/mobile/android/fenix/app/src/androidTest/assets/pages/videoMediaPage.html @@ -1,49 +1,51 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html> -<head> + <head> <title>Video_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: video player</p> -<div class="playbackState"> - <p>Media file not playing</p> -</div> -<div id="video-container" style="text-align:center"> - <button onclick="play()">Play</button> - <button onclick="pause()">Pause</button> - <button onclick="fullscreen()">Full Screen</button> - <br><br> - <video id="video" width="420" autoplay controls loop> - <source src="../resources/clip.mp4" type="video/mp4"> + </head> + <body> + <p id="testContent">Page content: video player</p> + <div class="playbackState"> + <p>Media file not playing</p> + </div> + <div id="video-container" style="text-align: center"> + <button onclick="play()">Play</button> + <button onclick="pause()">Pause</button> + <button onclick="fullscreen()">Full Screen</button> + <br /><br /> + <video id="video" width="420" autoplay controls loop> + <source src="../resources/clip.mp4" type="video/mp4" /> Your browser does not support HTML video. - </video> -</div> + </video> + </div> -<script> - const video = document.getElementById("video"); + <script> + const video = document.getElementById("video"); - function play() { + function play() { video.play(); - } + } - function pause() { + function pause() { video.pause(); - } + } - function fullscreen() { + function fullscreen() { video.requestFullscreen(); - } + } - video.addEventListener('playing', (event) => { - document.querySelector('.playbackState').innerHTML="Media file is playing"; - }); + video.addEventListener("playing", event => { + document.querySelector(".playbackState").innerHTML = + "Media file is playing"; + }); - video.addEventListener('pause', (event) => { - document.querySelector('.playbackState').innerHTML="Media file is paused"; - }); -</script> -</body> + video.addEventListener("pause", event => { + document.querySelector(".playbackState").innerHTML = + "Media file is paused"; + }); + </script> + </body> </html> diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt index ac40972db6..fb8fe67616 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/helpers/AppAndSystemHelper.kt @@ -46,6 +46,7 @@ import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity import org.mozilla.fenix.helpers.Constants.PackageName.PIXEL_LAUNCHER import org.mozilla.fenix.helpers.Constants.PackageName.YOUTUBE_APP import org.mozilla.fenix.helpers.Constants.TAG +import org.mozilla.fenix.helpers.MatcherHelper.itemWithResIdContainingText import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.TestAssetHelper.waitingTimeShort import org.mozilla.fenix.helpers.TestHelper.appContext @@ -586,4 +587,13 @@ object AppAndSystemHelper { e.printStackTrace() } } + + fun dismissSetAsDefaultBrowserOnboardingDialog() { + Log.i(TAG, "dismissSetAsDefaultBrowserOnboardingDialog: Detected API ${Build.VERSION.SDK_INT}") + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + Log.i(TAG, "dismissSetAsDefaulltBrowserOnboardingDialog: Trying to click the \"Cancel\" dialog button.") + itemWithResIdContainingText("android:id/button2", "Cancel").click() + Log.i(TAG, "dismissSetAsDefaulltBrowserOnboardingDialog: Clicked the \"Cancel\" dialog button.") + } + } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark.js b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark.js index e1210bd24e..766a033b3a 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark.js +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark.js @@ -8,19 +8,17 @@ */ EnableEngines(["bookmarks"]); -var phases = { "phase1": "profile1" }; - +var phases = { phase1: "profile1" }; // expected bookmark state var bookmarksCreated = { -"mobile": [{ - uri: "http://www.example.com/", - title: "Example Domain"}] + mobile: [ + { + uri: "http://www.example.com/", + title: "Example Domain", + }, + ], }; // sync and verify bookmarks -Phase("phase1", [ - [Sync], - [Bookmarks.add, bookmarksCreated], - [Sync] -]);
\ No newline at end of file +Phase("phase1", [[Sync], [Bookmarks.add, bookmarksCreated], [Sync]]); diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark_desktop.js b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark_desktop.js index a6a42aa6d0..69489f84a7 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark_desktop.js +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_bookmark_desktop.js @@ -8,18 +8,17 @@ */ EnableEngines(["bookmarks"]); -var phases = { "phase1": "profile1" }; - +var phases = { phase1: "profile1" }; // expected bookmark state var bookmarksExpected = { -"mobile": [{ - uri: "http://www.example.com/", - title: "Example Domain"}] + mobile: [ + { + uri: "http://www.example.com/", + title: "Example Domain", + }, + ], }; // sync and verify bookmarks -Phase("phase1", [ - [Sync], - [Bookmarks.verify, bookmarksExpected], -]); +Phase("phase1", [[Sync], [Bookmarks.verify, bookmarksExpected]]); diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history.js b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history.js index 8b915945e2..9aa96f4aef 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history.js +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history.js @@ -8,26 +8,18 @@ */ EnableEngines(["history"]); -var phases = { "phase1": "profile1" }; - +var phases = { phase1: "profile1" }; // expected history state var historyCreated = [ - { uri: "http://www.example.com/", - visits: [ - { type: 1 , - date: 0 - }, - { type: 2, - date: -1 - } - ] - } + { + uri: "http://www.example.com/", + visits: [ + { type: 1, date: 0 }, + { type: 2, date: -1 }, + ], + }, ]; // sync and verify history -Phase("phase1", [ - [Sync], - [History.add, historyCreated], - [Sync] -]); +Phase("phase1", [[Sync], [History.add, historyCreated], [Sync]]); diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history_desktop.js b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history_desktop.js index 5dfdd1aa47..7cf2acaccb 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history_desktop.js +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_history_desktop.js @@ -8,21 +8,12 @@ */ EnableEngines(["history"]); -var phases = { "phase1": "profile1" }; - +var phases = { phase1: "profile1" }; // expected history state var historyExpected = [ - { uri: "http://www.example.com/", - visits: [ - { type: 1 }, - { type: 2 } - ] - } + { uri: "http://www.example.com/", visits: [{ type: 1 }, { type: 2 }] }, ]; // sync and verify history -Phase("phase1", [ - [Sync], - [History.verify, historyExpected] -]); +Phase("phase1", [[Sync], [History.verify, historyExpected]]); diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_logins.js b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_logins.js index 16eb4bcf34..bc1d1e1071 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_logins.js +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/syncintegration/test_logins.js @@ -8,11 +8,11 @@ */ EnableEngines(["passwords"]); -var phases = { "phase1": "profile1" }; - +var phases = { phase1: "profile1" }; // expected tabs state -var password_list = [{ +var password_list = [ + { hostname: "https://accounts.google.com", submitURL: "https://accounts.google.com/signin/challenge/sl/password", realm: null, @@ -20,11 +20,8 @@ var password_list = [{ password: "test15mz", usernameField: "Email", passwordField: "Passwd", - }]; + }, +]; // sync and verify tabs -Phase("phase1", [ - [Sync], - [Passwords.add, password_list], - [Sync] -]);
\ No newline at end of file +Phase("phase1", [[Sync], [Passwords.add, password_list], [Sync]]); diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 96ca6ad724..d575521a5d 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -9,7 +9,6 @@ import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.pressBack import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import kotlinx.coroutines.runBlocking -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -237,7 +236,6 @@ class BookmarksTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1919261 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun verifyOpenAllInNewTabsOptionTest() { val webPages = listOf( @@ -261,11 +259,6 @@ class BookmarksTest : TestSetup() { createBookmark(webPages[1].url, "root") createBookmark(webPages[2].url, "root") createBookmark(webPages[3].url, "sub") - }.openTabDrawer { - closeTab() - } - - browserScreen { }.openThreeDotMenu { }.openBookmarks { }.openThreeDotMenu("root") { @@ -281,7 +274,6 @@ class BookmarksTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1919262 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun verifyOpenAllInPrivateTabsTest() { val webPages = listOf( @@ -301,11 +293,6 @@ class BookmarksTest : TestSetup() { browserScreen { createBookmark(webPages[0].url, "root") createBookmark(webPages[1].url, "sub") - }.openTabDrawer { - closeTab() - } - - browserScreen { }.openThreeDotMenu { }.openBookmarks { }.openThreeDotMenu("root") { diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeBookmarksTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeBookmarksTest.kt index 398533830a..995e43f794 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeBookmarksTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeBookmarksTest.kt @@ -233,11 +233,6 @@ class ComposeBookmarksTest : TestSetup() { createBookmark(webPages[1].url, "root") createBookmark(webPages[2].url, "root") createBookmark(webPages[3].url, "sub") - }.openComposeTabDrawer(activityTestRule) { - closeTab() - } - - browserScreen { }.openThreeDotMenu { }.openBookmarks { }.openThreeDotMenu("root") { @@ -272,11 +267,6 @@ class ComposeBookmarksTest : TestSetup() { browserScreen { createBookmark(webPages[0].url, "root") createBookmark(webPages[1].url, "sub") - }.openComposeTabDrawer(activityTestRule) { - closeTab() - } - - browserScreen { }.openThreeDotMenu { }.openBookmarks { }.openThreeDotMenu("root") { diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCrashReportingTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCrashReportingTest.kt index e815972900..979824f2f8 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCrashReportingTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeCrashReportingTest.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.ui import androidx.compose.ui.test.junit4.AndroidComposeTestRule -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -48,7 +47,6 @@ class ComposeCrashReportingTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2336134 - @Ignore("Test failure caused by: https://github.com/mozilla-mobile/fenix/issues/19964") @Test fun restoreTabFromTabCrashedReporterTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHistoryTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHistoryTest.kt index d3b17f57d9..2268825d3a 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHistoryTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeHistoryTest.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.ui import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu import androidx.test.espresso.Espresso.pressBack -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -155,7 +154,6 @@ class ComposeHistoryTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/339696 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun openMultipleSelectedHistoryItemsInANewTabTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt index eaa76b1481..30f1ea8dc5 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/ComposeSearchTest.kt @@ -55,7 +55,7 @@ class ComposeSearchTest : TestSetup() { private lateinit var searchMockServer: MockWebServer private val queryString: String = "firefox" private val generalEnginesList = listOf("DuckDuckGo", "Google", "Bing") - private val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + private val topicEnginesList = listOf("Wikipedia", "eBay") @get:Rule val activityTestRule = AndroidComposeTestRule( @@ -111,7 +111,7 @@ class ComposeSearchTest : TestSetup() { verifySearchToolbar(isDisplayed = true) clickSearchSelectorButton() verifySearchShortcutListContains( - "DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay", + "DuckDuckGo", "Google", "Wikipedia", "Bing", "eBay", "Bookmarks", "Tabs", "History", "Search settings", ) } @@ -153,7 +153,7 @@ class ComposeSearchTest : TestSetup() { // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154196 @Test fun verifySearchPlaceholderForTopicSpecificSearchEnginesTest() { - val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + val topicEnginesList = listOf("Wikipedia", "eBay") topicEnginesList.forEach { homeScreen { @@ -229,7 +229,7 @@ class ComposeSearchTest : TestSetup() { @SmokeTest @Test fun searchEnginesCanBeChangedTemporarilyFromSearchSelectorMenuTest() { - val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay") + val enginesList = listOf("DuckDuckGo", "Google", "Wikipedia", "Bing", "eBay") enginesList.forEach { homeScreen { @@ -303,13 +303,12 @@ class ComposeSearchTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/1592229 - @Ignore("Test run timing out: https://github.com/mozilla-mobile/fenix/issues/27704") @Test fun verifyAPageIsAddedToASearchGroupOnlyOnceTest() { val firstPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 1).url val secondPageUrl = TestAssetHelper.getGenericAsset(searchMockServer, 2).url val originPageUrl = - "http://localhost:${searchMockServer.port}/pages/searchResults.html?search=test%20search".toUri() + "http://localhost:${searchMockServer.port}/pages/searchResults.html?search=firefox".toUri() val searchEngineName = "TestSearchEngine" // setting our custom mockWebServer search URL setCustomSearchEngine(searchMockServer, searchEngineName) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt index be99ebe8af..224de9a675 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/CrashReportingTest.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.ui import androidx.compose.ui.test.junit4.AndroidComposeTestRule -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R @@ -47,7 +46,6 @@ class CrashReportingTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2336134 - @Ignore("Test failure caused by: https://github.com/mozilla-mobile/fenix/issues/19964") @Test fun restoreTabFromTabCrashedReporterTest() { val website = TestAssetHelper.getGenericAsset(mockWebServer, 1) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt index 2e881e16fe..938c13d857 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/FirefoxSuggestTest.kt @@ -51,7 +51,7 @@ class FirefoxSuggestTest : TestSetup() { ), "Houzz" to listOf( "Houzz.com - Official Site", - "houzz.com/products?m_refid=us-dsp-mpl-admp-219577_15416306_kwd-353208810&adcid=319104989&mfadid=adm&utm_source=admarketplace&utm_medium=cpc&utm_campaign=Privacy&utm_term=houzz&utm_content=319104989us1287${getSponsoredFxSuggestPlaceHolder()}", + "houzz.com/products?m_refid=us-dsp-mpl-admp-219577_15416306_kwd-353208810&adcid=319104989us1287${getSponsoredFxSuggestPlaceHolder()}&utm_source=admarketplace&utm_medium=cpc&utm_campaign=Privacy&utm_term=houzz&utm_content=319104989&mfadid=adm", ), "Spanx" to listOf( "SPANX® - Official Site", diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt index 317aa9c397..b551ec831a 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/LoginsTest.kt @@ -8,7 +8,6 @@ import android.os.Build import android.view.autofill.AutofillManager import androidx.core.net.toUri import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -538,7 +537,6 @@ class LoginsTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/593768 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1812995") @Test fun doNotSaveOptionWillNotUpdateALoginTest() { val loginPage = "https://mozilla-mobile.github.io/testapp/v2.0/loginForm.html" @@ -547,19 +545,18 @@ class LoginsTest : TestSetup() { navigationToolbar { }.enterURLAndEnterToBrowser(loginPage.toUri()) { setPageObjectText(itemWithResId("username"), "mozilla") + waitForAppWindowToBeUpdated() setPageObjectText(itemWithResId("password"), "firefox") + waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Save")) - }.openTabDrawer { - closeTab() - } - - navigationToolbar { - }.enterURLAndEnterToBrowser(loginPage.toUri()) { + waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("togglePassword")) setPageObjectText(itemWithResId("username"), "mozilla") + waitForAppWindowToBeUpdated() setPageObjectText(itemWithResId("password"), "fenix") + waitForAppWindowToBeUpdated() clickPageObject(itemWithResId("submit")) verifySaveLoginPromptIsDisplayed() clickPageObject(itemWithText("Don’t update")) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NimbusMessagingHomescreenTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NimbusMessagingHomescreenTest.kt index 95ced206a2..cad28b1878 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NimbusMessagingHomescreenTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/NimbusMessagingHomescreenTest.kt @@ -84,7 +84,7 @@ class NimbusMessagingHomescreenTest : TestSetup() { HomeScreenSection.POCKET to false, HomeScreenSection.POCKET_SPONSORED_STORIES to false, HomeScreenSection.RECENT_EXPLORATIONS to false, - HomeScreenSection.RECENTLY_SAVED to false, + HomeScreenSection.BOOKMARKS to false, HomeScreenSection.TOP_SITES to false, ), ) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt index 4eead4f63c..d2da41ca11 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/OnboardingTest.kt @@ -1,9 +1,12 @@ package org.mozilla.fenix.ui +import android.os.Build import androidx.compose.ui.test.junit4.AndroidComposeTestRule import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest +import org.mozilla.fenix.helpers.AppAndSystemHelper.dismissSetAsDefaultBrowserOnboardingDialog +import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithCondition import org.mozilla.fenix.helpers.AppAndSystemHelper.runWithLauncherIntent import org.mozilla.fenix.helpers.HomeActivityIntentTestRule import org.mozilla.fenix.helpers.TestSetup @@ -20,9 +23,13 @@ class OnboardingTest : TestSetup() { // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2122321 @Test fun verifyFirstOnboardingCardItemsTest() { - runWithLauncherIntent(activityTestRule) { - homeScreen { - verifyFirstOnboardingCard(activityTestRule) + // Run UI test only on devices with Android version lower than 10 + // because on Android 10 and above, the default browser dialog is shown and the first onboarding card is skipped + runWithCondition(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + runWithLauncherIntent(activityTestRule) { + homeScreen { + verifyFirstOnboardingCard(activityTestRule) + } } } } @@ -31,15 +38,19 @@ class OnboardingTest : TestSetup() { @SmokeTest @Test fun verifyFirstOnboardingCardItemsFunctionalityTest() { - runWithLauncherIntent(activityTestRule) { - homeScreen { - clickDefaultCardNotNowOnboardingButton(activityTestRule) - verifySecondOnboardingCard(activityTestRule) - swipeSecondOnboardingCardToRight() - }.clickSetAsDefaultBrowserOnboardingButton(activityTestRule) { - verifyAndroidDefaultAppsMenuAppears() - }.goBackToOnboardingScreen { - verifySecondOnboardingCard(activityTestRule) + // Run UI test only on devices with Android version lower than 10 + // because on Android 10 and above, the default browser dialog is shown and the first onboarding card is skipped + runWithCondition(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + runWithLauncherIntent(activityTestRule) { + homeScreen { + clickDefaultCardNotNowOnboardingButton(activityTestRule) + verifySecondOnboardingCard(activityTestRule) + swipeSecondOnboardingCardToRight() + }.clickSetAsDefaultBrowserOnboardingButton(activityTestRule) { + verifyAndroidDefaultAppsMenuAppears() + }.goBackToOnboardingScreen { + verifySecondOnboardingCard(activityTestRule) + } } } } @@ -49,7 +60,12 @@ class OnboardingTest : TestSetup() { fun verifySecondOnboardingCardItemsTest() { runWithLauncherIntent(activityTestRule) { homeScreen { - clickDefaultCardNotNowOnboardingButton(activityTestRule) + // Check if the device is running on Android version lower than 10 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + // If true, click the "Not Now" button from the first onboarding card + clickDefaultCardNotNowOnboardingButton(activityTestRule) + } + dismissSetAsDefaultBrowserOnboardingDialog() verifySecondOnboardingCard(activityTestRule) } } @@ -61,7 +77,12 @@ class OnboardingTest : TestSetup() { fun verifyThirdOnboardingCardSignInFunctionalityTest() { runWithLauncherIntent(activityTestRule) { homeScreen { - clickDefaultCardNotNowOnboardingButton(activityTestRule) + // Check if the device is running on Android version lower than 10 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + // If true, click the "Not Now" button from the first onboarding card + clickDefaultCardNotNowOnboardingButton(activityTestRule) + } + dismissSetAsDefaultBrowserOnboardingDialog() verifySecondOnboardingCard(activityTestRule) clickAddSearchWidgetNotNowOnboardingButton(activityTestRule) verifyThirdOnboardingCard(activityTestRule) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/PocketTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/PocketTest.kt index 674924c954..e5d52152e3 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/PocketTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/PocketTest.kt @@ -2,6 +2,7 @@ package org.mozilla.fenix.ui import androidx.compose.ui.test.junit4.AndroidComposeTestRule import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.helpers.Constants @@ -63,6 +64,7 @@ class PocketTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2252513 + @Ignore("Bug 1868291 - Intermittent failure in org.mozilla.fenix.ui.PocketTest.openPocketStoryItemTest") @Test fun openPocketStoryItemTest() { activityTestRule.activityRule.applySettingsExceptions { diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt index ede7b06b5d..6d2202c3ba 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SearchTest.kt @@ -68,7 +68,7 @@ class SearchTest : TestSetup() { private lateinit var searchMockServer: MockWebServer private var queryString = "firefox" private val generalEnginesList = listOf("DuckDuckGo", "Google", "Bing") - private val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + private val topicEnginesList = listOf("Wikipedia", "eBay") @get:Rule val activityTestRule = AndroidComposeTestRule( @@ -123,7 +123,7 @@ class SearchTest : TestSetup() { verifySearchToolbar(isDisplayed = true) clickSearchSelectorButton() verifySearchShortcutListContains( - "DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay", + "DuckDuckGo", "Google", "Wikipedia", "Bing", "eBay", "Bookmarks", "Tabs", "History", "Search settings", ) } @@ -165,7 +165,7 @@ class SearchTest : TestSetup() { // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2154196 @Test fun verifySearchPlaceholderForTopicSpecificSearchEnginesTest() { - val topicEnginesList = listOf("Amazon.com", "Wikipedia", "eBay") + val topicEnginesList = listOf("Wikipedia", "eBay") topicEnginesList.forEach { homeScreen { @@ -241,7 +241,7 @@ class SearchTest : TestSetup() { @SmokeTest @Test fun searchEnginesCanBeChangedTemporarilyFromSearchSelectorMenuTest() { - val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia", "Bing", "eBay") + val enginesList = listOf("DuckDuckGo", "Google", "Wikipedia", "Bing", "eBay") enginesList.forEach { homeScreen { @@ -802,7 +802,6 @@ class SearchTest : TestSetup() { verifySearchShortcutListContains( "Google", "Bing", - "Amazon.com", "DuckDuckGo", "ويكيبيديا (ar)", ) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt index 3e37fb5e3b..1144deb9c1 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsAboutTest.kt @@ -21,7 +21,7 @@ import org.mozilla.fenix.ui.robots.homeScreen class SettingsAboutTest : TestSetup() { @get:Rule - val activityIntentTestRule = HomeActivityIntentTestRule() + val activityIntentTestRule = HomeActivityIntentTestRule.withDefaultSettingsOverrides() @Rule @JvmField @@ -61,10 +61,6 @@ class SettingsAboutTest : TestSetup() { // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/246961 @Test fun verifyAboutFirefoxMenuItems() { - activityIntentTestRule.applySettingsExceptions { - it.isJumpBackInCFREnabled = false - it.isTCPCFREnabled = false - } homeScreen { }.openThreeDotMenu { }.openSettings { diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt index 8dc31c64e8..0f41e4ac94 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsHomepageTest.kt @@ -124,12 +124,12 @@ class SettingsHomepageTest : TestSetup() { }.openThreeDotMenu { }.bookmarkPage { }.goToHomescreen { - verifyRecentBookmarksSectionIsDisplayed(exists = true) + verifyBookmarksSectionIsDisplayed(exists = true) }.openThreeDotMenu { }.openCustomizeHome { clickRecentBookmarksButton() }.goBackToHomeScreen { - verifyRecentBookmarksSectionIsDisplayed(exists = false) + verifyBookmarksSectionIsDisplayed(exists = false) } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt index 5abbaa8b4a..d12d3a9c8c 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSearchTest.kt @@ -9,7 +9,6 @@ import androidx.test.espresso.Espresso.pressBack import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -511,7 +510,6 @@ class SettingsSearchTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/412927 - @Ignore("Failing, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1807268") @Test fun verifyShowClipboardSuggestionsToggleTest() { val link = "https://www.mozilla.org/en-US/" @@ -599,12 +597,11 @@ class SettingsSearchTest : TestSetup() { verifySearchShortcutChecked( EngineShortcut(name = "Google", checkboxIndex = 1, isChecked = true), EngineShortcut(name = "Bing", checkboxIndex = 4, isChecked = true), - EngineShortcut(name = "Amazon.com", checkboxIndex = 7, isChecked = true), - EngineShortcut(name = "DuckDuckGo", checkboxIndex = 10, isChecked = true), - EngineShortcut(name = "eBay", checkboxIndex = 13, isChecked = true), - EngineShortcut(name = "Wikipedia", checkboxIndex = 16, isChecked = true), - EngineShortcut(name = "Reddit", checkboxIndex = 19, isChecked = false), - EngineShortcut(name = "YouTube", checkboxIndex = 22, isChecked = false), + EngineShortcut(name = "DuckDuckGo", checkboxIndex = 7, isChecked = true), + EngineShortcut(name = "eBay", checkboxIndex = 10, isChecked = true), + EngineShortcut(name = "Wikipedia", checkboxIndex = 13, isChecked = true), + EngineShortcut(name = "Reddit", checkboxIndex = 16, isChecked = false), + EngineShortcut(name = "YouTube", checkboxIndex = 19, isChecked = false), ) } } @@ -619,14 +616,13 @@ class SettingsSearchTest : TestSetup() { }.openSearchSubMenu { openManageShortcutsMenu() selectSearchShortcut(EngineShortcut(name = "Google", checkboxIndex = 1)) - selectSearchShortcut(EngineShortcut(name = "Amazon.com", checkboxIndex = 7)) - selectSearchShortcut(EngineShortcut(name = "Reddit", checkboxIndex = 19)) - selectSearchShortcut(EngineShortcut(name = "YouTube", checkboxIndex = 22)) + selectSearchShortcut(EngineShortcut(name = "Reddit", checkboxIndex = 16)) + selectSearchShortcut(EngineShortcut(name = "YouTube", checkboxIndex = 19)) exitMenu() } searchScreen { clickSearchSelectorButton() - verifySearchShortcutListContains("Google", "Amazon.com", shouldExist = false) + verifySearchShortcutListContains("Google", shouldExist = false) verifySearchShortcutListContains("YouTube", shouldExist = true) verifySearchShortcutListContains("Reddit", shouldExist = true) } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt index 4b3842fc6a..720f90c4c8 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/SettingsSitePermissionsTest.kt @@ -8,7 +8,6 @@ import androidx.core.net.toUri import androidx.test.espresso.Espresso.pressBack import androidx.test.filters.SdkSuppress import mozilla.components.concept.engine.mediasession.MediaSession -import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.mozilla.fenix.customannotations.SmokeTest @@ -146,7 +145,6 @@ class SettingsSitePermissionsTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2286807 - @Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1827599") @SmokeTest @Test fun verifyAutoplayBlockAudioOnlySettingOnMutedVideoTest() { @@ -210,7 +208,6 @@ class SettingsSitePermissionsTest : TestSetup() { } // TestRail link: https://testrail.stage.mozaws.net/index.php?/cases/view/2286806 - @Ignore("Failing, see https://bugzilla.mozilla.org/show_bug.cgi?id=1827599") @Test fun verifyAutoplayAllowAudioVideoSettingOnMutedVideoTest() { val mutedVideoTestPage = getMutedVideoPageAsset(mockWebServer) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index 2732ccbcab..cbbceaff97 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -430,8 +430,8 @@ class HomeScreenRobot { fun verifyJumpBackInShowAllButton() = assertUIObjectExists(itemContainingText(getStringResource(R.string.recent_tabs_show_all))) fun verifyRecentlyVisitedSectionIsDisplayed(exists: Boolean) = assertUIObjectExists(itemContainingText(getStringResource(R.string.history_metadata_header_2)), exists = exists) - fun verifyRecentBookmarksSectionIsDisplayed(exists: Boolean) = - assertUIObjectExists(itemContainingText(getStringResource(R.string.recently_saved_title)), exists = exists) + fun verifyBookmarksSectionIsDisplayed(exists: Boolean) = + assertUIObjectExists(itemContainingText(getStringResource(R.string.home_bookmarks_title)), exists = exists) fun verifyRecentlyVisitedSearchGroupDisplayed(shouldBeDisplayed: Boolean, searchTerm: String, groupSize: Int) { // checks if the search group exists in the Recently visited section @@ -439,12 +439,12 @@ class HomeScreenRobot { scrollToElementByText("Recently visited") assertUIObjectExists( itemContainingText(searchTerm) - .getFromParent(UiSelector().text("$groupSize sites")), + .getFromParent(UiSelector().text("$groupSize pages")), ) } else { assertUIObjectIsGone( itemContainingText(searchTerm) - .getFromParent(UiSelector().text("$groupSize sites")), + .getFromParent(UiSelector().text("$groupSize pages")), ) } } diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt index 9d1c919a37..c78994784a 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuHomepageRobot.kt @@ -444,7 +444,7 @@ private fun jumpBackInButton() = onView(allOf(withText(R.string.customize_toggle_jump_back_in))) private fun recentBookmarksButton() = - onView(allOf(withText(R.string.customize_toggle_recent_bookmarks))) + onView(allOf(withText(R.string.customize_toggle_bookmarks))) private fun recentlyVisitedButton() = onView(allOf(withText(R.string.customize_toggle_recently_visited))) diff --git a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index a20a79088a..70317c8937 100644 --- a/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/mobile/android/fenix/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -162,23 +162,25 @@ class ThreeDotMenuMainRobot { assertUIObjectExists( normalBrowsingNewTabButton(), bookmarksButton(), + addBookmarkButton(), historyButton(), downloadsButton(), + passwordsButton(), addOnsButton(), syncAndSaveDataButton(), findInPageButton(), + translateButton(), desktopSiteButton(), reportSiteIssueButton(), - addToHomeScreenButton(), - addToShortcutsButton(), - saveToCollectionButton(), - addBookmarkButton(), desktopSiteToggle(isRequestDesktopSiteEnabled), - translateButton(), + ) // Swipe to second part of menu expandMenu() assertUIObjectExists( + addToHomeScreenButton(), + addToShortcutsButton(), + saveToCollectionButton(), settingsButton(), ) if (FxNimbus.features.print.value().browserPrintEnabled) { @@ -197,6 +199,7 @@ class ThreeDotMenuMainRobot { bookmarksButton(), historyButton(), downloadsButton(), + passwordsButton(), addOnsButton(), // Disabled step due to https://github.com/mozilla-mobile/fenix/issues/26788 // syncAndSaveDataButton, @@ -717,6 +720,8 @@ private fun historyButton() = itemContainingText(getStringResource(R.string.library_history)) private fun downloadsButton() = itemContainingText(getStringResource(R.string.library_downloads)) +private fun passwordsButton() = + itemContainingText(getStringResource(R.string.browser_menu_passwords)) private fun addOnsButton() = itemContainingText(getStringResource(R.string.browser_menu_extensions)) private fun desktopSiteButton() = diff --git a/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml index dcf89bab7b..2da32f3afe 100644 --- a/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml +++ b/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml @@ -8,8 +8,7 @@ android:shortcutId="password_manager" android:enabled="true" android:icon="@drawable/ic_static_password_shortcut" - android:shortcutShortLabel="@string/home_screen_shortcut_passwords" - android:shortcutLongLabel="@string/home_screen_shortcut_passwords"> + android:shortcutShortLabel="@string/home_screen_shortcut_passwords"> <intent android:action="org.mozilla.fenix.OPEN_PASSWORD_MANAGER" android:targetPackage="org.mozilla.firefox_beta" @@ -19,8 +18,7 @@ android:shortcutId="open_new_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_TAB" android:targetPackage="org.mozilla.firefox_beta" @@ -30,8 +28,7 @@ android:shortcutId="open_new_private_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_private_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_PRIVATE_TAB" android:targetPackage="org.mozilla.firefox_beta" diff --git a/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml index a0af5e9191..42f365234c 100644 --- a/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml +++ b/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml @@ -8,8 +8,7 @@ android:shortcutId="password_manager" android:enabled="true" android:icon="@drawable/ic_static_password_shortcut" - android:shortcutShortLabel="@string/home_screen_shortcut_passwords" - android:shortcutLongLabel="@string/home_screen_shortcut_passwords"> + android:shortcutShortLabel="@string/home_screen_shortcut_passwords"> <intent android:action="org.mozilla.fenix.OPEN_PASSWORD_MANAGER" android:targetPackage="org.mozilla.fenix.debug" @@ -19,8 +18,7 @@ android:shortcutId="open_new_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_TAB" android:targetPackage="org.mozilla.fenix.debug" @@ -30,8 +28,7 @@ android:shortcutId="open_new_private_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_private_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_PRIVATE_TAB" android:targetPackage="org.mozilla.fenix.debug" diff --git a/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js b/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js index f4af7d3b0d..f1fcd6d241 100644 --- a/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js +++ b/mobile/android/fenix/app/src/main/assets/highRiskErrorPages.js @@ -6,37 +6,39 @@ * Handles the parsing of the ErrorPages URI and then passes them to injectValues */ function parseQuery(queryString) { - if (queryString[0] === '?') { - queryString = queryString.substr(1); - } - const query = Object.fromEntries(new URLSearchParams(queryString).entries()); - injectValues(query); -}; + if (queryString[0] === "?") { + queryString = queryString.substr(1); + } + const query = Object.fromEntries(new URLSearchParams(queryString).entries()); + injectValues(query); +} /** * Updates the HTML elements based on the queryMap */ function injectValues(queryMap) { - // Go through each element and inject the values - document.title = queryMap.title; - document.getElementById('errorTitleText').innerHTML = queryMap.title; - document.getElementById('errorShortDesc').innerHTML = queryMap.description; + // Go through each element and inject the values + document.title = queryMap.title; + document.getElementById("errorTitleText").innerHTML = queryMap.title; + document.getElementById("errorShortDesc").innerHTML = queryMap.description; - // If no image is passed in, remove the element so as not to leave an empty iframe - const errorImage = document.getElementById('errorImage'); - if (!queryMap.image) { - errorImage.remove(); - } else { - errorImage.src = "resource://android/assets/" + queryMap.image; - } + // If no image is passed in, remove the element so as not to leave an empty iframe + const errorImage = document.getElementById("errorImage"); + if (!queryMap.image) { + errorImage.remove(); + } else { + errorImage.src = "resource://android/assets/" + queryMap.image; + } } -document.addEventListener('DOMContentLoaded', function () { - if (window.history.length == 1) { - document.getElementById('backButton').style.display = 'none'; - } else { - document.getElementById('backButton').addEventListener('click', () => window.history.back() ); - } +document.addEventListener("DOMContentLoaded", function () { + if (window.history.length == 1) { + document.getElementById("backButton").style.display = "none"; + } else { + document + .getElementById("backButton") + .addEventListener("click", () => window.history.back()); + } }); parseQuery(document.documentURI); diff --git a/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html b/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html index c73012b143..7f0e6e3fc6 100644 --- a/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html +++ b/mobile/android/fenix/app/src/main/assets/high_risk_error_pages.html @@ -8,7 +8,10 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width; user-scalable=false;" /> - <meta http-equiv="Content-Security-Policy" content="default-src resource:; object-src 'none'" /> + <meta + http-equiv="Content-Security-Policy" + content="default-src resource:; object-src 'none'" + /> <link rel="stylesheet" type="text/css" href="shared_error_style.css" /> <link rel="stylesheet" type="text/css" href="high_risk_error_style.css" /> </head> diff --git a/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js b/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js index 760ce65868..23a3fe91b4 100644 --- a/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js +++ b/mobile/android/fenix/app/src/main/assets/lowMediumErrorPages.js @@ -6,52 +6,56 @@ * Handles the parsing of the ErrorPages URI and then passes them to injectValues */ function parseQuery(queryString) { - if (queryString[0] === '?') { - queryString = queryString.substr(1); - } - const query = Object.fromEntries(new URLSearchParams(queryString).entries()); - injectValues(query); - updateShowSSL(query); - updateShowHSTS(query); -}; + if (queryString[0] === "?") { + queryString = queryString.substr(1); + } + const query = Object.fromEntries(new URLSearchParams(queryString).entries()); + injectValues(query); + updateShowSSL(query); + updateShowHSTS(query); +} /** * Updates the HTML elements based on the queryMap */ function injectValues(queryMap) { - const tryAgainButton = document.getElementById('errorTryAgain'); - const continueHttpButton = document.getElementById("continueHttp"); - const backFromHttpButton = document.getElementById('backFromHttp'); + const tryAgainButton = document.getElementById("errorTryAgain"); + const continueHttpButton = document.getElementById("continueHttp"); + const backFromHttpButton = document.getElementById("backFromHttp"); - // Go through each element and inject the values - document.title = queryMap.title; - tryAgainButton.innerHTML = queryMap.button; - continueHttpButton.innerHTML = queryMap.continueHttpButton; - backFromHttpButton.innerHTML = queryMap.badCertGoBack; - document.getElementById('errorTitleText').innerHTML = queryMap.title; - document.getElementById('errorShortDesc').innerHTML = queryMap.description; - document.getElementById('advancedButton').innerHTML = queryMap.badCertAdvanced; - document.getElementById('badCertTechnicalInfo').innerHTML = queryMap.badCertTechInfo; - document.getElementById('advancedPanelBackButton').innerHTML = queryMap.badCertGoBack; - document.getElementById('advancedPanelAcceptButton').innerHTML = queryMap.badCertAcceptTemporary; + // Go through each element and inject the values + document.title = queryMap.title; + tryAgainButton.innerHTML = queryMap.button; + continueHttpButton.innerHTML = queryMap.continueHttpButton; + backFromHttpButton.innerHTML = queryMap.badCertGoBack; + document.getElementById("errorTitleText").innerHTML = queryMap.title; + document.getElementById("errorShortDesc").innerHTML = queryMap.description; + document.getElementById("advancedButton").innerHTML = + queryMap.badCertAdvanced; + document.getElementById("badCertTechnicalInfo").innerHTML = + queryMap.badCertTechInfo; + document.getElementById("advancedPanelBackButton").innerHTML = + queryMap.badCertGoBack; + document.getElementById("advancedPanelAcceptButton").innerHTML = + queryMap.badCertAcceptTemporary; - // If no image is passed in, remove the element so as not to leave an empty iframe - const errorImage = document.getElementById('errorImage'); - if (!queryMap.image) { - errorImage.remove(); - } else { - errorImage.src = "resource://android/assets/" + queryMap.image; - } + // If no image is passed in, remove the element so as not to leave an empty iframe + const errorImage = document.getElementById("errorImage"); + if (!queryMap.image) { + errorImage.remove(); + } else { + errorImage.src = "resource://android/assets/" + queryMap.image; + } - if (queryMap.showContinueHttp === "true") { - // On the "HTTPS-Only" error page "Try again" doesn't make sense since reloading the page - // will just show an error page again. - tryAgainButton.style.display = 'none'; - } else { - continueHttpButton.style.display = 'none'; - backFromHttpButton.style.display = 'none'; - } -}; + if (queryMap.showContinueHttp === "true") { + // On the "HTTPS-Only" error page "Try again" doesn't make sense since reloading the page + // will just show an error page again. + tryAgainButton.style.display = "none"; + } else { + continueHttpButton.style.display = "none"; + backFromHttpButton.style.display = "none"; + } +} let advancedVisible = false; @@ -59,88 +63,98 @@ let advancedVisible = false; * Used to show or hide the "accept" button based on the validity of the SSL certificate */ function updateShowSSL(queryMap) { - /** @type {'true' | 'false'} */ - const showSSL = queryMap.showSSL; - if (typeof document.addCertException === 'undefined') { - document.getElementById('advancedButton').style.display='none'; + /** @type {'true' | 'false'} */ + const showSSL = queryMap.showSSL; + if (typeof document.addCertException === "undefined") { + document.getElementById("advancedButton").style.display = "none"; + } else { + if (showSSL === "true") { + document.getElementById("advancedButton").style.display = "block"; } else { - if (showSSL === 'true') { - document.getElementById('advancedButton').style.display='block'; - } else { - document.getElementById('advancedButton').style.display='none'; - } + document.getElementById("advancedButton").style.display = "none"; } -}; + } +} /** * Used to show or hide the "accept" button based for the HSTS error page */ function updateShowHSTS(queryMap) { - const showHSTS = queryMap.showHSTS; - if (showHSTS === 'true') { - document.getElementById('advancedButton').style.display='block'; - document.getElementById('advancedPanelAcceptButton').style.display='none'; - } -}; + const showHSTS = queryMap.showHSTS; + if (showHSTS === "true") { + document.getElementById("advancedButton").style.display = "block"; + document.getElementById("advancedPanelAcceptButton").style.display = "none"; + } +} /** * Used to display information about the SSL certificate in `error_pages.html` */ function toggleAdvancedAndScroll() { - const advancedPanel = document.getElementById('badCertAdvancedPanel'); - if (advancedVisible) { - advancedPanel.style.display='none'; - } else { - advancedPanel.style.display='block'; - } - advancedVisible = !advancedVisible; + const advancedPanel = document.getElementById("badCertAdvancedPanel"); + if (advancedVisible) { + advancedPanel.style.display = "none"; + } else { + advancedPanel.style.display = "block"; + } + advancedVisible = !advancedVisible; - const horizontalLine = document.getElementById("horizontalLine"); - const advancedPanelAcceptButton = document.getElementById( - "advancedPanelAcceptButton" - ); - const badCertAdvancedPanel = document.getElementById( - "badCertAdvancedPanel" - ); + const horizontalLine = document.getElementById("horizontalLine"); + const advancedPanelAcceptButton = document.getElementById( + "advancedPanelAcceptButton" + ); + const badCertAdvancedPanel = document.getElementById("badCertAdvancedPanel"); - // We know that the button is being displayed - if (badCertAdvancedPanel.style.display === "block") { - horizontalLine.hidden = false; - advancedPanelAcceptButton.scrollIntoView({ - behavior: "smooth", - block: "center", - inline: "nearest", - }); - } else { - horizontalLine.hidden = true; - } -}; + // We know that the button is being displayed + if (badCertAdvancedPanel.style.display === "block") { + horizontalLine.hidden = false; + advancedPanelAcceptButton.scrollIntoView({ + behavior: "smooth", + block: "center", + inline: "nearest", + }); + } else { + horizontalLine.hidden = true; + } +} /** * Used to bypass an SSL pages in `error_pages.html` */ async function acceptAndContinue(temporary) { - try { - await document.addCertException(temporary); - location.reload(); - } catch (error) { - console.error("Unexpected error: " + error); - } -}; + try { + await document.addCertException(temporary); + location.reload(); + } catch (error) { + console.error("Unexpected error: " + error); + } +} -document.addEventListener('DOMContentLoaded', function () { - if (window.history.length == 1) { - document.getElementById('advancedPanelBackButton').style.display = 'none'; - document.getElementById('backFromHttp').style.display = 'none'; - } else { - document.getElementById('advancedPanelBackButton').addEventListener('click', () => window.history.back()); - document.getElementById('backFromHttp').addEventListener('click', () => window.history.back()); - } +document.addEventListener("DOMContentLoaded", function () { + if (window.history.length == 1) { + document.getElementById("advancedPanelBackButton").style.display = "none"; + document.getElementById("backFromHttp").style.display = "none"; + } else { + document + .getElementById("advancedPanelBackButton") + .addEventListener("click", () => window.history.back()); + document + .getElementById("backFromHttp") + .addEventListener("click", () => window.history.back()); + } - document.getElementById('errorTryAgain').addEventListener('click', () => window.location.reload()); - document.getElementById('advancedButton').addEventListener('click', toggleAdvancedAndScroll); - document.getElementById('advancedPanelAcceptButton').addEventListener('click', () => acceptAndContinue(true)); - document.getElementById('continueHttp').addEventListener('click', () => document.reloadWithHttpsOnlyException()); + document + .getElementById("errorTryAgain") + .addEventListener("click", () => window.location.reload()); + document + .getElementById("advancedButton") + .addEventListener("click", toggleAdvancedAndScroll); + document + .getElementById("advancedPanelAcceptButton") + .addEventListener("click", () => acceptAndContinue(true)); + document + .getElementById("continueHttp") + .addEventListener("click", () => document.reloadWithHttpsOnlyException()); }); parseQuery(document.documentURI); diff --git a/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html index 62e0c70988..84d8800ea5 100644 --- a/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html +++ b/mobile/android/fenix/app/src/main/assets/low_and_medium_risk_error_pages.html @@ -8,7 +8,10 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width; user-scalable=false;" /> - <meta http-equiv="Content-Security-Policy" content="default-src resource:; object-src 'none'" /> + <meta + http-equiv="Content-Security-Policy" + content="default-src resource:; object-src 'none'" + /> <link rel="stylesheet" type="text/css" href="shared_error_style.css" /> <link rel="stylesheet" @@ -37,10 +40,7 @@ <button id="errorTryAgain"></button> <!-- Advanced Button --> - <button - id="advancedButton" - class="buttonSecondary hidden" - ></button> + <button id="advancedButton" class="buttonSecondary hidden"></button> <!-- "Go back" Button (For HTTPS-Only error page only) --> <button id="backFromHttp"></button> @@ -56,9 +56,7 @@ id="advancedPanelBackButtonContainer" class="advancedPanelButtonContainer" > - <button - id="advancedPanelBackButton" - ></button> + <button id="advancedPanelBackButton"></button> </div> <div id="advancedPanelAcceptButtonContainer" @@ -76,7 +74,7 @@ <script type="text/javascript"> if (window.history.length == 1) { - document.getElementById('advancedPanelBackButton').style.display = 'none'; + document.getElementById("advancedPanelBackButton").style.display = "none"; } function toggleAdvancedAndScroll() { @@ -104,5 +102,5 @@ } </script> - <script src="./lowMediumErrorPages.js"></script> + <script src="./lowMediumErrorPages.js"></script> </html> diff --git a/mobile/android/fenix/app/src/main/assets/shared_error_style.css b/mobile/android/fenix/app/src/main/assets/shared_error_style.css index 5753b00a78..fc6a109003 100644 --- a/mobile/android/fenix/app/src/main/assets/shared_error_style.css +++ b/mobile/android/fenix/app/src/main/assets/shared_error_style.css @@ -48,7 +48,6 @@ li:not(:last-of-type) { } h1 { - margin: 0; padding: 0; margin: var(--moz-vertical-spacing) 0; color: var(--header-color); diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index aa8a5250a7..4d4ce12330 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -50,7 +50,7 @@ object FeatureFlags { /** * Enables compose on the tabs tray items. */ - val composeTabsTray = Config.channel.isNightlyOrDebug || Config.channel.isBeta + const val composeTabsTray = true /** * Enables compose on the top sites. @@ -87,4 +87,9 @@ object FeatureFlags { * Enables the menu redesign. */ const val menuRedesignEnabled = false + + /** + * Enables microsurveys. + */ + const val microsurveysEnabled = false } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 7c32c02f60..cd367fa467 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -206,10 +206,11 @@ open class FenixApplication : LocaleAwareApplication(), Provider { lazy(LazyThreadSafetyMode.NONE) { components.core.client }, ), enableEventTimestamps = FxNimbus.features.glean.value().enableEventTimestamps, + delayPingLifetimeIo = FxNimbus.features.glean.value().delayPingLifetimeIo, ) // Set the metric configuration from Nimbus. - Glean.setMetricsEnabledConfig(FxNimbus.features.glean.value().metricsEnabled) + Glean.applyServerKnobsConfig(FxNimbus.features.glean.value().metricsEnabled) Glean.initialize( applicationContext = this, @@ -870,7 +871,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { disabledAds.set(!settings.isReviewQualityCheckProductRecommendationsEnabled) } - TabStrip.enabled.set(settings.isTabletAndTabStripEnabled) + TabStrip.enabled.set(settings.isTabStripEnabled) } @VisibleForTesting @@ -991,7 +992,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider { // We break them out here so they can be recorded when // `nimbus.applyPendingExperiments()` is called. CustomizeHome.jumpBackIn.set(settings.showRecentTabsFeature) - CustomizeHome.recentlySaved.set(settings.showRecentBookmarksFeature) + CustomizeHome.bookmarks.set(settings.showBookmarksHomeFeature) CustomizeHome.mostVisitedSites.set(settings.showTopSitesFeature) CustomizeHome.recentlyVisited.set(settings.historyMetadataUIFeature) CustomizeHome.pocket.set(settings.showPocketRecommendationsFeature) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 1b17a97507..bf442fab37 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -115,6 +115,7 @@ import org.mozilla.fenix.home.intent.CrashReporterIntentProcessor import org.mozilla.fenix.home.intent.HomeDeepLinkIntentProcessor import org.mozilla.fenix.home.intent.OpenBrowserIntentProcessor import org.mozilla.fenix.home.intent.OpenPasswordManagerIntentProcessor +import org.mozilla.fenix.home.intent.OpenRecentlyClosedIntentProcessor import org.mozilla.fenix.home.intent.OpenSpecificTabIntentProcessor import org.mozilla.fenix.home.intent.ReEngagementIntentProcessor import org.mozilla.fenix.home.intent.SpeechProcessingIntentProcessor @@ -203,6 +204,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { OpenBrowserIntentProcessor(this, ::getIntentSessionId), OpenSpecificTabIntentProcessor(this), OpenPasswordManagerIntentProcessor(), + OpenRecentlyClosedIntentProcessor(), ReEngagementIntentProcessor(this, settings()), ) } @@ -780,7 +782,16 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { private fun handleBackLongPress(): Boolean { supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { - if (it is OnBackLongPressedListener && it.onBackLongPressed()) { + if (it is OnLongPressedListener && it.onBackLongPressed()) { + return true + } + } + return false + } + + private fun handleForwardLongPress(): Boolean { + supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { + if (it is OnLongPressedListener && it.onForwardLongPressed()) { return true } } @@ -805,9 +816,16 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { handleBackLongPress() } } + + if (keyCode == KeyEvent.KEYCODE_FORWARD) { + event?.startTracking() + return true + } + return super.onKeyDown(keyCode, event) } + @Suppress("ReturnCount") final override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { if (shouldUseCustomBackLongPress() && keyCode == KeyEvent.KEYCODE_BACK) { backLongPressJob?.cancel() @@ -821,6 +839,20 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { return true } } + + if (keyCode == KeyEvent.KEYCODE_FORWARD) { + if (navHost.navController.hasTopDestination(TabHistoryDialogFragment.NAME)) { + // returning true avoids further processing of the KeyUp event + return true + } + + supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { + if (it is UserInteractionHandler && it.onForwardPressed()) { + return true + } + } + } + return super.onKeyUp(keyCode, event) } @@ -830,6 +862,11 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { if (!shouldUseCustomBackLongPress() && keyCode == KeyEvent.KEYCODE_BACK) { return handleBackLongPress() } + + if (keyCode == KeyEvent.KEYCODE_FORWARD) { + return handleForwardLongPress() + } + return super.onKeyLongPress(keyCode, event) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/OnBackLongPressedListener.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/OnLongPressedListener.kt index e47a0b71b4..711830bf72 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/OnBackLongPressedListener.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/OnLongPressedListener.kt @@ -5,9 +5,9 @@ package org.mozilla.fenix /** - * Interface for features and fragments that want to handle long presses of the system back button + * Interface for features and fragments that want to handle long presses of the system back/forward button */ -interface OnBackLongPressedListener { +interface OnLongPressedListener { /** * Called when the system back button is long pressed. @@ -18,4 +18,11 @@ interface OnBackLongPressedListener { * @return true if the event was handled */ fun onBackLongPressed(): Boolean + + /** + * Called when the system forward button is long pressed. + * + * @return true if the event was handled + */ + fun onForwardLongPressed(): Boolean } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index 5eeeeedb3e..0198cb9653 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -40,6 +40,7 @@ import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.SupportUtils.AMO_HOMEPAGE_FOR_ANDROID import org.mozilla.fenix.theme.ThemeManager /** @@ -264,11 +265,4 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) from = BrowserDirection.FromAddonsManagementFragment, ) } - - companion object { - // This is locale-less on purpose so that the content negotiation happens on the AMO side because the current - // user language might not be supported by AMO and/or the language might not be exactly what AMO is expecting - // (e.g. `en` instead of `en-US`). - private const val AMO_HOMEPAGE_FOR_ANDROID = "${BuildConfig.AMO_BASE_URL}/android/" - } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index d6e93e0043..2567021e7e 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -115,25 +115,29 @@ import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.kotlin.getOrigin import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import mozilla.components.support.locale.ActivityContextWrapper +import mozilla.components.support.utils.ext.isLandscape import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.GleanMetrics.MediaState import org.mozilla.fenix.GleanMetrics.NavigationBar import org.mozilla.fenix.GleanMetrics.PullToRefreshInBrowser import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.NavGraphDirections -import org.mozilla.fenix.OnBackLongPressedListener +import org.mozilla.fenix.OnLongPressedListener import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.readermode.DefaultReaderModeController import org.mozilla.fenix.browser.tabstrip.TabStrip +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.FindInPageIntegration import org.mozilla.fenix.components.StoreProvider import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.components.menu.MenuAccessPoint import org.mozilla.fenix.components.metrics.MetricsUtils import org.mozilla.fenix.components.toolbar.BrowserFragmentState import org.mozilla.fenix.components.toolbar.BrowserFragmentStore @@ -165,6 +169,7 @@ import org.mozilla.fenix.ext.breadcrumb import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.hideToolbar +import org.mozilla.fenix.ext.isTablet import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.navigateWithBreadcrumb import org.mozilla.fenix.ext.registerForActivityResult @@ -173,6 +178,7 @@ import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.secure import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.tabClosedUndoMessage +import org.mozilla.fenix.ext.updateNavBarForConfigurationChange import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.SharedViewModel import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel @@ -201,7 +207,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, ActivityResultHandler, - OnBackLongPressedListener, + OnLongPressedListener, AccessibilityManager.AccessibilityStateChangeListener { private var _binding: FragmentBrowserBinding? = null @@ -212,7 +218,9 @@ abstract class BaseBrowserFragment : private lateinit var startForResult: ActivityResultLauncher<Intent> private var _browserToolbarInteractor: BrowserToolbarInteractor? = null - protected val browserToolbarInteractor: BrowserToolbarInteractor + + @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) + internal val browserToolbarInteractor: BrowserToolbarInteractor get() = _browserToolbarInteractor!! @VisibleForTesting @@ -269,6 +277,13 @@ abstract class BaseBrowserFragment : private var currentStartDownloadDialog: StartDownloadDialog? = null + private lateinit var savedLoginsLauncher: ActivityResultLauncher<Intent> + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + savedLoginsLauncher = registerForActivityResult { navigateToSavedLoginsFragment() } + } + @CallSuper override fun onCreateView( inflater: LayoutInflater, @@ -419,6 +434,7 @@ abstract class BaseBrowserFragment : }, ) val browserToolbarMenuController = DefaultBrowserToolbarMenuController( + fragment = this, store = store, activity = activity, navController = findNavController(), @@ -439,7 +455,8 @@ abstract class BaseBrowserFragment : tabCollectionStorage = requireComponents.core.tabCollectionStorage, topSitesStorage = requireComponents.core.topSitesStorage, pinnedSiteStorage = requireComponents.core.pinnedSiteStorage, - browserStore = store, + onShowPinVerification = { intent -> savedLoginsLauncher.launch(intent) }, + onBiometricAuthenticationSuccessful = { navigateToSavedLoginsFragment() }, ) _browserToolbarInteractor = DefaultBrowserToolbarInteractor( @@ -485,7 +502,11 @@ abstract class BaseBrowserFragment : }, ) - if (IncompleteRedesignToolbarFeature(context.settings()).isEnabled) { + // We don't show the navigation bar for tablets and in landscape mode. + val shouldAddNavigationBar = IncompleteRedesignToolbarFeature(context.settings()).isEnabled && + !requireContext().isLandscape() && + !isTablet() + if (shouldAddNavigationBar) { initializeNavBar( browserToolbar = browserToolbarView.view, view = view, @@ -756,6 +777,9 @@ abstract class BaseBrowserFragment : loginValidationDelegate = DefaultLoginValidationDelegate( context.components.core.lazyPasswordsStorage, ), + isLoginAutofillEnabled = { + context.settings().shouldAutofillLogins + }, isSaveLoginEnabled = { context.settings().shouldPromptToSaveLogins }, @@ -836,6 +860,7 @@ abstract class BaseBrowserFragment : feature = SessionFeature( requireComponents.core.store, requireComponents.useCases.sessionUseCases.goBack, + requireComponents.useCases.sessionUseCases.goForward, binding.engineView, customTabSessionId, ), @@ -1005,7 +1030,9 @@ abstract class BaseBrowserFragment : ) initializeEngineView( - topToolbarHeight = context.settings().getTopToolbarHeight(includeTabStrip = customTabSessionId == null), + topToolbarHeight = context.settings().getTopToolbarHeight( + includeTabStrip = customTabSessionId == null && context.isTabStripEnabled(), + ), bottomToolbarHeight = bottomToolbarHeight, ) } @@ -1221,7 +1248,7 @@ abstract class BaseBrowserFragment : topToolbarHeight = topToolbarHeight, ) } else { - val toolbarHeight = if (customTabSessionId == null && context.settings().isTabletAndTabStripEnabled) { + val toolbarHeight = if (customTabSessionId == null && context.isTabStripEnabled()) { resources.getDimensionPixelSize(R.dimen.browser_toolbar_height) + resources.getDimensionPixelSize(R.dimen.tab_strip_height) } else { @@ -1348,7 +1375,9 @@ abstract class BaseBrowserFragment : onMenuButtonClick = { findNavController().nav( R.id.browserFragment, - BrowserFragmentDirections.actionGlobalMenuDialogFragment(), + BrowserFragmentDirections.actionGlobalMenuDialogFragment( + accesspoint = MenuAccessPoint.Browser, + ), ) }, ) @@ -1513,6 +1542,11 @@ abstract class BaseBrowserFragment : removeSessionIfNeeded() } + @CallSuper + override fun onForwardPressed(): Boolean { + return sessionFeature.onForwardPressed() + } + /** * Forwards activity results to the [ActivityResultHandler] features. */ @@ -1523,12 +1557,24 @@ abstract class BaseBrowserFragment : ).any { it.onActivityResult(requestCode, data, resultCode) } } - override fun onBackLongPressed(): Boolean { + /** + * Navigate to GlobalTabHistoryDialogFragment. + */ + private fun navigateToGlobalTabHistoryDialogFragment() { findNavController().navigate( NavGraphDirections.actionGlobalTabHistoryDialogFragment( activeSessionId = customTabSessionId, ), ) + } + + override fun onBackLongPressed(): Boolean { + navigateToGlobalTabHistoryDialogFragment() + return true + } + + override fun onForwardLongPressed(): Boolean { + navigateToGlobalTabHistoryDialogFragment() return true } @@ -1773,7 +1819,7 @@ abstract class BaseBrowserFragment : browserToolbarView.visible() initializeEngineView( topToolbarHeight = requireContext().settings().getTopToolbarHeight( - includeTabStrip = customTabSessionId == null, + includeTabStrip = customTabSessionId == null && requireContext().isTabStripEnabled(), ), bottomToolbarHeight = requireContext().settings().getBottomToolbarHeight(), ) @@ -1787,6 +1833,27 @@ abstract class BaseBrowserFragment : @CallSuper internal open fun onUpdateToolbarForConfigurationChange(toolbar: BrowserToolbarView) { toolbar.dismissMenu() + + // If the navbar feature could be visible, we should update it's state. + val shouldUpdateNavBarState = + IncompleteRedesignToolbarFeature(requireContext().settings()).isEnabled && !isTablet() + if (shouldUpdateNavBarState) { + updateNavBarForConfigurationChange( + parent = binding.browserLayout, + toolbarView = browserToolbarView.view, + bottomToolbarContainerView = _bottomToolbarContainerView?.toolbarContainerView, + reinitializeNavBar = ::reinitializeNavBar, + ) + } + } + + private fun reinitializeNavBar() { + initializeNavBar( + browserToolbar = browserToolbarView.view, + view = requireView(), + context = requireContext(), + activity = requireActivity() as HomeActivity, + ) } /* @@ -1939,4 +2006,13 @@ abstract class BaseBrowserFragment : } } } + + private fun navigateToSavedLoginsFragment() { + val navController = findNavController() + if (navController.currentDestination?.id == R.id.browserFragment) { + Logins.openLogins.record(NoExtras()) + val directions = BrowserFragmentDirections.actionLoginsListFragment() + navController.navigate(directions) + } + } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 325d537220..89929ed7d1 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -34,11 +34,14 @@ import mozilla.components.feature.tabs.WindowFeature import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.support.utils.ext.isLandscape +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.GleanMetrics.AddressToolbar import org.mozilla.fenix.GleanMetrics.ReaderMode import org.mozilla.fenix.GleanMetrics.Shopping import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.appstate.AppAction @@ -51,6 +54,8 @@ import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.ext.settings import org.mozilla.fenix.home.HomeFragment +import org.mozilla.fenix.messaging.FenixMessageSurfaceId +import org.mozilla.fenix.messaging.MessagingFeature import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.settings.quicksettings.protections.cookiebanners.getCookieBannerUIMode import org.mozilla.fenix.shopping.DefaultShoppingExperienceFeature @@ -72,12 +77,17 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val reviewQualityCheckFeature = ViewBoundFeatureWrapper<ReviewQualityCheckFeature>() private val translationsBinding = ViewBoundFeatureWrapper<TranslationsBinding>() + @VisibleForTesting + internal val messagingFeature = ViewBoundFeatureWrapper<MessagingFeature>() + private var readerModeAvailable = false private var reviewQualityCheckAvailable = false private var translationsAvailable = false private var pwaOnboardingObserver: PwaOnboardingObserver? = null + @VisibleForTesting + internal var leadingAction: BrowserToolbar.Button? = null private var forwardAction: BrowserToolbar.TwoStateButton? = null private var backAction: BrowserToolbar.TwoStateButton? = null private var refreshAction: BrowserToolbar.TwoStateButton? = null @@ -89,9 +99,8 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { val context = requireContext() val components = context.components - val isTabletAndTabStripEnabled = context.settings().isTabletAndTabStripEnabled - if (!isTabletAndTabStripEnabled && context.settings().isSwipeToolbarToSwitchTabsEnabled) { + if (!context.isTabStripEnabled() && context.settings().isSwipeToolbarToSwitchTabsEnabled) { binding.gestureLayout.addGestureListener( ToolbarGestureHandler( activity = requireActivity(), @@ -107,15 +116,14 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ) } - if (!IncompleteRedesignToolbarFeature(context.settings()).isEnabled) { - val isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate - initLeadingAction( - context = context, - isPrivate = isPrivate, - ) - } - - updateToolbarActions(isTablet = resources.getBoolean(R.bool.tablet)) + updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = IncompleteRedesignToolbarFeature(context.settings()).isEnabled, + isLandscape = context.isLandscape(), + isTablet = resources.getBoolean(R.bool.tablet), + isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate, + feltPrivateBrowsingEnabled = context.settings().feltPrivateBrowsingEnabled, + ) val readerModeAction = BrowserToolbar.ToggleButton( @@ -210,6 +218,22 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ) setTranslationFragmentResultListener() + + setupMicrosurvey() + } + + @VisibleForTesting + internal fun setupMicrosurvey(isMicrosurveyEnabled: Boolean = FeatureFlags.microsurveysEnabled) { + if (requireContext().settings().isExperimentationEnabled && isMicrosurveyEnabled) { + messagingFeature.set( + feature = MessagingFeature( + appStore = requireComponents.appStore, + surface = FenixMessageSurfaceId.MICROSURVEY, + ), + owner = viewLifecycleOwner, + view = binding.root, + ) + } } private fun setTranslationFragmentResultListener() { @@ -310,7 +334,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } private fun initReloadAction(context: Context) { - if (!IncompleteRedesignToolbarFeature(context.settings()).isEnabled || refreshAction != null) { + if (!IncompleteRedesignToolbarFeature(context.settings()).isEnabled) { return } @@ -412,43 +436,138 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } // Adds a home button to BrowserToolbar or, if FeltPrivateBrowsing is enabled, a clear data button instead. - private fun initLeadingAction( + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun addLeadingAction( context: Context, + feltPrivateBrowsingEnabled: Boolean, isPrivate: Boolean, ) { - val leadingAction = if (isPrivate && context.settings().feltPrivateBrowsingEnabled) { - BrowserToolbar.Button( - imageDrawable = AppCompatResources.getDrawable( - context, - R.drawable.mozac_ic_data_clearance_24, - )!!, - contentDescription = context.getString(R.string.browser_toolbar_erase), - iconTintColorResource = ThemeManager.resolveAttribute(R.attr.textPrimary, context), - listener = browserToolbarInteractor::onEraseButtonClicked, + if (leadingAction == null) { + leadingAction = if (isPrivate && feltPrivateBrowsingEnabled) { + BrowserToolbar.Button( + imageDrawable = AppCompatResources.getDrawable( + context, + R.drawable.mozac_ic_data_clearance_24, + )!!, + contentDescription = context.getString(R.string.browser_toolbar_erase), + iconTintColorResource = ThemeManager.resolveAttribute(R.attr.textPrimary, context), + listener = browserToolbarInteractor::onEraseButtonClicked, + ) + } else { + BrowserToolbar.Button( + imageDrawable = AppCompatResources.getDrawable( + context, + R.drawable.mozac_ic_home_24, + )!!, + contentDescription = context.getString(R.string.browser_toolbar_home), + iconTintColorResource = ThemeManager.resolveAttribute(R.attr.textPrimary, context), + listener = browserToolbarInteractor::onHomeButtonClicked, + ) + }.also { + browserToolbarView.view.addNavigationAction(it) + } + } + } + + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun removeLeadingAction() { + leadingAction?.let { + browserToolbarView.view.removeNavigationAction(it) + } + leadingAction = null + } + + /** + * This code takes care of the [BrowserToolbar] leading and navigation actions. + * The older design requires a HomeButton followed by navigation buttons for tablets. + * The newer design expects NavigationButtons and a HomeButton in landscape mode for phones and in both modes + * for tablets. + */ + @VisibleForTesting + internal fun updateBrowserToolbarLeadingAndNavigationActions( + context: Context, + redesignEnabled: Boolean, + isLandscape: Boolean, + isTablet: Boolean, + isPrivate: Boolean, + feltPrivateBrowsingEnabled: Boolean, + ) { + if (redesignEnabled) { + updateAddressBarNavigationActions( + isLandscape = isLandscape, + isTablet = isTablet, + context = context, + ) + updateAddressBarLeadingAction( + redesignEnabled = true, + isLandscape = isLandscape, + isTablet = isTablet, + isPrivate = isPrivate, + feltPrivateBrowsingEnabled = feltPrivateBrowsingEnabled, + context = context, ) } else { - BrowserToolbar.Button( - imageDrawable = AppCompatResources.getDrawable( - context, - R.drawable.mozac_ic_home_24, - )!!, - contentDescription = context.getString(R.string.browser_toolbar_home), - iconTintColorResource = ThemeManager.resolveAttribute(R.attr.textPrimary, context), - listener = browserToolbarInteractor::onHomeButtonClicked, + updateAddressBarLeadingAction( + redesignEnabled = false, + isLandscape = isLandscape, + isPrivate = isPrivate, + isTablet = isTablet, + feltPrivateBrowsingEnabled = feltPrivateBrowsingEnabled, + context = context, ) + updateTabletToolbarActions(isTablet = isTablet) } + browserToolbarView.view.invalidateActions() + } - browserToolbarView.view.addNavigationAction(leadingAction) + @VisibleForTesting + internal fun updateAddressBarLeadingAction( + redesignEnabled: Boolean, + isLandscape: Boolean, + isTablet: Boolean, + isPrivate: Boolean, + feltPrivateBrowsingEnabled: Boolean, + context: Context, + ) { + if (!redesignEnabled || isLandscape || isTablet) { + addLeadingAction( + isPrivate = isPrivate, + feltPrivateBrowsingEnabled = feltPrivateBrowsingEnabled, + context = context, + ) + } else { + removeLeadingAction() + } + } + + @VisibleForTesting + internal fun updateAddressBarNavigationActions( + context: Context, + isLandscape: Boolean, + isTablet: Boolean, + ) { + if (isLandscape || isTablet) { + addNavigationActions(context) + } else { + removeNavigationActions() + } } override fun onUpdateToolbarForConfigurationChange(toolbar: BrowserToolbarView) { super.onUpdateToolbarForConfigurationChange(toolbar) - updateToolbarActions(isTablet = resources.getBoolean(R.bool.tablet)) + updateBrowserToolbarLeadingAndNavigationActions( + context = requireContext(), + redesignEnabled = IncompleteRedesignToolbarFeature(requireContext().settings()).isEnabled, + isLandscape = requireContext().isLandscape(), + isTablet = resources.getBoolean(R.bool.tablet), + isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate, + feltPrivateBrowsingEnabled = requireContext().settings().feltPrivateBrowsingEnabled, + ) } @VisibleForTesting - internal fun updateToolbarActions(isTablet: Boolean) { + internal fun updateTabletToolbarActions(isTablet: Boolean) { if (isTablet == this.isTablet) return if (isTablet) { @@ -460,8 +579,8 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { this.isTablet = isTablet } - @Suppress("LongMethod") - private fun addTabletActions(context: Context) { + @VisibleForTesting + internal fun addNavigationActions(context: Context) { val enableTint = ThemeManager.resolveAttribute(R.attr.textPrimary, context) val disableTint = ThemeManager.resolveAttribute(R.attr.textDisabled, context) @@ -486,11 +605,9 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ToolbarMenu.Item.Back(viewHistory = false), ) }, - ) - } - - backAction?.let { - browserToolbarView.view.addNavigationAction(it) + ).also { + browserToolbarView.view.addNavigationAction(it) + } } if (forwardAction == null) { @@ -514,13 +631,17 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ToolbarMenu.Item.Forward(viewHistory = false), ) }, - ) + ).also { + browserToolbarView.view.addNavigationAction(it) + } } + } - forwardAction?.let { - browserToolbarView.view.addNavigationAction(it) - } + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + internal fun addTabletActions(context: Context) { + addNavigationActions(context) + val enableTint = ThemeManager.resolveAttribute(R.attr.textPrimary, context) if (refreshAction == null) { refreshAction = BrowserToolbar.TwoStateButton( primaryImage = AppCompatResources.getDrawable( @@ -552,28 +673,31 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { ) } }, - ) - } - - refreshAction?.let { - browserToolbarView.view.addNavigationAction(it) + ).also { + browserToolbarView.view.addNavigationAction(it) + } } - - browserToolbarView.view.invalidateActions() } - private fun removeTabletActions() { + @VisibleForTesting + internal fun removeNavigationActions() { forwardAction?.let { browserToolbarView.view.removeNavigationAction(it) } + forwardAction = null backAction?.let { browserToolbarView.view.removeNavigationAction(it) } + backAction = null + } + + @VisibleForTesting + internal fun removeTabletActions() { + removeNavigationActions() + refreshAction?.let { browserToolbarView.view.removeNavigationAction(it) } - - browserToolbarView.view.invalidateActions() } override fun onStart() { @@ -607,6 +731,10 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { override fun onDestroyView() { super.onDestroyView() isTablet = false + leadingAction = null + forwardAction = null + backAction = null + refreshAction = null } private fun updateHistoryMetadata() { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt index 80fbcd61b9..c103e22026 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/StandardSnackbarErrorBinding.kt @@ -59,7 +59,7 @@ class StandardSnackbarErrorBinding( snackBar.setSnackBarTextColor( ContextCompat.getColor( activity, - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ) snackBar.setAction( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt index a661d1ea1c..e2d36bffed 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/SwipeGestureLayout.kt @@ -10,7 +10,6 @@ import android.util.AttributeSet import android.view.GestureDetector import android.view.MotionEvent import android.widget.FrameLayout -import androidx.core.view.GestureDetectorCompat /** * Interface that allows intercepting and handling swipe gestures received in a [SwipeGestureLayout]. @@ -101,7 +100,7 @@ class SwipeGestureLayout @JvmOverloads constructor( } } - private val gestureDetector = GestureDetectorCompat(context, gestureListener) + private val gestureDetector = GestureDetector(context, gestureListener) private val listeners = mutableListOf<SwipeGestureListener>() private var activeListener: SwipeGestureListener? = null diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt index 42b6924955..cc855c9fa2 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/TabPreview.kt @@ -110,7 +110,9 @@ class TabPreview @JvmOverloads constructor( }, ) - removeView(binding.fakeToolbar) + if (!isToolbarAtTop) { + removeView(binding.fakeToolbar) + } } // Change view properties to avoid confusing the UI tests diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/tabstrip/TabStripFeatureFlag.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/tabstrip/TabStripFeatureFlag.kt new file mode 100644 index 0000000000..faeb5446f5 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/tabstrip/TabStripFeatureFlag.kt @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.browser.tabstrip + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build +import org.mozilla.fenix.Config +import org.mozilla.fenix.ext.isTablet +import org.mozilla.fenix.ext.settings + +/** + * Returns true if the tab strip is enabled. + */ +fun Context.isTabStripEnabled(): Boolean = + isTabStripEligible() && settings().isTabStripEnabled + +/** + * Returns true if the the device has the prerequisites to enable the tab strip. + */ +fun Context.isTabStripEligible(): Boolean = + Config.channel.isNightlyOrDebug && isTablet() && !doesDeviceHaveHinge() + +/** + * Check if the device has a hinge sensor. + */ +private fun Context.doesDeviceHaveHinge(): Boolean = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && + packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt index fcd624eec8..099b24a744 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt @@ -19,6 +19,7 @@ import mozilla.components.concept.sync.DeviceCapability import mozilla.components.concept.sync.DeviceConfig import mozilla.components.concept.sync.DeviceType import mozilla.components.concept.sync.OAuthAccount +import mozilla.components.feature.accounts.push.CloseTabsFeature import mozilla.components.feature.accounts.push.FxaPushSupportFeature import mozilla.components.feature.accounts.push.SendTabFeature import mozilla.components.feature.syncedtabs.SyncedTabsAutocompleteProvider @@ -84,7 +85,12 @@ class BackgroundServices( // NB: flipping this flag back and worth is currently not well supported and may need hand-holding. // Consult with the android-components peers before changing. // See https://github.com/mozilla/application-services/issues/1308 - capabilities = setOf(DeviceCapability.SEND_TAB), + capabilities = buildSet { + add(DeviceCapability.SEND_TAB) + if (context.settings().enableCloseSyncedTabs) { + add(DeviceCapability.CLOSE_TABS) + } + }, // Enable encryption for account state on supported API levels (23+). // Just on Nightly and local builds for now. @@ -194,6 +200,12 @@ class BackgroundServices( notificationManager.showReceivedTabs(context, device, tabs) } + if (context.settings().enableCloseSyncedTabs) { + CloseTabsFeature(context.components.core.store, accountManager) { _, remotelyClosedUrls -> + notificationManager.showSyncedTabsClosed(context, remotelyClosedUrls.size) + }.observe() + } + SyncedTabsIntegration(context, accountManager).launch() syncStoreSupport = SyncStoreSupport(syncStore, lazyOf(accountManager)).also { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt index 0f6f107df1..35c18e98ea 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -202,7 +202,7 @@ class Components(private val context: Context) { collections = core.tabCollectionStorage.cachedTabCollections, expandedCollections = emptySet(), topSites = core.topSitesStorage.cachedTopSites.sort(), - recentBookmarks = emptyList(), + bookmarks = emptyList(), showCollectionPlaceholder = settings.showCollectionsPlaceholderOnHome, // Provide an initial state for recent tabs to prevent re-rendering on the home screen. // This will otherwise cause a visual jump as the section gets rendered from no state diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NotificationManager.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NotificationManager.kt index 426019b8eb..9ed2abdcae 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NotificationManager.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NotificationManager.kt @@ -17,11 +17,15 @@ import android.os.Build.VERSION.SDK_INT import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.getSystemService +import androidx.core.os.bundleOf import mozilla.components.concept.sync.Device import mozilla.components.concept.sync.TabData +import mozilla.components.support.base.ids.SharedIdsHelper import mozilla.components.support.base.log.logger.Logger +import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.IntentReceiverActivity import org.mozilla.fenix.R +import org.mozilla.fenix.home.intent.OpenRecentlyClosedIntentProcessor import org.mozilla.fenix.utils.IntentUtils /** @@ -29,6 +33,9 @@ import org.mozilla.fenix.utils.IntentUtils */ class NotificationManager(private val context: Context) { companion object { + const val TABS_CLOSED_TAG = "TabsClosed" + const val TOTAL_TABS_CLOSED_EXTRA = "org.mozilla.fenix.TOTAL_TABS_CLOSED_EXTRA" + const val TABS_CLOSED_NOTIFICATION_TAG = "org.mozilla.fenix.TABS_CLOSED_NOTIFICATION_TAG" const val RECEIVE_TABS_TAG = "ReceivedTabs" const val RECEIVE_TABS_CHANNEL_ID = "ReceivedTabsChannel" } @@ -51,6 +58,73 @@ class NotificationManager(private val context: Context) { private val logger = Logger("NotificationManager") + /** + * Notifies the user that one or more tabs on this device were closed from another device. + * + * @param context The Android application context. + * @param count The number of tabs that were closed. + */ + fun showSyncedTabsClosed(context: Context, count: Int) { + if (count <= 0) { + return + } + val notificationManagerCompat = NotificationManagerCompat.from(context) + val (notificationId, totalCount) = if (SDK_INT >= Build.VERSION_CODES.M) { + // On Android M (released in 2015) and later, we can retrieve + // the last notification from `allNotifications`. If one exists, + // we'll update its contents in-place with the new total number of + // closed tabs. + val notificationId = SharedIdsHelper.getIdForTag(context, TABS_CLOSED_NOTIFICATION_TAG) + val lastNotification = notificationManagerCompat.activeNotifications.find { + it.tag == TABS_CLOSED_TAG && it.id == notificationId + } + val lastTotalCount = lastNotification?.notification?.extras?.getInt(TOTAL_TABS_CLOSED_EXTRA) ?: 0 + Pair(notificationId, lastTotalCount + count) + } else { + // Pre-M doesn't have `activeNotifications`, so we'll show + // a new notification for each call to `showSyncedTabsClosed`. + val notificationId = SharedIdsHelper.getNextIdForTag(context, TABS_CLOSED_NOTIFICATION_TAG) + Pair(notificationId, count) + } + + val notification = NotificationCompat.Builder(context, RECEIVE_TABS_CHANNEL_ID).apply { + val title = context.resources.getString( + R.string.fxa_tabs_closed_notification_title, + context.resources.getString(R.string.app_name), + totalCount, + ) + setContentTitle(title) + + val text = context.resources.getString(R.string.fxa_tabs_closed_text) + setContentText(text) + + val intent = Intent(context, HomeActivity::class.java).apply { + action = OpenRecentlyClosedIntentProcessor.ACTION_OPEN_RECENTLY_CLOSED + } + val pendingIntent = PendingIntent.getActivity( + context, + 0, + intent, + IntentUtils.defaultIntentPendingFlags or PendingIntent.FLAG_UPDATE_CURRENT, + ) + setContentIntent(pendingIntent) + + val extras = bundleOf(TOTAL_TABS_CLOSED_EXTRA to totalCount) + addExtras(extras) + + setSmallIcon(R.drawable.ic_status_logo) + setWhen(System.currentTimeMillis()) + setAutoCancel(true) + setDefaults(Notification.DEFAULT_VIBRATE or Notification.DEFAULT_SOUND) + + if (SDK_INT >= Build.VERSION_CODES.M) { + setCategory(Notification.CATEGORY_STATUS) + } + }.build() + + notificationManagerCompat.notify(TABS_CLOSED_TAG, notificationId, notification) + } + fun showReceivedTabs(context: Context, device: Device?, tabs: List<TabData>) { // In the future, experiment with displaying multiple tabs from the same device as as Notification Groups. // For now, a single notification per tab received will suffice. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt index dbdeb831ed..f813ad33bd 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppAction.kt @@ -17,9 +17,9 @@ import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.shopping.ShoppingState +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesSelectedCategory -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab @@ -54,7 +54,7 @@ sealed class AppAction : Action { val collections: List<TabCollection>, val showCollectionPlaceholder: Boolean, val recentTabs: List<RecentTab>, - val recentBookmarks: List<RecentBookmark>, + val bookmarks: List<Bookmark>, val recentHistory: List<RecentlyVisitedItem>, val recentSyncedTabState: RecentSyncedTabState, ) : @@ -68,8 +68,16 @@ sealed class AppAction : Action { data class TopSitesChange(val topSites: List<TopSite>) : AppAction() data class RecentTabsChange(val recentTabs: List<RecentTab>) : AppAction() data class RemoveRecentTab(val recentTab: RecentTab) : AppAction() - data class RecentBookmarksChange(val recentBookmarks: List<RecentBookmark>) : AppAction() - data class RemoveRecentBookmark(val recentBookmark: RecentBookmark) : AppAction() + + /** + * The list of bookmarks displayed on the home screen has changed. + */ + data class BookmarksChange(val bookmarks: List<Bookmark>) : AppAction() + + /** + * A bookmark has been removed from the home screen. + */ + data class RemoveBookmark(val bookmark: Bookmark) : AppAction() data class RecentHistoryChange(val recentHistory: List<RecentlyVisitedItem>) : AppAction() data class RemoveRecentHistoryHighlight(val highlightUrl: String) : AppAction() data class DisbandSearchGroupAction(val searchTerm: String) : AppAction() diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt index e118dca121..dc3a1b368a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppState.kt @@ -16,9 +16,9 @@ import org.mozilla.fenix.browser.StandardSnackbarError import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.appstate.shopping.ShoppingState import org.mozilla.fenix.home.HomeFragment +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesSelectedCategory -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem @@ -45,7 +45,7 @@ import org.mozilla.fenix.wallpapers.WallpaperState * @property showCollectionPlaceholder If true, shows a placeholder when there are no collections. * @property recentTabs The list of recent [RecentTab] in the [HomeFragment]. * @property recentSyncedTabState The [RecentSyncedTabState] in the [HomeFragment]. - * @property recentBookmarks The list of recently saved [BookmarkNode]s to show on the [HomeFragment]. + * @property bookmarks The list of recently saved [BookmarkNode]s to show on the [HomeFragment]. * @property recentHistory The list of [RecentlyVisitedItem]s. * @property pocketStories The list of currently shown [PocketRecommendedStory]s. * @property pocketStoriesCategories All [PocketRecommendedStory] categories. @@ -75,7 +75,7 @@ data class AppState( val showCollectionPlaceholder: Boolean = false, val recentTabs: List<RecentTab> = emptyList(), val recentSyncedTabState: RecentSyncedTabState = RecentSyncedTabState.None, - val recentBookmarks: List<RecentBookmark> = emptyList(), + val bookmarks: List<Bookmark> = emptyList(), val recentHistory: List<RecentlyVisitedItem> = emptyList(), val pocketStories: List<PocketStory> = emptyList(), val pocketStoriesCategories: List<PocketRecommendedStoriesCategory> = emptyList(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt index a614689982..1092de97f0 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/appstate/AppStoreReducer.kt @@ -43,7 +43,7 @@ internal object AppStoreReducer { collections = action.collections, mode = action.mode, topSites = action.topSites, - recentBookmarks = action.recentBookmarks, + bookmarks = action.bookmarks, recentTabs = action.recentTabs, recentHistory = action.recentHistory, recentSyncedTabState = action.recentSyncedTabState, @@ -81,9 +81,9 @@ internal object AppStoreReducer { recentSyncedTabState = action.state, ) } - is AppAction.RecentBookmarksChange -> state.copy(recentBookmarks = action.recentBookmarks) - is AppAction.RemoveRecentBookmark -> { - state.copy(recentBookmarks = state.recentBookmarks.filterNot { it.url == action.recentBookmark.url }) + is AppAction.BookmarksChange -> state.copy(bookmarks = action.bookmarks) + is AppAction.RemoveBookmark -> { + state.copy(bookmarks = state.bookmarks.filterNot { it.url == action.bookmark.url }) } is AppAction.RecentHistoryChange -> state.copy( recentHistory = action.recentHistory, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt index f8ea604c34..986b4ba3b9 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCase.kt @@ -9,7 +9,7 @@ import mozilla.appservices.places.BookmarkRoot import mozilla.appservices.places.uniffi.PlacesApiException import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.concept.storage.HistoryStorage -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import java.util.concurrent.TimeUnit /** @@ -20,12 +20,17 @@ class BookmarksUseCase( historyStorage: HistoryStorage, ) { + /** + * Use case for adding a new bookmark. + * + * @param storage [BookmarksStorage] used to add and retrieve bookmark data. + */ class AddBookmarksUseCase internal constructor(private val storage: BookmarksStorage) { /** * Adds a new bookmark with the provided [url] and [title]. * - * @return The result if the operation was executed or not. A bookmark may not be added if + * @return The guid of the newly added bookmark or null. A bookmark may not be added if * one with the identical [url] already exists. */ @WorkerThread @@ -34,21 +39,22 @@ class BookmarksUseCase( title: String, position: UInt? = null, parentGuid: String? = null, - ): Boolean { + ): String? { return try { val canAdd = storage.getBookmarksWithUrl(url).firstOrNull { it.url == url } == null - if (canAdd) { + return if (canAdd) { storage.addItem( parentGuid ?: BookmarkRoot.Mobile.id, url = url, title = title, position = position, ) + } else { + null } - canAdd } catch (e: PlacesApiException.UrlParseFailed) { - false + null } } } @@ -68,27 +74,26 @@ class BookmarksUseCase( * Retrieves a list of recently added bookmarks, if any, up to maximum. * * @param count The number of recent bookmarks to return. - * @param maxAgeInMs The maximum age (ms) of a recently added bookmark to return. - * @return a list of [RecentBookmark] that were added no older than specify by [maxAgeInMs], - * if any, up to a number specified by [count]. + * @param previewImageMaxAgeMs The maximum age (ms) to search history for preview image URLs. + * @return a list of [Bookmark]s if any, up to a number specified by [count]. */ @WorkerThread suspend operator fun invoke( count: Int = DEFAULT_BOOKMARKS_TO_RETRIEVE, - maxAgeInMs: Long = TimeUnit.DAYS.toMillis(DEFAULT_BOOKMARKS_DAYS_AGE_TO_RETRIEVE), - ): List<RecentBookmark> { + previewImageMaxAgeMs: Long = TimeUnit.DAYS.toMillis(DEFAULT_BOOKMARKS_LENGTH_DAYS_PREVIEW_IMAGE_SEARCH), + ): List<Bookmark> { val currentTime = System.currentTimeMillis() // Fetch visit information within the time range of now and the specified maximum age. val history = historyStorage?.getDetailedVisits( - start = currentTime - maxAgeInMs, + start = currentTime - previewImageMaxAgeMs, end = currentTime, ) return bookmarksStorage - .getRecentBookmarks(count, maxAgeInMs) + .getRecentBookmarks(count) .map { bookmark -> - RecentBookmark( + Bookmark( title = bookmark.title, url = bookmark.url, previewImageUrl = history?.find { bookmark.url == it.url }?.previewImageUrl, @@ -107,9 +112,9 @@ class BookmarksUseCase( companion object { // Number of recent bookmarks to retrieve. - const val DEFAULT_BOOKMARKS_TO_RETRIEVE = 4 + const val DEFAULT_BOOKMARKS_TO_RETRIEVE = 8 // The maximum age in days of a recent bookmarks to retrieve. - const val DEFAULT_BOOKMARKS_DAYS_AGE_TO_RETRIEVE = 10L + const val DEFAULT_BOOKMARKS_LENGTH_DAYS_PREVIEW_IMAGE_SEARCH = 10L } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/BrowserNavigationParams.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/BrowserNavigationParams.kt new file mode 100644 index 0000000000..8de758f3d7 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/BrowserNavigationParams.kt @@ -0,0 +1,18 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu + +import org.mozilla.fenix.settings.SupportUtils.SumoTopic + +/** + * Browser navigation parameters of the URL or [SumoTopic] to be loaded. + * + * @property url The URL to be loaded. + * @property sumoTopic The [SumoTopic] to be loaded. + */ +data class BrowserNavigationParams( + val url: String? = null, + val sumoTopic: SumoTopic? = null, +) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuAccessPoint.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuAccessPoint.kt new file mode 100644 index 0000000000..f1d8b3a326 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuAccessPoint.kt @@ -0,0 +1,38 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu + +import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint + +/** + * The origin access points that was used to navigate to the Menu dialog. + */ +enum class MenuAccessPoint { + /** + * Menu was accessed from the browser. + */ + Browser, + + /** + * Menu was accessed from an external app (e.g. custom tab). + */ + External, + + /** + * Menu was accessed from the home screen. + */ + Home, +} + +/** + * Returns the [FenixFxAEntryPoint] equivalent from the given [MenuAccessPoint]. + */ +internal fun MenuAccessPoint.toFenixFxAEntryPoint(): FenixFxAEntryPoint { + return when (this) { + MenuAccessPoint.Browser -> FenixFxAEntryPoint.BrowserToolbar + MenuAccessPoint.External -> FenixFxAEntryPoint.Unknown + MenuAccessPoint.Home -> FenixFxAEntryPoint.HomeMenu + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt index 05890cd71d..c0d9d6f11d 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/MenuDialogFragment.kt @@ -9,25 +9,42 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import mozilla.components.browser.state.selector.selectedTab +import mozilla.components.lib.state.ext.observeAsState +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.components.accounts.AccountState -import org.mozilla.fenix.components.lazyStore -import org.mozilla.fenix.components.menu.compose.MenuDialog +import org.mozilla.fenix.components.components +import org.mozilla.fenix.components.menu.compose.EXTENSIONS_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.ExtensionsSubmenu +import org.mozilla.fenix.components.menu.compose.MAIN_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.MainMenu import org.mozilla.fenix.components.menu.compose.MenuDialogBottomSheet +import org.mozilla.fenix.components.menu.compose.SAVE_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.SaveSubmenu +import org.mozilla.fenix.components.menu.compose.TOOLS_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.ToolsSubmenu +import org.mozilla.fenix.components.menu.middleware.MenuDialogMiddleware import org.mozilla.fenix.components.menu.middleware.MenuNavigationMiddleware +import org.mozilla.fenix.components.menu.store.BrowserMenuState import org.mozilla.fenix.components.menu.store.MenuAction import org.mozilla.fenix.components.menu.store.MenuState import org.mozilla.fenix.components.menu.store.MenuStore import org.mozilla.fenix.ext.runIfFragmentIsAttached import org.mozilla.fenix.settings.SupportUtils -import org.mozilla.fenix.settings.SupportUtils.SumoTopic import org.mozilla.fenix.theme.FirefoxTheme /** @@ -35,18 +52,8 @@ import org.mozilla.fenix.theme.FirefoxTheme */ class MenuDialogFragment : BottomSheetDialogFragment() { - private val store by lazyStore { viewModelScope -> - MenuStore( - initialState = MenuState(), - middleware = listOf( - MenuNavigationMiddleware( - navController = findNavController(), - openSumoTopic = ::openSumoTopic, - scope = viewModelScope, - ), - ), - ) - } + private val args by navArgs<MenuDialogFragmentArgs>() + private val browsingModeManager get() = (activity as HomeActivity).browsingModeManager override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = super.onCreateDialog(savedInstanceState).apply { @@ -59,6 +66,7 @@ class MenuDialogFragment : BottomSheetDialogFragment() { } } + @Suppress("LongMethod") override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -69,42 +77,193 @@ class MenuDialogFragment : BottomSheetDialogFragment() { setContent { FirefoxTheme { MenuDialogBottomSheet(onRequestDismiss = {}) { - MenuDialog( - account = null, - accountState = AccountState.NO_ACCOUNT, - onSignInButtonClick = {}, - onHelpButtonClick = { - store.dispatch(MenuAction.Navigate.Help) - }, - onSettingsButtonClick = { - store.dispatch(MenuAction.Navigate.Settings) - }, - onBookmarksMenuClick = { - store.dispatch(MenuAction.Navigate.Bookmarks) - }, - onHistoryMenuClick = { - store.dispatch(MenuAction.Navigate.History) - }, - onDownloadsMenuClick = { - store.dispatch(MenuAction.Navigate.Downloads) - }, - onPasswordsMenuClick = { - store.dispatch(MenuAction.Navigate.Passwords) - }, - ) + val browserStore = components.core.store + val syncStore = components.backgroundServices.syncStore + val bookmarksStorage = components.core.bookmarksStorage + val addBookmarkUseCase = components.useCases.bookmarksUseCases.addBookmark + val printContentUseCase = components.useCases.sessionUseCases.printContent + val saveToPdfUseCase = components.useCases.sessionUseCases.saveToPdf + val selectedTab = browserStore.state.selectedTab + + val navHostController = rememberNavController() + val coroutineScope = rememberCoroutineScope() + val store = remember { + MenuStore( + initialState = MenuState( + browserMenuState = if (selectedTab != null) { + BrowserMenuState(selectedTab = selectedTab) + } else { + null + }, + ), + middleware = listOf( + MenuDialogMiddleware( + bookmarksStorage = bookmarksStorage, + addBookmarkUseCase = addBookmarkUseCase, + scope = coroutineScope, + ), + MenuNavigationMiddleware( + navController = findNavController(), + navHostController = navHostController, + browsingModeManager = browsingModeManager, + openToBrowser = ::openToBrowser, + scope = coroutineScope, + ), + ), + ) + } + + val account by syncStore.observeAsState(initialValue = null) { state -> state.account } + val accountState by syncStore.observeAsState(initialValue = NotAuthenticated) { state -> + state.accountState + } + val isBookmarked by store.observeAsState(initialValue = false) { state -> + state.browserMenuState != null && state.browserMenuState.bookmarkState.isBookmarked + } + + NavHost( + navController = navHostController, + startDestination = MAIN_MENU_ROUTE, + ) { + composable(route = MAIN_MENU_ROUTE) { + MainMenu( + accessPoint = args.accesspoint, + account = account, + accountState = accountState, + isPrivate = browsingModeManager.mode.isPrivate, + onMozillaAccountButtonClick = { + store.dispatch( + MenuAction.Navigate.MozillaAccount( + accountState = accountState, + accesspoint = args.accesspoint, + ), + ) + }, + onHelpButtonClick = { + store.dispatch(MenuAction.Navigate.Help) + }, + onSettingsButtonClick = { + store.dispatch(MenuAction.Navigate.Settings) + }, + onNewTabMenuClick = { + store.dispatch(MenuAction.Navigate.NewTab) + }, + onNewPrivateTabMenuClick = { + store.dispatch(MenuAction.Navigate.NewPrivateTab) + }, + onSwitchToDesktopSiteMenuClick = {}, + onFindInPageMenuClick = {}, + onToolsMenuClick = { + store.dispatch(MenuAction.Navigate.Tools) + }, + onSaveMenuClick = { + store.dispatch(MenuAction.Navigate.Save) + }, + onExtensionsMenuClick = { + store.dispatch(MenuAction.Navigate.Extensions) + }, + onBookmarksMenuClick = { + store.dispatch(MenuAction.Navigate.Bookmarks) + }, + onHistoryMenuClick = { + store.dispatch(MenuAction.Navigate.History) + }, + onDownloadsMenuClick = { + store.dispatch(MenuAction.Navigate.Downloads) + }, + onPasswordsMenuClick = { + store.dispatch(MenuAction.Navigate.Passwords) + }, + onCustomizeHomepageMenuClick = { + store.dispatch(MenuAction.Navigate.CustomizeHomepage) + }, + onNewInFirefoxMenuClick = { + store.dispatch(MenuAction.Navigate.ReleaseNotes) + }, + ) + } + + composable(route = TOOLS_MENU_ROUTE) { + ToolsSubmenu( + isReaderViewActive = false, + isTranslated = false, + onBackButtonClick = { + store.dispatch(MenuAction.Navigate.Back) + }, + onReaderViewMenuClick = {}, + onTranslatePageMenuClick = { + selectedTab?.let { + store.dispatch(MenuAction.Navigate.Translate) + } + }, + onPrintMenuClick = { + printContentUseCase() + dismiss() + }, + onShareMenuClick = { + selectedTab?.let { + store.dispatch(MenuAction.Navigate.Share) + } + }, + onOpenInAppMenuClick = {}, + ) + } + + composable(route = SAVE_MENU_ROUTE) { + SaveSubmenu( + isBookmarked = isBookmarked, + onBackButtonClick = { + store.dispatch(MenuAction.Navigate.Back) + }, + onBookmarkPageMenuClick = { + store.dispatch(MenuAction.AddBookmark) + }, + onEditBookmarkButtonClick = { + store.dispatch(MenuAction.Navigate.EditBookmark) + }, + onAddToShortcutsMenuClick = {}, + onAddToHomeScreenMenuClick = {}, + onSaveToCollectionMenuClick = {}, + onSaveAsPDFMenuClick = { + saveToPdfUseCase() + dismiss() + }, + ) + } + + composable(route = EXTENSIONS_MENU_ROUTE) { + ExtensionsSubmenu( + onBackButtonClick = { + store.dispatch(MenuAction.Navigate.Back) + }, + onManageExtensionsMenuClick = { + store.dispatch(MenuAction.Navigate.ManageExtensions) + }, + onDiscoverMoreExtensionsMenuClick = { + store.dispatch(MenuAction.Navigate.DiscoverMoreExtensions) + }, + ) + } + } } } } } - private fun openSumoTopic(topic: SumoTopic) = runIfFragmentIsAttached { - (activity as HomeActivity).openToBrowserAndLoad( - searchTermOrURL = SupportUtils.getSumoURLForTopic( + private fun openToBrowser(params: BrowserNavigationParams) = runIfFragmentIsAttached { + val url = params.url ?: params.sumoTopic?.let { + SupportUtils.getSumoURLForTopic( context = requireContext(), - topic = topic, - ), - newTab = true, - from = BrowserDirection.FromMenuDialogFragment, - ) + topic = it, + ) + } + + url?.let { + (activity as HomeActivity).openToBrowserAndLoad( + searchTermOrURL = url, + newTab = true, + from = BrowserDirection.FromMenuDialogFragment, + ) + } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ExtensionsSubmenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ExtensionsSubmenu.kt new file mode 100644 index 0000000000..2bfffb7103 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ExtensionsSubmenu.kt @@ -0,0 +1,101 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.components.menu.compose.header.SubmenuHeader +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.TextListItem +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +internal const val EXTENSIONS_MENU_ROUTE = "extensions_menu" + +@Composable +internal fun ExtensionsSubmenu( + onBackButtonClick: () -> Unit, + onManageExtensionsMenuClick: () -> Unit, + onDiscoverMoreExtensionsMenuClick: () -> Unit, +) { + Column { + SubmenuHeader( + header = stringResource(id = R.string.browser_menu_extensions), + onClick = onBackButtonClick, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Column( + modifier = Modifier + .padding( + start = 16.dp, + top = 12.dp, + end = 16.dp, + bottom = 32.dp, + ), + verticalArrangement = Arrangement.spacedBy(32.dp), + ) { + MenuGroup { + MenuItem( + label = stringResource(id = R.string.browser_menu_manage_extensions), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_extension_cog_24), + onClick = onManageExtensionsMenuClick, + ) + } + + MenuGroup { + TextListItem( + label = stringResource(id = R.string.browser_menu_discover_more_extensions), + onClick = onDiscoverMoreExtensionsMenuClick, + iconPainter = painterResource(R.drawable.mozac_ic_external_link_24), + iconTint = FirefoxTheme.colors.iconSecondary, + ) + } + } + } +} + +@LightDarkPreview +@Composable +private fun ExtensionsSubmenuPreview() { + FirefoxTheme { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + ExtensionsSubmenu( + onBackButtonClick = {}, + onManageExtensionsMenuClick = {}, + onDiscoverMoreExtensionsMenuClick = {}, + ) + } + } +} + +@LightDarkPreview +@Composable +private fun ExtensionsSubmenuPrivatePreview() { + FirefoxTheme(theme = Theme.Private) { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + ExtensionsSubmenu( + onBackButtonClick = {}, + onManageExtensionsMenuClick = {}, + onDiscoverMoreExtensionsMenuClick = {}, + ) + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MainMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MainMenu.kt new file mode 100644 index 0000000000..695fbfcbca --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MainMenu.kt @@ -0,0 +1,365 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import mozilla.components.service.fxa.manager.AccountState +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated +import mozilla.components.service.fxa.store.Account +import org.mozilla.fenix.R +import org.mozilla.fenix.components.menu.MenuAccessPoint +import org.mozilla.fenix.components.menu.compose.header.MenuHeader +import org.mozilla.fenix.compose.Divider +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +internal const val MAIN_MENU_ROUTE = "main_menu" + +/** + * Wrapper column containing the main menu items. + * + * @param accessPoint The [MenuAccessPoint] that was used to navigate to the menu dialog. + * @param account [Account] information available for a synced account. + * @param accountState The [AccountState] of a Mozilla account. + * @param isPrivate Whether or not the browsing mode is in private mode. + * @param onMozillaAccountButtonClick Invoked when the user clicks on Mozilla account button. + * @param onHelpButtonClick Invoked when the user clicks on the help button. + * @param onSettingsButtonClick Invoked when the user clicks on the settings button. + * @param onNewTabMenuClick Invoked when the user clicks on the new tab menu item. + * @param onNewPrivateTabMenuClick Invoked when the user clicks on the new private tab menu item. + * @param onSwitchToDesktopSiteMenuClick Invoked when the user clicks on the switch to desktop site + * menu toggle. + * @param onFindInPageMenuClick Invoked when the user clicks on the find in page menu item. + * @param onToolsMenuClick Invoked when the user clicks on the tools menu item. + * @param onSaveMenuClick Invoked when the user clicks on the save menu item. + * @param onExtensionsMenuClick Invoked when the user clicks on the extensions menu item. + * @param onBookmarksMenuClick Invoked when the user clicks on the bookmarks menu item. + * @param onHistoryMenuClick Invoked when the user clicks on the history menu item. + * @param onDownloadsMenuClick Invoked when the user clicks on the downloads menu item. + * @param onPasswordsMenuClick Invoked when the user clicks on the passwords menu item. + * @param onCustomizeHomepageMenuClick Invoked when the user clicks on the customize + * homepage menu item. + * @param onNewInFirefoxMenuClick Invoked when the user clicks on the release note menu item. + */ +@Suppress("LongParameterList") +@Composable +internal fun MainMenu( + accessPoint: MenuAccessPoint, + account: Account?, + accountState: AccountState, + isPrivate: Boolean, + onMozillaAccountButtonClick: () -> Unit, + onHelpButtonClick: () -> Unit, + onSettingsButtonClick: () -> Unit, + onNewTabMenuClick: () -> Unit, + onNewPrivateTabMenuClick: () -> Unit, + onSwitchToDesktopSiteMenuClick: () -> Unit, + onFindInPageMenuClick: () -> Unit, + onToolsMenuClick: () -> Unit, + onSaveMenuClick: () -> Unit, + onExtensionsMenuClick: () -> Unit, + onBookmarksMenuClick: () -> Unit, + onHistoryMenuClick: () -> Unit, + onDownloadsMenuClick: () -> Unit, + onPasswordsMenuClick: () -> Unit, + onCustomizeHomepageMenuClick: () -> Unit, + onNewInFirefoxMenuClick: () -> Unit, +) { + Column { + MenuHeader( + account = account, + accountState = accountState, + onMozillaAccountButtonClick = onMozillaAccountButtonClick, + onHelpButtonClick = onHelpButtonClick, + onSettingsButtonClick = onSettingsButtonClick, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Column( + modifier = Modifier + .padding( + start = 16.dp, + top = 12.dp, + end = 16.dp, + bottom = 32.dp, + ), + verticalArrangement = Arrangement.spacedBy(32.dp), + ) { + NewTabsMenuGroup( + accessPoint = accessPoint, + isPrivate = isPrivate, + onNewTabMenuClick = onNewTabMenuClick, + onNewPrivateTabMenuClick = onNewPrivateTabMenuClick, + ) + + ToolsAndActionsMenuGroup( + accessPoint = accessPoint, + onSwitchToDesktopSiteMenuClick = onSwitchToDesktopSiteMenuClick, + onFindInPageMenuClick = onFindInPageMenuClick, + onToolsMenuClick = onToolsMenuClick, + onSaveMenuClick = onSaveMenuClick, + onExtensionsMenuClick = onExtensionsMenuClick, + ) + + LibraryMenuGroup( + onBookmarksMenuClick = onBookmarksMenuClick, + onHistoryMenuClick = onHistoryMenuClick, + onDownloadsMenuClick = onDownloadsMenuClick, + onPasswordsMenuClick = onPasswordsMenuClick, + ) + + if (accessPoint == MenuAccessPoint.Home) { + HomepageMenuGroup( + onCustomizeHomepageMenuClick = onCustomizeHomepageMenuClick, + onNewInFirefoxMenuClick = onNewInFirefoxMenuClick, + ) + } + } + } +} + +@Composable +private fun NewTabsMenuGroup( + accessPoint: MenuAccessPoint, + isPrivate: Boolean, + onNewTabMenuClick: () -> Unit, + onNewPrivateTabMenuClick: () -> Unit, +) { + val isNewTabMenuEnabled: Boolean + val isNewPrivateTabMenuEnabled: Boolean + + when (accessPoint) { + MenuAccessPoint.Browser, + MenuAccessPoint.External, + -> { + isNewTabMenuEnabled = true + isNewPrivateTabMenuEnabled = true + } + + MenuAccessPoint.Home -> { + isNewTabMenuEnabled = isPrivate + isNewPrivateTabMenuEnabled = !isPrivate + } + } + + MenuGroup { + MenuItem( + label = stringResource(id = R.string.library_new_tab), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_plus_24), + state = if (isNewTabMenuEnabled) MenuItemState.ENABLED else MenuItemState.DISABLED, + onClick = onNewTabMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_new_private_tab), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_private_mode_circle_fill_24), + state = if (isNewPrivateTabMenuEnabled) MenuItemState.ENABLED else MenuItemState.DISABLED, + onClick = onNewPrivateTabMenuClick, + ) + } +} + +@Composable +private fun ToolsAndActionsMenuGroup( + accessPoint: MenuAccessPoint, + onSwitchToDesktopSiteMenuClick: () -> Unit, + onFindInPageMenuClick: () -> Unit, + onToolsMenuClick: () -> Unit, + onSaveMenuClick: () -> Unit, + onExtensionsMenuClick: () -> Unit, +) { + MenuGroup { + if (accessPoint == MenuAccessPoint.Browser) { + MenuItem( + label = stringResource(id = R.string.browser_menu_switch_to_desktop_site), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_device_desktop_24), + onClick = onSwitchToDesktopSiteMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_find_in_page_2), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_search_24), + onClick = onFindInPageMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_tools), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_tool_24), + onClick = onToolsMenuClick, + afterIconPainter = painterResource(id = R.drawable.mozac_ic_chevron_right_24), + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_save), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_save_24), + onClick = onSaveMenuClick, + afterIconPainter = painterResource(id = R.drawable.mozac_ic_chevron_right_24), + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + } + + MenuItem( + label = stringResource(id = R.string.browser_menu_extensions), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_extension_24), + onClick = onExtensionsMenuClick, + afterIconPainter = painterResource(id = R.drawable.mozac_ic_chevron_right_24), + ) + } +} + +@Composable +private fun LibraryMenuGroup( + onBookmarksMenuClick: () -> Unit, + onHistoryMenuClick: () -> Unit, + onDownloadsMenuClick: () -> Unit, + onPasswordsMenuClick: () -> Unit, +) { + MenuGroup { + MenuItem( + label = stringResource(id = R.string.library_bookmarks), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_bookmark_tray_fill_24), + onClick = onBookmarksMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.library_history), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_history_24), + onClick = onHistoryMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.library_downloads), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_download_24), + onClick = onDownloadsMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_passwords), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_login_24), + onClick = onPasswordsMenuClick, + ) + } +} + +@Composable +private fun HomepageMenuGroup( + onCustomizeHomepageMenuClick: () -> Unit, + onNewInFirefoxMenuClick: () -> Unit, +) { + MenuGroup { + MenuItem( + label = stringResource(id = R.string.browser_menu_customize_home_1), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_grid_add_24), + onClick = onCustomizeHomepageMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource( + id = R.string.browser_menu_new_in_firefox, + stringResource(id = R.string.app_name), + ), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_whats_new_24), + onClick = onNewInFirefoxMenuClick, + ) + } +} + +@LightDarkPreview +@Composable +private fun MenuDialogPreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer3), + ) { + MainMenu( + accessPoint = MenuAccessPoint.Home, + account = null, + accountState = NotAuthenticated, + isPrivate = false, + onMozillaAccountButtonClick = {}, + onHelpButtonClick = {}, + onSettingsButtonClick = {}, + onNewTabMenuClick = {}, + onNewPrivateTabMenuClick = {}, + onSwitchToDesktopSiteMenuClick = {}, + onFindInPageMenuClick = {}, + onToolsMenuClick = {}, + onSaveMenuClick = {}, + onExtensionsMenuClick = {}, + onBookmarksMenuClick = {}, + onHistoryMenuClick = {}, + onDownloadsMenuClick = {}, + onPasswordsMenuClick = {}, + onCustomizeHomepageMenuClick = {}, + onNewInFirefoxMenuClick = {}, + ) + } + } +} + +@Preview +@Composable +private fun MenuDialogPrivatePreview() { + FirefoxTheme(theme = Theme.Private) { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer3), + ) { + MainMenu( + accessPoint = MenuAccessPoint.Home, + account = null, + accountState = NotAuthenticated, + isPrivate = false, + onMozillaAccountButtonClick = {}, + onHelpButtonClick = {}, + onSettingsButtonClick = {}, + onNewTabMenuClick = {}, + onNewPrivateTabMenuClick = {}, + onSwitchToDesktopSiteMenuClick = {}, + onFindInPageMenuClick = {}, + onToolsMenuClick = {}, + onSaveMenuClick = {}, + onExtensionsMenuClick = {}, + onBookmarksMenuClick = {}, + onHistoryMenuClick = {}, + onDownloadsMenuClick = {}, + onPasswordsMenuClick = {}, + onCustomizeHomepageMenuClick = {}, + onNewInFirefoxMenuClick = {}, + ) + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuDialog.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuDialog.kt deleted file mode 100644 index a9747fce84..0000000000 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuDialog.kt +++ /dev/null @@ -1,203 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.components.menu.compose - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import mozilla.components.service.fxa.store.Account -import org.mozilla.fenix.R -import org.mozilla.fenix.components.accounts.AccountState -import org.mozilla.fenix.components.accounts.AccountState.NO_ACCOUNT -import org.mozilla.fenix.components.menu.compose.header.MenuHeader -import org.mozilla.fenix.compose.Divider -import org.mozilla.fenix.compose.annotation.LightDarkPreview -import org.mozilla.fenix.compose.list.IconListItem -import org.mozilla.fenix.theme.FirefoxTheme -import org.mozilla.fenix.theme.Theme - -/** - * The menu bottom sheet dialog. - * - * @param account [Account] information available for a synced account. - * @param accountState The [AccountState] of a synced account. - * @param onSignInButtonClick Invoked when the user clicks on the "Sign in" button. - * @param onHelpButtonClick Invoked when the user clicks on the help button. - * @param onSettingsButtonClick Invoked when the user clicks on the settings button. - * @param onBookmarksMenuClick Invoked when the user clicks on the bookmarks menu item. - * @param onHistoryMenuClick Invoked when the user clicks on the history menu item. - * @param onDownloadsMenuClick Invoked when the user clicks on the downloads menu item. - * @param onPasswordsMenuClick Invoked when the user clicks on the passwords menu item. - */ -@Suppress("LongParameterList") -@Composable -fun MenuDialog( - account: Account?, - accountState: AccountState, - onSignInButtonClick: () -> Unit, - onHelpButtonClick: () -> Unit, - onSettingsButtonClick: () -> Unit, - onBookmarksMenuClick: () -> Unit, - onHistoryMenuClick: () -> Unit, - onDownloadsMenuClick: () -> Unit, - onPasswordsMenuClick: () -> Unit, -) { - Column { - MenuHeader( - account = account, - accountState = accountState, - onSignInButtonClick = onSignInButtonClick, - onHelpButtonClick = onHelpButtonClick, - onSettingsButtonClick = onSettingsButtonClick, - ) - - Spacer(modifier = Modifier.height(8.dp)) - - MainMenu( - onBookmarksMenuClick = onBookmarksMenuClick, - onHistoryMenuClick = onHistoryMenuClick, - onDownloadsMenuClick = onDownloadsMenuClick, - onPasswordsMenuClick = onPasswordsMenuClick, - ) - } -} - -/** - * Wrapper column containing the main menu items. - */ -@Composable -private fun MainMenu( - onBookmarksMenuClick: () -> Unit, - onHistoryMenuClick: () -> Unit, - onDownloadsMenuClick: () -> Unit, - onPasswordsMenuClick: () -> Unit, -) { - Column( - modifier = Modifier - .padding( - start = 16.dp, - top = 12.dp, - end = 16.dp, - bottom = 32.dp, - ), - verticalArrangement = Arrangement.spacedBy(32.dp), - ) { - MenuGroup { - IconListItem( - label = stringResource(id = R.string.library_new_tab), - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_plus_24), - ) - - Divider(color = FirefoxTheme.colors.borderSecondary) - - IconListItem( - label = stringResource(id = R.string.browser_menu_new_private_tab), - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_private_mode_circle_fill_24), - ) - } - - LibraryMenuGroup( - onBookmarksMenuClick = onBookmarksMenuClick, - onHistoryMenuClick = onHistoryMenuClick, - onDownloadsMenuClick = onDownloadsMenuClick, - onPasswordsMenuClick = onPasswordsMenuClick, - ) - } -} - -@Composable -private fun LibraryMenuGroup( - onBookmarksMenuClick: () -> Unit, - onHistoryMenuClick: () -> Unit, - onDownloadsMenuClick: () -> Unit, - onPasswordsMenuClick: () -> Unit, -) { - MenuGroup { - IconListItem( - label = stringResource(id = R.string.library_bookmarks), - onClick = onBookmarksMenuClick, - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_bookmark_tray_fill_24), - ) - - Divider(color = FirefoxTheme.colors.borderSecondary) - - IconListItem( - label = stringResource(id = R.string.library_history), - onClick = onHistoryMenuClick, - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_history_24), - ) - - Divider(color = FirefoxTheme.colors.borderSecondary) - - IconListItem( - label = stringResource(id = R.string.library_downloads), - onClick = onDownloadsMenuClick, - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_download_24), - ) - - Divider(color = FirefoxTheme.colors.borderSecondary) - - IconListItem( - label = stringResource(id = R.string.browser_menu_passwords), - onClick = onPasswordsMenuClick, - beforeIconPainter = painterResource(id = R.drawable.mozac_ic_login_24), - ) - } -} - -@LightDarkPreview -@Composable -private fun MenuDialogPreview() { - FirefoxTheme { - Column( - modifier = Modifier - .background(color = FirefoxTheme.colors.layer3), - ) { - MenuDialog( - account = null, - accountState = NO_ACCOUNT, - onSignInButtonClick = {}, - onHelpButtonClick = {}, - onSettingsButtonClick = {}, - onBookmarksMenuClick = {}, - onHistoryMenuClick = {}, - onDownloadsMenuClick = {}, - onPasswordsMenuClick = {}, - ) - } - } -} - -@Preview -@Composable -private fun MenuDialogPrivatePreview() { - FirefoxTheme(theme = Theme.Private) { - Column( - modifier = Modifier - .background(color = FirefoxTheme.colors.layer3), - ) { - MenuDialog( - account = null, - accountState = NO_ACCOUNT, - onSignInButtonClick = {}, - onHelpButtonClick = {}, - onSettingsButtonClick = {}, - onBookmarksMenuClick = {}, - onHistoryMenuClick = {}, - onDownloadsMenuClick = {}, - onPasswordsMenuClick = {}, - ) - } - } -} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuGroup.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuGroup.kt index 1b2fb0ab2f..811ab69db9 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuGroup.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuGroup.kt @@ -19,7 +19,6 @@ import androidx.compose.ui.unit.dp import org.mozilla.fenix.R import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.annotation.LightDarkPreview -import org.mozilla.fenix.compose.list.IconListItem import org.mozilla.fenix.theme.FirefoxTheme private val ROUNDED_CORNER_SHAPE = RoundedCornerShape(12.dp) @@ -60,14 +59,14 @@ private fun MenuGroupPreview() { .padding(16.dp), ) { MenuGroup { - IconListItem( + MenuItem( label = stringResource(id = R.string.browser_menu_add_to_homescreen), beforeIconPainter = painterResource(id = R.drawable.mozac_ic_plus_24), ) Divider(color = FirefoxTheme.colors.borderSecondary) - IconListItem( + MenuItem( label = stringResource(id = R.string.browser_menu_add_to_homescreen), beforeIconPainter = painterResource(id = R.drawable.mozac_ic_plus_24), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuItem.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuItem.kt new file mode 100644 index 0000000000..41f64670a2 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/MenuItem.kt @@ -0,0 +1,202 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.Divider +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.IconListItem +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * An [IconListItem] wrapper for menu items in a [MenuGroup] with an optional icon at the end. + * + * @param label The label in the menu item. + * @param beforeIconPainter [Painter] used to display an [Icon] before the list item. + * @param beforeIconDescription Content description of the icon. + * @param description An optional description text below the label. + * @param state The state of the menu item to display. + * @param onClick Invoked when the user clicks on the item. + * @param afterIconPainter [Painter] used to display an [IconButton] after the list item. + * @param afterIconDescription Content description of the icon. + */ +@Composable +internal fun MenuItem( + label: String, + beforeIconPainter: Painter, + beforeIconDescription: String? = null, + description: String? = null, + state: MenuItemState = MenuItemState.ENABLED, + onClick: (() -> Unit)? = null, + afterIconPainter: Painter? = null, + afterIconDescription: String? = null, +) { + val labelTextColor = getLabelTextColor(state = state) + val iconTint = getIconTint(state = state) + val enabled = state != MenuItemState.DISABLED + + IconListItem( + label = label, + labelTextColor = labelTextColor, + description = description, + enabled = enabled, + onClick = onClick, + beforeIconPainter = beforeIconPainter, + beforeIconDescription = beforeIconDescription, + beforeIconTint = iconTint, + afterIconPainter = afterIconPainter, + afterIconDescription = afterIconDescription, + afterIconTint = iconTint, + ) +} + +/** + * An [IconListItem] wrapper for menu items in a [MenuGroup] with an optional text button at the end. + * + * @param label The label in the menu item. + * @param beforeIconPainter [Painter] used to display an [Icon] before the list item. + * @param beforeIconDescription Content description of the icon. + * @param description An optional description text below the label. + * @param state The state of the menu item to display. + * @param onClick Invoked when the user clicks on the item. + * @param afterButtonText The button text to be displayed after the list item. + * @param afterButtonTextColor [Color] to apply to [afterButtonText]. + * @param onAfterButtonClick Called when the user clicks on the text button. + */ +@Composable +internal fun MenuItem( + label: String, + beforeIconPainter: Painter, + beforeIconDescription: String? = null, + description: String? = null, + state: MenuItemState = MenuItemState.ENABLED, + onClick: (() -> Unit)? = null, + afterButtonText: String? = null, + afterButtonTextColor: Color = FirefoxTheme.colors.actionPrimary, + onAfterButtonClick: (() -> Unit)? = null, +) { + val labelTextColor = getLabelTextColor(state = state) + val iconTint = getIconTint(state = state) + val enabled = state != MenuItemState.DISABLED + + IconListItem( + label = label, + labelTextColor = labelTextColor, + description = description, + enabled = enabled, + onClick = onClick, + beforeIconPainter = beforeIconPainter, + beforeIconDescription = beforeIconDescription, + beforeIconTint = iconTint, + afterButtonText = afterButtonText, + afterButtonTextColor = afterButtonTextColor, + onAfterButtonClick = onAfterButtonClick, + ) +} + +/** + * Enum containing all the supported state for the menu item. + */ +enum class MenuItemState { + /** + * The menu item is enabled. + */ + ENABLED, + + /** + * The menu item is disabled and is not clickable. + */ + DISABLED, + + /** + * The menu item is highlighted to indicate the feature behind the menu item is active. + */ + ACTIVE, + + /** + * The menu item is highlighted to indicate the feature behind the menu item is destructive. + */ + WARNING, +} + +@Composable +private fun getLabelTextColor(state: MenuItemState): Color { + return when (state) { + MenuItemState.ACTIVE -> FirefoxTheme.colors.textAccent + MenuItemState.WARNING -> FirefoxTheme.colors.textCritical + else -> FirefoxTheme.colors.textPrimary + } +} + +@Composable +private fun getIconTint(state: MenuItemState): Color { + return when (state) { + MenuItemState.ACTIVE -> FirefoxTheme.colors.iconAccentViolet + MenuItemState.WARNING -> FirefoxTheme.colors.iconCritical + else -> FirefoxTheme.colors.iconSecondary + } +} + +@LightDarkPreview +@Composable +private fun MenuItemPreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer3) + .padding(16.dp), + ) { + MenuGroup { + for (state in MenuItemState.entries) { + MenuItem( + label = stringResource(id = R.string.browser_menu_translations), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_translate_24), + state = state, + onClick = {}, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + } + + for (state in MenuItemState.entries) { + MenuItem( + label = stringResource(id = R.string.browser_menu_extensions), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_extension_24), + state = state, + onClick = {}, + afterIconPainter = painterResource(id = R.drawable.mozac_ic_chevron_right_24), + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + } + + for (state in MenuItemState.entries) { + MenuItem( + label = stringResource(id = R.string.library_bookmarks), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_bookmark_tray_fill_24), + state = state, + onClick = {}, + afterButtonText = stringResource(id = R.string.browser_menu_edit), + onAfterButtonClick = {}, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + } + } + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/SaveSubmenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/SaveSubmenu.kt new file mode 100644 index 0000000000..9ceda75cea --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/SaveSubmenu.kt @@ -0,0 +1,163 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.components.menu.compose.header.SubmenuHeader +import org.mozilla.fenix.compose.Divider +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +internal const val SAVE_MENU_ROUTE = "save_menu" + +@Suppress("LongParameterList") +@Composable +internal fun SaveSubmenu( + isBookmarked: Boolean, + onBackButtonClick: () -> Unit, + onBookmarkPageMenuClick: () -> Unit, + onEditBookmarkButtonClick: () -> Unit, + onAddToShortcutsMenuClick: () -> Unit, + onAddToHomeScreenMenuClick: () -> Unit, + onSaveToCollectionMenuClick: () -> Unit, + onSaveAsPDFMenuClick: () -> Unit, +) { + Column { + SubmenuHeader( + header = stringResource(id = R.string.browser_menu_save), + onClick = onBackButtonClick, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Column( + modifier = Modifier + .padding( + start = 16.dp, + top = 12.dp, + end = 16.dp, + bottom = 32.dp, + ), + verticalArrangement = Arrangement.spacedBy(32.dp), + ) { + MenuGroup { + BookmarkMenuItem( + isBookmarked = isBookmarked, + onBookmarkPageMenuClick = onBookmarkPageMenuClick, + onEditBookmarkButtonClick = onEditBookmarkButtonClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_add_to_shortcuts), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_pin_24), + onClick = onAddToShortcutsMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_add_to_homescreen_2), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_add_to_homescreen_24), + onClick = onAddToHomeScreenMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_save_to_collection), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_collection_24), + onClick = onSaveToCollectionMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_save_as_pdf), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_save_file_24), + onClick = onSaveAsPDFMenuClick, + ) + } + } + } +} + +@Composable +private fun BookmarkMenuItem( + isBookmarked: Boolean, + onBookmarkPageMenuClick: () -> Unit, + onEditBookmarkButtonClick: () -> Unit, +) { + if (isBookmarked) { + MenuItem( + label = stringResource(id = R.string.browser_menu_edit_bookmark), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_bookmark_fill_24), + state = MenuItemState.ACTIVE, + onClick = onEditBookmarkButtonClick, + ) + } else { + MenuItem( + label = stringResource(id = R.string.browser_menu_bookmark_this_page), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_bookmark_24), + onClick = onBookmarkPageMenuClick, + ) + } +} + +@LightDarkPreview +@Composable +private fun SaveSubmenuPreview() { + FirefoxTheme { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + SaveSubmenu( + isBookmarked = false, + onBackButtonClick = {}, + onBookmarkPageMenuClick = {}, + onEditBookmarkButtonClick = {}, + onAddToShortcutsMenuClick = {}, + onAddToHomeScreenMenuClick = {}, + onSaveToCollectionMenuClick = {}, + onSaveAsPDFMenuClick = {}, + ) + } + } +} + +@Preview +@Composable +private fun SaveSubmenuPrivatePreview() { + FirefoxTheme(theme = Theme.Private) { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + SaveSubmenu( + isBookmarked = false, + onBackButtonClick = {}, + onBookmarkPageMenuClick = {}, + onEditBookmarkButtonClick = {}, + onAddToShortcutsMenuClick = {}, + onAddToHomeScreenMenuClick = {}, + onSaveToCollectionMenuClick = {}, + onSaveAsPDFMenuClick = {}, + ) + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ToolsSubmenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ToolsSubmenu.kt new file mode 100644 index 0000000000..7f80d5c3e9 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/ToolsSubmenu.kt @@ -0,0 +1,184 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.components.menu.compose.header.SubmenuHeader +import org.mozilla.fenix.compose.Divider +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +internal const val TOOLS_MENU_ROUTE = "tools_menu" + +@Suppress("LongParameterList") +@Composable +internal fun ToolsSubmenu( + isReaderViewActive: Boolean, + isTranslated: Boolean, + onBackButtonClick: () -> Unit, + onReaderViewMenuClick: () -> Unit, + onTranslatePageMenuClick: () -> Unit, + onPrintMenuClick: () -> Unit, + onShareMenuClick: () -> Unit, + onOpenInAppMenuClick: () -> Unit, +) { + Column { + SubmenuHeader( + header = stringResource(id = R.string.browser_menu_tools), + onClick = onBackButtonClick, + ) + + Spacer(modifier = Modifier.height(8.dp)) + + Column( + modifier = Modifier + .padding( + start = 16.dp, + top = 12.dp, + end = 16.dp, + bottom = 32.dp, + ), + verticalArrangement = Arrangement.spacedBy(32.dp), + ) { + MenuGroup { + ReaderViewMenuItem( + isReaderViewActive = isReaderViewActive, + onClick = onReaderViewMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + TranslationMenuItem( + isTranslated = isTranslated, + onClick = onTranslatePageMenuClick, + ) + } + + MenuGroup { + MenuItem( + label = stringResource(id = R.string.browser_menu_print), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_print_24), + onClick = onPrintMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_share_2), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_share_android_24), + onClick = onShareMenuClick, + ) + + Divider(color = FirefoxTheme.colors.borderSecondary) + + MenuItem( + label = stringResource(id = R.string.browser_menu_open_app_link), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_more_grid_24), + onClick = onOpenInAppMenuClick, + ) + } + } + } +} + +@Composable +private fun ReaderViewMenuItem( + isReaderViewActive: Boolean, + onClick: () -> Unit, +) { + if (isReaderViewActive) { + MenuItem( + label = stringResource(id = R.string.browser_menu_turn_off_reader_view), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_reader_view_fill_24), + state = MenuItemState.ACTIVE, + onClick = onClick, + ) + } else { + MenuItem( + label = stringResource(id = R.string.browser_menu_turn_on_reader_view), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_reader_view_24), + onClick = onClick, + ) + } +} + +@Composable +private fun TranslationMenuItem( + isTranslated: Boolean, + onClick: () -> Unit, +) { + if (isTranslated) { + MenuItem( + label = stringResource( + id = R.string.browser_menu_translated_to, + stringResource(id = R.string.app_name), + ), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_translate_24), + state = MenuItemState.ACTIVE, + onClick = onClick, + ) + } else { + MenuItem( + label = stringResource(id = R.string.browser_menu_translate_page), + beforeIconPainter = painterResource(id = R.drawable.mozac_ic_translate_24), + onClick = onClick, + ) + } +} + +@LightDarkPreview +@Composable +private fun ToolsSubmenuPreview() { + FirefoxTheme { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + ToolsSubmenu( + isReaderViewActive = false, + isTranslated = false, + onBackButtonClick = {}, + onReaderViewMenuClick = {}, + onTranslatePageMenuClick = {}, + onPrintMenuClick = {}, + onShareMenuClick = {}, + onOpenInAppMenuClick = {}, + ) + } + } +} + +@Preview +@Composable +private fun ToolsSubmenuPrivatePreview() { + FirefoxTheme(theme = Theme.Private) { + Column( + modifier = Modifier.background(color = FirefoxTheme.colors.layer3), + ) { + ToolsSubmenu( + isReaderViewActive = false, + isTranslated = false, + onBackButtonClick = {}, + onReaderViewMenuClick = {}, + onTranslatePageMenuClick = {}, + onPrintMenuClick = {}, + onShareMenuClick = {}, + onOpenInAppMenuClick = {}, + ) + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MenuHeader.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MenuHeader.kt index 1c31f8b87f..a9391696d9 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MenuHeader.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MenuHeader.kt @@ -20,10 +20,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import mozilla.components.service.fxa.manager.AccountState +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated import mozilla.components.service.fxa.store.Account import org.mozilla.fenix.R -import org.mozilla.fenix.components.accounts.AccountState -import org.mozilla.fenix.components.accounts.AccountState.NO_ACCOUNT import org.mozilla.fenix.compose.Divider import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.theme.FirefoxTheme @@ -33,7 +33,7 @@ import org.mozilla.fenix.theme.Theme internal fun MenuHeader( account: Account?, accountState: AccountState, - onSignInButtonClick: () -> Unit, + onMozillaAccountButtonClick: () -> Unit, onHelpButtonClick: () -> Unit, onSettingsButtonClick: () -> Unit, ) { @@ -46,7 +46,7 @@ internal fun MenuHeader( MozillaAccountMenuButton( account = account, accountState = accountState, - onSignInButtonClick = onSignInButtonClick, + onClick = onMozillaAccountButtonClick, modifier = Modifier.weight(1f), ) @@ -86,8 +86,8 @@ private fun MenuHeaderPreview() { ) { MenuHeader( account = null, - accountState = NO_ACCOUNT, - onSignInButtonClick = {}, + accountState = NotAuthenticated, + onMozillaAccountButtonClick = {}, onHelpButtonClick = {}, onSettingsButtonClick = {}, ) @@ -105,8 +105,8 @@ private fun MenuHeaderPrivatePreview() { ) { MenuHeader( account = null, - accountState = NO_ACCOUNT, - onSignInButtonClick = {}, + accountState = NotAuthenticated, + onMozillaAccountButtonClick = {}, onHelpButtonClick = {}, onSettingsButtonClick = {}, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MozillaAccountMenuButton.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MozillaAccountMenuButton.kt index 9cf00e248a..4e8663c81a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MozillaAccountMenuButton.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/MozillaAccountMenuButton.kt @@ -12,7 +12,9 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon import androidx.compose.material.Text @@ -24,24 +26,28 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import mozilla.components.service.fxa.manager.AccountState +import mozilla.components.service.fxa.manager.AccountState.Authenticated +import mozilla.components.service.fxa.manager.AccountState.Authenticating +import mozilla.components.service.fxa.manager.AccountState.AuthenticationProblem +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated import mozilla.components.service.fxa.store.Account import org.mozilla.fenix.R -import org.mozilla.fenix.components.accounts.AccountState -import org.mozilla.fenix.components.accounts.AccountState.AUTHENTICATED -import org.mozilla.fenix.components.accounts.AccountState.NEEDS_REAUTHENTICATION -import org.mozilla.fenix.components.accounts.AccountState.NO_ACCOUNT +import org.mozilla.fenix.compose.Image import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.theme.FirefoxTheme import org.mozilla.fenix.theme.Theme private val BUTTON_HEIGHT = 56.dp private val BUTTON_SHAPE = RoundedCornerShape(size = 8.dp) +private val ICON_SHAPE = RoundedCornerShape(size = 24.dp) +private val AVATAR_SIZE = 24.dp @Composable internal fun MozillaAccountMenuButton( account: Account?, accountState: AccountState, - onSignInButtonClick: () -> Unit, + onClick: () -> Unit, modifier: Modifier = Modifier, ) { Row( @@ -51,13 +57,13 @@ internal fun MozillaAccountMenuButton( shape = BUTTON_SHAPE, ) .clip(shape = BUTTON_SHAPE) - .clickable { onSignInButtonClick() } + .clickable { onClick() } .defaultMinSize(minHeight = BUTTON_HEIGHT), verticalAlignment = Alignment.CenterVertically, ) { Spacer(modifier = Modifier.width(4.dp)) - AvatarIcon() + AvatarIcon(account) Column( modifier = Modifier @@ -65,7 +71,7 @@ internal fun MozillaAccountMenuButton( .weight(1f), ) { when (accountState) { - NO_ACCOUNT -> { + NotAuthenticated -> { Text( text = stringResource(id = R.string.browser_menu_sign_in), color = FirefoxTheme.colors.textSecondary, @@ -81,7 +87,7 @@ internal fun MozillaAccountMenuButton( ) } - NEEDS_REAUTHENTICATION -> { + AuthenticationProblem -> { Text( text = stringResource(id = R.string.browser_menu_sign_back_in_to_sync), color = FirefoxTheme.colors.textSecondary, @@ -91,13 +97,13 @@ internal fun MozillaAccountMenuButton( Text( text = stringResource(id = R.string.browser_menu_syncing_paused_caption), - color = FirefoxTheme.colors.textWarning, + color = FirefoxTheme.colors.textCritical, maxLines = 2, style = FirefoxTheme.typography.caption, ) } - AUTHENTICATED -> { + Authenticated -> { Text( text = account?.displayName ?: account?.email ?: stringResource(id = R.string.browser_menu_account_settings), @@ -106,14 +112,16 @@ internal fun MozillaAccountMenuButton( style = FirefoxTheme.typography.headline7, ) } + + is Authenticating -> Unit } } - if (accountState == NEEDS_REAUTHENTICATION) { + if (accountState == AuthenticationProblem) { Icon( painter = painterResource(R.drawable.mozac_ic_warning_fill_24), contentDescription = null, - tint = FirefoxTheme.colors.iconWarning, + tint = FirefoxTheme.colors.iconCritical, ) Spacer(modifier = Modifier.width(8.dp)) @@ -122,14 +130,14 @@ internal fun MozillaAccountMenuButton( } @Composable -private fun AvatarIcon() { +private fun FallbackAvatarIcon() { Icon( painter = painterResource(id = R.drawable.mozac_ic_avatar_circle_24), contentDescription = null, modifier = Modifier .background( color = FirefoxTheme.colors.layer2, - shape = RoundedCornerShape(size = 24.dp), + shape = ICON_SHAPE, ) .padding(all = 4.dp), tint = FirefoxTheme.colors.iconSecondary, @@ -137,6 +145,30 @@ private fun AvatarIcon() { } @Composable +private fun AvatarIcon(account: Account?) { + val avatarUrl = account?.avatar?.url + + if (avatarUrl != null) { + Image( + url = avatarUrl, + modifier = Modifier + .background( + color = FirefoxTheme.colors.layer2, + shape = ICON_SHAPE, + ) + .padding(all = 4.dp) + .size(AVATAR_SIZE) + .clip(CircleShape), + targetSize = AVATAR_SIZE, + placeholder = { FallbackAvatarIcon() }, + fallback = { FallbackAvatarIcon() }, + ) + } else { + FallbackAvatarIcon() + } +} + +@Composable private fun MenuHeaderPreviewContent() { Column( modifier = Modifier @@ -146,14 +178,14 @@ private fun MenuHeaderPreviewContent() { ) { MozillaAccountMenuButton( account = null, - accountState = NO_ACCOUNT, - onSignInButtonClick = {}, + accountState = NotAuthenticated, + onClick = {}, ) MozillaAccountMenuButton( account = null, - accountState = NEEDS_REAUTHENTICATION, - onSignInButtonClick = {}, + accountState = AuthenticationProblem, + onClick = {}, ) MozillaAccountMenuButton( @@ -165,8 +197,8 @@ private fun MenuHeaderPreviewContent() { currentDeviceId = null, sessionToken = null, ), - accountState = AUTHENTICATED, - onSignInButtonClick = {}, + accountState = Authenticated, + onClick = {}, ) MozillaAccountMenuButton( @@ -178,8 +210,8 @@ private fun MenuHeaderPreviewContent() { currentDeviceId = null, sessionToken = null, ), - accountState = AUTHENTICATED, - onSignInButtonClick = {}, + accountState = Authenticated, + onClick = {}, ) MozillaAccountMenuButton( @@ -191,8 +223,8 @@ private fun MenuHeaderPreviewContent() { currentDeviceId = null, sessionToken = null, ), - accountState = AUTHENTICATED, - onSignInButtonClick = {}, + accountState = Authenticated, + onClick = {}, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/SubmenuHeader.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/SubmenuHeader.kt new file mode 100644 index 0000000000..6b47ea17db --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/compose/header/SubmenuHeader.kt @@ -0,0 +1,94 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.compose.header + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.heading +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme +import org.mozilla.fenix.theme.Theme + +@Composable +internal fun SubmenuHeader( + header: String, + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .padding(start = 4.dp, end = 16.dp) + .defaultMinSize(minHeight = 56.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + IconButton( + onClick = { onClick() }, + ) { + Icon( + painter = painterResource(id = R.drawable.mozac_ic_back_24), + contentDescription = null, + tint = FirefoxTheme.colors.iconSecondary, + ) + } + + Spacer(modifier = Modifier.width(4.dp)) + + Text( + text = header, + modifier = Modifier + .weight(1f) + .semantics { heading() }, + color = FirefoxTheme.colors.textSecondary, + style = FirefoxTheme.typography.headline7, + ) + } +} + +@LightDarkPreview +@Composable +private fun SubmenuHeaderPreview() { + FirefoxTheme { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer3), + ) { + SubmenuHeader( + header = "sub-menu header", + onClick = {}, + ) + } + } +} + +@Preview +@Composable +private fun SubmenuMenuHeaderPrivatePreview() { + FirefoxTheme(theme = Theme.Private) { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer3), + ) { + SubmenuHeader( + header = "sub-menu header", + onClick = {}, + ) + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuDialogMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuDialogMiddleware.kt new file mode 100644 index 0000000000..16df4ed576 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuDialogMiddleware.kt @@ -0,0 +1,93 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.middleware + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import mozilla.components.browser.state.ext.getUrl +import mozilla.components.concept.storage.BookmarksStorage +import mozilla.components.lib.state.Middleware +import mozilla.components.lib.state.MiddlewareContext +import mozilla.components.lib.state.Store +import org.mozilla.fenix.components.bookmarks.BookmarksUseCase +import org.mozilla.fenix.components.menu.store.BookmarkState +import org.mozilla.fenix.components.menu.store.MenuAction +import org.mozilla.fenix.components.menu.store.MenuState + +/** + * [Middleware] implementation for handling [MenuAction] and managing the [MenuState] for the menu + * dialog. + * + * @param bookmarksStorage An instance of the [BookmarksStorage] used + * to query matching bookmarks. + * @param addBookmarkUseCase The [BookmarksUseCase.AddBookmarksUseCase] for adding the + * selected tab as a bookmark. + * @param scope [CoroutineScope] used to launch coroutines. + */ +class MenuDialogMiddleware( + private val bookmarksStorage: BookmarksStorage, + private val addBookmarkUseCase: BookmarksUseCase.AddBookmarksUseCase, + private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO), +) : Middleware<MenuState, MenuAction> { + + override fun invoke( + context: MiddlewareContext<MenuState, MenuAction>, + next: (MenuAction) -> Unit, + action: MenuAction, + ) { + when (action) { + is MenuAction.InitAction -> initialize(context.store) + is MenuAction.AddBookmark -> addBookmark(context.store) + else -> Unit + } + + next(action) + } + + private fun initialize( + store: Store<MenuState, MenuAction>, + ) = scope.launch { + val url = store.state.browserMenuState?.selectedTab?.content?.url ?: return@launch + val bookmark = + bookmarksStorage.getBookmarksWithUrl(url).firstOrNull { it.url == url } ?: return@launch + + store.dispatch( + MenuAction.UpdateBookmarkState( + bookmarkState = BookmarkState( + guid = bookmark.guid, + isBookmarked = true, + ), + ), + ) + } + + private fun addBookmark( + store: Store<MenuState, MenuAction>, + ) = scope.launch { + val browserMenuState = store.state.browserMenuState ?: return@launch + + if (browserMenuState.bookmarkState.isBookmarked) { + return@launch + } + + val selectedTab = browserMenuState.selectedTab + val url = selectedTab.getUrl() ?: return@launch + + val guid = addBookmarkUseCase( + url = url, + title = selectedTab.content.title, + ) + + store.dispatch( + MenuAction.UpdateBookmarkState( + BookmarkState( + guid = guid, + isBookmarked = true, + ), + ), + ) + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt index 7c0a03d5ab..21a361bd0b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt @@ -5,18 +5,35 @@ package org.mozilla.fenix.components.menu.middleware import androidx.navigation.NavController +import androidx.navigation.NavHostController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot +import mozilla.components.browser.state.ext.getUrl +import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext +import mozilla.components.service.fxa.manager.AccountState.Authenticated +import mozilla.components.service.fxa.manager.AccountState.Authenticating +import mozilla.components.service.fxa.manager.AccountState.AuthenticationProblem +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated import org.mozilla.fenix.R +import org.mozilla.fenix.browser.BrowserFragmentDirections +import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager +import org.mozilla.fenix.components.menu.BrowserNavigationParams import org.mozilla.fenix.components.menu.MenuDialogFragmentDirections +import org.mozilla.fenix.components.menu.compose.EXTENSIONS_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.SAVE_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.TOOLS_MENU_ROUTE import org.mozilla.fenix.components.menu.store.MenuAction import org.mozilla.fenix.components.menu.store.MenuState import org.mozilla.fenix.components.menu.store.MenuStore +import org.mozilla.fenix.components.menu.toFenixFxAEntryPoint import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.SupportUtils.AMO_HOMEPAGE_FOR_ANDROID import org.mozilla.fenix.settings.SupportUtils.SumoTopic /** @@ -24,25 +41,62 @@ import org.mozilla.fenix.settings.SupportUtils.SumoTopic * dispatched to the [MenuStore]. * * @param navController [NavController] used for navigation. - * @param openSumoTopic Callback to open the provided [SumoTopic] in a new browser tab. + * @param navHostController [NavHostController] used for Compose navigation. + * @param browsingModeManager [BrowsingModeManager] used for setting the browsing mode. + * @param openToBrowser Callback to open the provided [BrowserNavigationParams] + * in a new browser tab. * @param scope [CoroutineScope] used to launch coroutines. */ class MenuNavigationMiddleware( private val navController: NavController, - private val openSumoTopic: (topic: SumoTopic) -> Unit, + private val navHostController: NavHostController, + private val browsingModeManager: BrowsingModeManager, + private val openToBrowser: (params: BrowserNavigationParams) -> Unit, private val scope: CoroutineScope = CoroutineScope(Dispatchers.Main), ) : Middleware<MenuState, MenuAction> { + @Suppress("CyclomaticComplexMethod", "LongMethod") override fun invoke( context: MiddlewareContext<MenuState, MenuAction>, next: (MenuAction) -> Unit, action: MenuAction, ) { + // Get the current state before further processing of the chain of actions. + // This is to ensure that any navigation action will be using correct + // state properties before they are modified due to other actions being + // dispatched and processes. + val currentState = context.state + next(action) scope.launch { when (action) { - is MenuAction.Navigate.Help -> openSumoTopic(SumoTopic.HELP) + is MenuAction.Navigate.MozillaAccount -> { + when (action.accountState) { + Authenticated -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAccountSettingsFragment(), + ) + + AuthenticationProblem -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAccountProblemFragment( + entrypoint = action.accesspoint.toFenixFxAEntryPoint(), + ), + ) + + is Authenticating, NotAuthenticated -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalTurnOnSync( + entrypoint = action.accesspoint.toFenixFxAEntryPoint(), + ), + ) + } + } + + is MenuAction.Navigate.Help -> openToBrowser( + BrowserNavigationParams(sumoTopic = SumoTopic.HELP), + ) is MenuAction.Navigate.Settings -> navController.nav( R.id.menuDialogFragment, @@ -69,8 +123,82 @@ class MenuNavigationMiddleware( MenuDialogFragmentDirections.actionGlobalSavedLoginsAuthFragment(), ) + is MenuAction.Navigate.CustomizeHomepage -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalHomeSettingsFragment(), + ) + + is MenuAction.Navigate.ReleaseNotes -> openToBrowser( + BrowserNavigationParams(url = SupportUtils.WHATS_NEW_URL), + ) + + is MenuAction.Navigate.Tools -> navHostController.navigate(route = TOOLS_MENU_ROUTE) + + is MenuAction.Navigate.Save -> navHostController.navigate(route = SAVE_MENU_ROUTE) + + is MenuAction.Navigate.Extensions -> navHostController.navigate(route = EXTENSIONS_MENU_ROUTE) + + is MenuAction.Navigate.Back -> navHostController.popBackStack() + + is MenuAction.Navigate.EditBookmark -> { + currentState.browserMenuState?.bookmarkState?.guid?.let { guidToEdit -> + navController.nav( + R.id.menuDialogFragment, + BrowserFragmentDirections.actionGlobalBookmarkEditFragment( + guidToEdit = guidToEdit, + requiresSnackbarPaddingForToolbar = true, + ), + ) + } + } + + is MenuAction.Navigate.Translate -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionMenuDialogFragmentToTranslationsDialogFragment(), + ) + + is MenuAction.Navigate.Share -> { + currentState.browserMenuState?.selectedTab?.let { selectedTab -> + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalShareFragment( + sessionId = selectedTab.id, + data = arrayOf( + ShareData( + url = selectedTab.getUrl(), + title = selectedTab.content.title, + ), + ), + showPage = true, + ), + ) + } + } + + is MenuAction.Navigate.ManageExtensions -> navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAddonsManagementFragment(), + ) + + is MenuAction.Navigate.DiscoverMoreExtensions -> openToBrowser( + BrowserNavigationParams(url = AMO_HOMEPAGE_FOR_ANDROID), + ) + + is MenuAction.Navigate.NewTab -> openNewTab(isPrivate = false) + + is MenuAction.Navigate.NewPrivateTab -> openNewTab(isPrivate = true) + else -> Unit } } } + + private fun openNewTab(isPrivate: Boolean) { + browsingModeManager.mode = BrowsingMode.fromBoolean(isPrivate) + + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true), + ) + } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuAction.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuAction.kt index 1400deeae1..021bb63687 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuAction.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuAction.kt @@ -5,6 +5,8 @@ package org.mozilla.fenix.components.menu.store import mozilla.components.lib.state.Action +import mozilla.components.service.fxa.manager.AccountState +import org.mozilla.fenix.components.menu.MenuAccessPoint /** * Actions to dispatch through the [MenuStore] to modify the [MenuState]. @@ -12,11 +14,24 @@ import mozilla.components.lib.state.Action sealed class MenuAction : Action { /** - * Updates whether or not the current selected tab is bookmarked. + * [MenuAction] dispatched to indicate that the store is initialized and + * ready to use. This action is dispatched automatically before any other + * action is processed. Its main purpose is to trigger initialization logic + * in middlewares. + */ + data object InitAction : MenuAction() + + /** + * [MenuAction] dispatched when a bookmark is to be added. + */ + data object AddBookmark : MenuAction() + + /** + * [MenuAction] dispatched when a bookmark state is updated. * - * @property isBookmarked Whether or not the current selected is bookmarked. + * @property bookmarkState The new [BookmarkState] to be updated. */ - data class UpdateBookmarked(val isBookmarked: Boolean) : MenuAction() + data class UpdateBookmarkState(val bookmarkState: BookmarkState) : MenuAction() /** * [MenuAction] dispatched when a navigation event occurs for a specific destination. @@ -24,6 +39,17 @@ sealed class MenuAction : Action { sealed class Navigate : MenuAction() { /** + * [Navigate] action dispatched when navigating to Mozilla account. + * + * @property accountState The [AccountState] of a Mozilla account. + * @property accesspoint The access point that was used to navigate to the menu. + */ + data class MozillaAccount( + val accountState: AccountState, + val accesspoint: MenuAccessPoint, + ) : Navigate() + + /** * [Navigate] action dispatched when navigating to the help SUMO article. */ data object Help : Navigate() @@ -52,5 +78,70 @@ sealed class MenuAction : Action { * [Navigate] action dispatched when navigating to passwords. */ data object Passwords : Navigate() + + /** + * [Navigate] action dispatched when navigating to customize homepage. + */ + data object CustomizeHomepage : Navigate() + + /** + * [Navigate] action dispatched when navigating to release notes. + */ + data object ReleaseNotes : Navigate() + + /** + * [Navigate] action dispatched when navigating to the tools submenu. + */ + data object Tools : Navigate() + + /** + * [Navigate] action dispatched when navigating to the save submenu. + */ + data object Save : Navigate() + + /** + * [Navigate] action dispatched when navigating to the extensions submenu. + */ + data object Extensions : Navigate() + + /** + * [Navigate] action dispatched when a back navigation event occurs. + */ + data object Back : Navigate() + + /** + * [Navigate] action dispatched when navigating to edit the existing bookmark. + */ + data object EditBookmark : Navigate() + + /** + * [Navigate] action dispatched when navigating to translations dialog. + */ + data object Translate : Navigate() + + /** + * [Navigate] action dispatched when navigating to the share sheet. + */ + data object Share : Navigate() + + /** + * [Navigate] action dispatched when navigating to the extensions manager. + */ + data object ManageExtensions : Navigate() + + /** + * [Navigate] action dispatched when navigating to the AMO page. + */ + data object DiscoverMoreExtensions : Navigate() + + /** + * [Navigate] action dispatched when navigating to the new tab. + */ + data object NewTab : Navigate() + + /** + * [Navigate] action dispatched when navigating to the new private tab. + */ + data object NewPrivateTab : Navigate() } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuState.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuState.kt index 0f5b7a61e3..7635eebaae 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuState.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuState.kt @@ -4,13 +4,36 @@ package org.mozilla.fenix.components.menu.store +import mozilla.components.browser.state.state.TabSessionState import mozilla.components.lib.state.State /** * Value type that represents the state of the menu. * - * @property isBookmarked Whether or not the current selected tab is bookmarked. + * @property browserMenuState The [BrowserMenuState] of the current browser session if any. */ data class MenuState( - val isBookmarked: Boolean = false, + val browserMenuState: BrowserMenuState? = null, ) : State + +/** + * Value type that represents the state of the browser menu. + * + * @property selectedTab The current selected [TabSessionState]. + * @property bookmarkState The [BookmarkState] of the selected tab. + */ +data class BrowserMenuState( + val selectedTab: TabSessionState, + val bookmarkState: BookmarkState = BookmarkState(), +) + +/** + * Value type that represents the bookmark state of a tab. + * + * @property guid The id of the bookmark. + * @property isBookmarked Whether or not the selected tab is bookmarked. + */ +data class BookmarkState( + val guid: String? = null, + val isBookmarked: Boolean = false, +) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuStore.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuStore.kt index 14cca54e61..bc2c5b9037 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuStore.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/store/MenuStore.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.components.menu.store +import androidx.annotation.VisibleForTesting import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.Store @@ -13,16 +14,32 @@ import mozilla.components.lib.state.Store class MenuStore( initialState: MenuState, middleware: List<Middleware<MenuState, MenuAction>> = listOf(), -) : - Store<MenuState, MenuAction>( - initialState = initialState, - reducer = ::reducer, - middleware = middleware, - ) +) : Store<MenuState, MenuAction>( + initialState = initialState, + reducer = ::reducer, + middleware = middleware, +) { + init { + dispatch(MenuAction.InitAction) + } +} private fun reducer(state: MenuState, action: MenuAction): MenuState { return when (action) { - is MenuAction.UpdateBookmarked -> state.copy(isBookmarked = action.isBookmarked) - is MenuAction.Navigate -> state + is MenuAction.InitAction, + is MenuAction.AddBookmark, + is MenuAction.Navigate, + -> state + + is MenuAction.UpdateBookmarkState -> state.copyWithBrowserMenuState { + it.copy(bookmarkState = action.bookmarkState) + } } } + +@VisibleForTesting +internal inline fun MenuState.copyWithBrowserMenuState( + crossinline update: (BrowserMenuState) -> BrowserMenuState, +): MenuState { + return this.copy(browserMenuState = this.browserMenuState?.let { update(it) }) +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt index 63cec2f8d7..78e3a7c44c 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarController.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.components.toolbar import androidx.navigation.NavController import mozilla.components.browser.state.action.ContentAction +import mozilla.components.browser.state.ext.getUrl import mozilla.components.browser.state.selector.findCustomTabOrSelectedTab import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.selector.getNormalOrPrivateTabs @@ -233,18 +234,20 @@ class DefaultBrowserToolbarController( override fun handleTranslationsButtonClick() { Translations.action.record(Translations.ActionExtra("main_flow_toolbar")) val directions = - BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( - sessionId = currentSession?.id, - ) + BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment() navController.navigateSafe(R.id.browserFragment, directions) } override fun onShareActionClicked() { + val sessionId = currentSession?.id + val url = sessionId?.let { + store.state.findTab(it)?.getUrl() + } val directions = NavGraphDirections.actionGlobalShareFragment( - sessionId = currentSession?.id, + sessionId = sessionId, data = arrayOf( ShareData( - url = getProperUrl(currentSession), + url = url, title = currentSession?.content?.title, ), ), @@ -253,17 +256,6 @@ class DefaultBrowserToolbarController( navController.navigate(directions) } - private fun getProperUrl(currentSession: SessionState?): String? { - return currentSession?.id?.let { - val currentTab = store.state.findTab(it) - if (currentTab?.readerState?.active == true) { - currentTab.readerState.activeUrl - } else { - currentSession.content.url - } - } - } - companion object { internal const val TELEMETRY_BROWSER_IDENTIFIER = "browserMenu" } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt index 56d65453fe..a214718ba1 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMenuController.kt @@ -8,6 +8,7 @@ import android.content.Intent import android.view.ViewGroup import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment import androidx.navigation.NavController import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.CoroutineScope @@ -16,10 +17,10 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.action.EngineAction +import mozilla.components.browser.state.ext.getUrl import mozilla.components.browser.state.selector.findCustomTabOrSelectedTab import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.selector.selectedTab -import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineSession.LoadUrlFlags import mozilla.components.concept.engine.prompt.ShareData @@ -51,6 +52,7 @@ import org.mozilla.fenix.ext.getRootView import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.navigateSafe import org.mozilla.fenix.ext.openSetDefaultBrowserOption +import org.mozilla.fenix.settings.biometric.bindBiometricsCredentialsPromptOrShowWarning import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit import org.mozilla.fenix.utils.Settings @@ -63,6 +65,7 @@ interface BrowserToolbarMenuController { @Suppress("LargeClass", "ForbiddenComment", "LongParameterList") class DefaultBrowserToolbarMenuController( + private val fragment: Fragment, private val store: BrowserStore, private val activity: HomeActivity, private val navController: NavController, @@ -79,7 +82,8 @@ class DefaultBrowserToolbarMenuController( private val tabCollectionStorage: TabCollectionStorage, private val topSitesStorage: DefaultTopSitesStorage, private val pinnedSiteStorage: PinnedSiteStorage, - private val browserStore: BrowserStore, + private val onShowPinVerification: (Intent) -> Unit, + private val onBiometricAuthenticationSuccessful: () -> Unit, ) : BrowserToolbarMenuController { private val currentSession @@ -214,11 +218,15 @@ class DefaultBrowserToolbarMenuController( } } is ToolbarMenu.Item.Share -> { + val sessionId = currentSession?.id + val url = sessionId?.let { + store.state.findTab(it)?.getUrl() + } val directions = NavGraphDirections.actionGlobalShareFragment( - sessionId = currentSession?.id, + sessionId = sessionId, data = arrayOf( ShareData( - url = getProperUrl(currentSession), + url = url, title = currentSession?.content?.title, ), ), @@ -257,9 +265,9 @@ class DefaultBrowserToolbarMenuController( } } is ToolbarMenu.Item.OpenInRegularTab -> { - currentSession?.let { session -> - getProperUrl(session)?.let { url -> - tabsUseCases.migratePrivateTabUseCase.invoke(session.id, url) + currentSession?.id?.let { sessionId -> + store.state.findTab(sessionId)?.getUrl()?.let { url -> + tabsUseCases.migratePrivateTabUseCase.invoke(sessionId, url) } } } @@ -350,7 +358,7 @@ class DefaultBrowserToolbarMenuController( } is ToolbarMenu.Item.Bookmark -> { store.state.selectedTab?.let { - getProperUrl(it)?.let { url -> bookmarkTapped(url, it.content.title) } + it.getUrl()?.let { url -> bookmarkTapped(url, it.content.title) } } } is ToolbarMenu.Item.Bookmarks -> browserAnimator.captureEngineViewAndDrawStatically { @@ -365,7 +373,15 @@ class DefaultBrowserToolbarMenuController( BrowserFragmentDirections.actionGlobalHistoryFragment(), ) } - + is ToolbarMenu.Item.Passwords -> browserAnimator.captureEngineViewAndDrawStatically { + fragment.view?.let { view -> + bindBiometricsCredentialsPromptOrShowWarning( + view = view, + onShowPinVerification = onShowPinVerification, + onAuthSuccess = onBiometricAuthenticationSuccessful, + ) + } + } is ToolbarMenu.Item.Downloads -> browserAnimator.captureEngineViewAndDrawStatically { navController.nav( R.id.browserFragment, @@ -411,25 +427,12 @@ class DefaultBrowserToolbarMenuController( ToolbarMenu.Item.Translate -> { Translations.action.record(Translations.ActionExtra("main_flow_browser")) val directions = - BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( - sessionId = currentSession?.id, - ) + BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment() navController.navigateSafe(R.id.browserFragment, directions) } } } - private fun getProperUrl(currentSession: SessionState?): String? { - return currentSession?.id?.let { - val currentTab = browserStore.state.findTab(it) - if (currentTab?.readerState?.active == true) { - currentTab.readerState.activeUrl - } else { - currentSession.content.url - } - } - } - @Suppress("ComplexMethod", "LongMethod") private fun trackToolbarItemInteraction(item: ToolbarMenu.Item) { when (item) { @@ -494,6 +497,8 @@ class DefaultBrowserToolbarMenuController( Events.browserMenuAction.record(Events.BrowserMenuActionExtra("bookmarks")) is ToolbarMenu.Item.History -> Events.browserMenuAction.record(Events.BrowserMenuActionExtra("history")) + is ToolbarMenu.Item.Passwords -> + Events.browserMenuAction.record(Events.BrowserMenuActionExtra("passwords")) is ToolbarMenu.Item.Downloads -> Events.browserMenuAction.record(Events.BrowserMenuActionExtra("downloads")) is ToolbarMenu.Item.NewTab -> diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt index 2c93538953..199bfb3bcc 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarView.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.components.toolbar import android.content.Context import android.graphics.Color +import android.net.Uri import android.view.HapticFeedbackConstants import android.view.LayoutInflater import android.view.View @@ -29,6 +30,7 @@ import mozilla.components.concept.toolbar.ScrollableToolbar import mozilla.components.support.ktx.util.URLStringUtils import mozilla.components.ui.widgets.behavior.EngineViewScrollingBehavior import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor import org.mozilla.fenix.customtabs.CustomTabToolbarIntegration import org.mozilla.fenix.customtabs.CustomTabToolbarMenu @@ -43,7 +45,7 @@ import mozilla.components.ui.widgets.behavior.ViewPosition as MozacToolbarPositi @SuppressWarnings("LargeClass", "LongParameterList") class BrowserToolbarView( - context: Context, + private val context: Context, container: ViewGroup, private val settings: Settings, private val interactor: BrowserToolbarInteractor, @@ -70,6 +72,8 @@ class BrowserToolbarView( private val tabStripView: ComposeView by lazy { layout.findViewById(R.id.tabStripView) } + private val isNavBarEnabled = IncompleteRedesignToolbarFeature(context.settings()).isEnabled + val toolbarIntegration: ToolbarIntegration val menuToolbar: ToolbarMenu @@ -101,9 +105,11 @@ class BrowserToolbarView( true } + view.isNavBarEnabled = isNavBarEnabled + with(context) { val isPinningSupported = components.useCases.webAppUseCases.isPinningSupported() - val searchUrlBackground = if (IncompleteRedesignToolbarFeature(context.settings()).isEnabled) { + val searchUrlBackground = if (isNavBarEnabled) { R.drawable.search_url_background } else { R.drawable.search_old_url_background @@ -150,7 +156,13 @@ class BrowserToolbarView( ThemeManager.resolveAttribute(R.attr.borderToolbarDivider, context), ) - display.urlFormatter = { url -> URLStringUtils.toDisplayUrl(url) } + display.urlFormatter = { url -> + if (isNavBarEnabled) { + Uri.parse(url.toString()).host ?: url + } else { + URLStringUtils.toDisplayUrl(url) + } + } display.colors = display.colors.copy( text = primaryTextColor, @@ -211,8 +223,6 @@ class BrowserToolbarView( isPrivate = customTabSession.content.private, ) } else { - val isNavBarEnabled = IncompleteRedesignToolbarFeature(context.settings()).isEnabled - DefaultToolbarIntegration( this, view, @@ -322,5 +332,5 @@ class BrowserToolbarView( } private fun shouldShowTabStrip() = - customTabSession == null && settings.isTabletAndTabStripEnabled + customTabSession == null && context.isTabStripEnabled() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 6e28294734..0af1430417 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -232,6 +232,14 @@ open class DefaultToolbarMenu( onItemTapped.invoke(ToolbarMenu.Item.Downloads) } + private val passwordsItem = BrowserMenuImageText( + context.getString(R.string.preferences_sync_logins_2), + R.drawable.mozac_ic_login_24, + primaryTextColor(), + ) { + onItemTapped.invoke(ToolbarMenu.Item.Passwords) + } + private val extensionsItem = WebExtensionPlaceholderMenuItem( id = WebExtensionPlaceholderMenuItem.MAIN_EXTENSIONS_MENU_ID, ) @@ -409,6 +417,7 @@ open class DefaultToolbarMenu( bookmarksItem, historyItem, downloadsItem, + passwordsItem, extensionsItem, syncMenuItem(), BrowserMenuDivider(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt index 179d30db5c..ebffb04909 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarMenu.kt @@ -48,6 +48,11 @@ interface ToolbarMenu { object CustomizeReaderView : Item() object Bookmarks : Item() object History : Item() + + /** + * The Passwords menu item + */ + object Passwords : Item() object Downloads : Item() object NewTab : Item() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/DismissibleItemBackground.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/DismissibleItemBackground.kt index a4ad6da918..98448f626b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/DismissibleItemBackground.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/DismissibleItemBackground.kt @@ -59,7 +59,7 @@ fun DismissibleItemBackground( Alignment.CenterStart }, ), - tint = FirefoxTheme.colors.iconWarning, + tint = FirefoxTheme.colors.iconCritical, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt index 2cc4421ac7..ad65c37d17 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/Button.kt @@ -232,7 +232,7 @@ fun DestructiveButton( text: String, modifier: Modifier = Modifier.fillMaxWidth(), enabled: Boolean = true, - textColor: Color = FirefoxTheme.colors.textWarningButton, + textColor: Color = FirefoxTheme.colors.textCriticalButton, backgroundColor: Color = FirefoxTheme.colors.actionSecondary, icon: Painter? = null, iconModifier: Modifier = Modifier, @@ -246,7 +246,7 @@ fun DestructiveButton( enabled = enabled, icon = icon, iconModifier = iconModifier, - tint = FirefoxTheme.colors.iconWarningButton, + tint = FirefoxTheme.colors.iconCriticalButton, onClick = onClick, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/TextButton.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/TextButton.kt index 018b6722ba..0d09bc6a22 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/TextButton.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/button/TextButton.kt @@ -5,7 +5,7 @@ package org.mozilla.fenix.compose.button import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -20,6 +20,8 @@ import java.util.Locale * @param text The button text to be displayed. * @param onClick Invoked when the user clicks on the button. * @param modifier [Modifier] Used to shape and position the underlying [androidx.compose.material.TextButton]. + * @param enabled Controls the enabled state of the button. When `false`, this button will not + * be clickable. * @param textColor [Color] to apply to the button text. * @param upperCaseText If the button text should be in uppercase letters. */ @@ -28,12 +30,14 @@ fun TextButton( text: String, onClick: () -> Unit, modifier: Modifier = Modifier, + enabled: Boolean = true, textColor: Color = FirefoxTheme.colors.textAccent, upperCaseText: Boolean = true, ) { androidx.compose.material.TextButton( onClick = onClick, modifier = modifier, + enabled = enabled, ) { Text( text = if (upperCaseText) { @@ -41,7 +45,7 @@ fun TextButton( } else { text }, - color = textColor, + color = if (enabled) textColor else FirefoxTheme.colors.textDisabled, style = FirefoxTheme.typography.button, maxLines = 1, ) @@ -52,11 +56,17 @@ fun TextButton( @LightDarkPreview private fun TextButtonPreview() { FirefoxTheme { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + Column(Modifier.background(FirefoxTheme.colors.layer1)) { TextButton( text = "label", onClick = {}, ) + + TextButton( + text = "disabled", + onClick = {}, + enabled = false, + ) } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt index 0a8e88b1ea..48c6e903b2 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/list/ListItem.kt @@ -23,6 +23,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import androidx.compose.ui.semantics.Role @@ -36,6 +37,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.compose.Favicon import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.button.RadioButton +import org.mozilla.fenix.compose.button.TextButton import org.mozilla.fenix.theme.FirefoxTheme private val LIST_ITEM_HEIGHT = 56.dp @@ -43,8 +45,8 @@ private val LIST_ITEM_HEIGHT = 56.dp private val ICON_SIZE = 24.dp /** - * List item used to display a label with an optional description text and - * an optional [IconButton] at the end. + * List item used to display a label with an optional description text and an optional + * [IconButton] or [Icon] at the end. * * @param label The label in the list item. * @param modifier [Modifier] to be applied to the layout. @@ -52,9 +54,11 @@ private val ICON_SIZE = 24.dp * @param description An optional description text below the label. * @param maxDescriptionLines An optional maximum number of lines for the description text to span. * @param onClick Called when the user clicks on the item. - * @param iconPainter [Painter] used to display an [IconButton] after the list item. + * @param iconPainter [Painter] used to display an icon after the list item. * @param iconDescription Content description of the icon. - * @param onIconClick Called when the user clicks on the icon. + * @param iconTint Tint applied to [iconPainter]. + * @param onIconClick Called when the user clicks on the icon. An [IconButton] will be + * displayed if this is provided. Otherwise, an [Icon] will be displayed. */ @Composable fun TextListItem( @@ -66,6 +70,7 @@ fun TextListItem( onClick: (() -> Unit)? = null, iconPainter: Painter? = null, iconDescription: String? = null, + iconTint: Color = FirefoxTheme.colors.iconPrimary, onIconClick: (() -> Unit)? = null, ) { ListItem( @@ -87,9 +92,16 @@ fun TextListItem( Icon( painter = iconPainter, contentDescription = iconDescription, - tint = FirefoxTheme.colors.iconPrimary, + tint = iconTint, ) } + } else if (iconPainter != null) { + Icon( + painter = iconPainter, + contentDescription = iconDescription, + modifier = Modifier.padding(end = 16.dp), + tint = iconTint, + ) } } } @@ -160,54 +172,135 @@ fun FaviconListItem( /** * List item used to display a label and an icon at the beginning with an optional description - * text and an optional [IconButton] at the end. + * text and an optional [IconButton] or [Icon] at the end. * * @param label The label in the list item. + * @param labelTextColor [Color] to be applied to the label. * @param description An optional description text below the label. + * @param enabled Controls the enabled state of the list item. When `false`, the list item will not + * be clickable. * @param onClick Called when the user clicks on the item. * @param beforeIconPainter [Painter] used to display an [Icon] before the list item. * @param beforeIconDescription Content description of the icon. - * @param afterIconPainter [Painter] used to display an [IconButton] after the list item. + * @param beforeIconTint Tint applied to [beforeIconPainter]. + * @param afterIconPainter [Painter] used to display an icon after the list item. * @param afterIconDescription Content description of the icon. - * @param onAfterIconClick Called when the user clicks on the icon. + * @param afterIconTint Tint applied to [afterIconPainter]. + * @param onAfterIconClick Called when the user clicks on the icon. An [IconButton] will be + * displayed if this is provided. Otherwise, an [Icon] will be displayed. */ @Composable fun IconListItem( label: String, + labelTextColor: Color = FirefoxTheme.colors.textPrimary, description: String? = null, + enabled: Boolean = true, onClick: (() -> Unit)? = null, beforeIconPainter: Painter, beforeIconDescription: String? = null, + beforeIconTint: Color = FirefoxTheme.colors.iconPrimary, afterIconPainter: Painter? = null, afterIconDescription: String? = null, + afterIconTint: Color = FirefoxTheme.colors.iconPrimary, onAfterIconClick: (() -> Unit)? = null, ) { ListItem( label = label, + labelTextColor = labelTextColor, description = description, + enabled = enabled, onClick = onClick, beforeListAction = { Icon( painter = beforeIconPainter, contentDescription = beforeIconDescription, modifier = Modifier.padding(horizontal = 16.dp), - tint = FirefoxTheme.colors.iconPrimary, + tint = if (enabled) beforeIconTint else FirefoxTheme.colors.iconDisabled, ) }, afterListAction = { + val tint = if (enabled) afterIconTint else FirefoxTheme.colors.iconDisabled + if (afterIconPainter != null && onAfterIconClick != null) { IconButton( onClick = onAfterIconClick, modifier = Modifier .padding(end = 16.dp) .size(ICON_SIZE), + enabled = enabled, ) { Icon( painter = afterIconPainter, contentDescription = afterIconDescription, - tint = FirefoxTheme.colors.iconPrimary, + tint = tint, ) } + } else if (afterIconPainter != null) { + Icon( + painter = afterIconPainter, + contentDescription = afterIconDescription, + modifier = Modifier.padding(end = 16.dp), + tint = tint, + ) + } + }, + ) +} + +/** + * List item used to display a label and an icon at the beginning with an optional description + * text and an optional [TextButton] at the end. + * + * @param label The label in the list item. + * @param labelTextColor [Color] to be applied to the label. + * @param description An optional description text below the label. + * @param enabled Controls the enabled state of the list item. When `false`, the list item will not + * be clickable. + * @param onClick Called when the user clicks on the item. + * @param beforeIconPainter [Painter] used to display an [Icon] before the list item. + * @param beforeIconDescription Content description of the icon. + * @param beforeIconTint Tint applied to [beforeIconPainter]. + * @param afterButtonText The button text to be displayed after the list item. + * @param afterButtonTextColor [Color] to apply to [afterButtonText]. + * @param onAfterButtonClick Called when the user clicks on the text button. + */ +@Composable +fun IconListItem( + label: String, + labelTextColor: Color = FirefoxTheme.colors.textPrimary, + description: String? = null, + enabled: Boolean = true, + onClick: (() -> Unit)? = null, + beforeIconPainter: Painter, + beforeIconDescription: String? = null, + beforeIconTint: Color = FirefoxTheme.colors.iconPrimary, + afterButtonText: String? = null, + afterButtonTextColor: Color = FirefoxTheme.colors.actionPrimary, + onAfterButtonClick: (() -> Unit)? = null, +) { + ListItem( + label = label, + labelTextColor = labelTextColor, + description = description, + enabled = enabled, + onClick = onClick, + beforeListAction = { + Icon( + painter = beforeIconPainter, + contentDescription = beforeIconDescription, + modifier = Modifier.padding(horizontal = 16.dp), + tint = if (enabled) beforeIconTint else FirefoxTheme.colors.iconDisabled, + ) + }, + afterListAction = { + if (afterButtonText != null && onAfterButtonClick != null) { + TextButton( + text = afterButtonText, + onClick = onAfterButtonClick, + enabled = enabled, + textColor = afterButtonTextColor, + upperCaseText = false, + ) } }, ) @@ -270,9 +363,12 @@ fun RadioButtonListItem( * * @param label The label in the list item. * @param modifier [Modifier] to be applied to the layout. + * @param labelTextColor [Color] to be applied to the label. * @param maxLabelLines An optional maximum number of lines for the label text to span. * @param description An optional description text below the label. * @param maxDescriptionLines An optional maximum number of lines for the description text to span. + * @param enabled Controls the enabled state of the list item. When `false`, the list item will not + * be clickable. * @param onClick Called when the user clicks on the item. * @param beforeListAction Optional Composable for adding UI before the list item. * @param afterListAction Optional Composable for adding UI to the end of the list item. @@ -281,16 +377,18 @@ fun RadioButtonListItem( private fun ListItem( label: String, modifier: Modifier = Modifier, + labelTextColor: Color = FirefoxTheme.colors.textPrimary, maxLabelLines: Int = 1, description: String? = null, maxDescriptionLines: Int = 1, + enabled: Boolean = true, onClick: (() -> Unit)? = null, beforeListAction: @Composable RowScope.() -> Unit = {}, afterListAction: @Composable RowScope.() -> Unit = {}, ) { Row( modifier = when (onClick != null) { - true -> Modifier.clickable { onClick() } + true -> Modifier.clickable(enabled = enabled) { onClick() } false -> Modifier }.then( Modifier.defaultMinSize(minHeight = LIST_ITEM_HEIGHT), @@ -306,7 +404,7 @@ private fun ListItem( ) { Text( text = label, - color = FirefoxTheme.colors.textPrimary, + color = if (enabled) labelTextColor else FirefoxTheme.colors.textDisabled, style = FirefoxTheme.typography.subtitle1, maxLines = maxLabelLines, ) @@ -314,7 +412,7 @@ private fun ListItem( description?.let { Text( text = description, - color = FirefoxTheme.colors.textSecondary, + color = if (enabled) FirefoxTheme.colors.textSecondary else FirefoxTheme.colors.textDisabled, style = FirefoxTheme.typography.body2, maxLines = maxDescriptionLines, ) @@ -352,13 +450,21 @@ private fun TextListItemWithDescriptionPreview() { @Preview(name = "TextListItem with a right icon", uiMode = Configuration.UI_MODE_NIGHT_YES) private fun TextListItemWithIconPreview() { FirefoxTheme { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + Column(Modifier.background(FirefoxTheme.colors.layer1)) { TextListItem( - label = "Label + right icon", - iconPainter = painterResource(R.drawable.ic_menu), + label = "Label + right icon button", + onClick = {}, + iconPainter = painterResource(R.drawable.mozac_ic_folder_24), iconDescription = "click me", onIconClick = { println("icon click") }, ) + + TextListItem( + label = "Label + right icon", + onClick = {}, + iconPainter = painterResource(R.drawable.mozac_ic_folder_24), + iconDescription = "click me", + ) } } } @@ -367,11 +473,40 @@ private fun TextListItemWithIconPreview() { @Preview(name = "IconListItem", uiMode = Configuration.UI_MODE_NIGHT_YES) private fun IconListItemPreview() { FirefoxTheme { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + Column(Modifier.background(FirefoxTheme.colors.layer1)) { + IconListItem( + label = "Left icon list item", + onClick = {}, + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), + beforeIconDescription = "click me", + ) + IconListItem( label = "Left icon list item", - beforeIconPainter = painterResource(R.drawable.ic_folder_icon), + labelTextColor = FirefoxTheme.colors.textAccent, + onClick = {}, + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), + beforeIconDescription = "click me", + beforeIconTint = FirefoxTheme.colors.iconAccentViolet, + ) + + IconListItem( + label = "Left icon list item + right icon", + onClick = {}, + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), beforeIconDescription = "click me", + afterIconPainter = painterResource(R.drawable.mozac_ic_chevron_right_24), + afterIconDescription = null, + ) + + IconListItem( + label = "Left icon list item + right icon (disabled)", + enabled = false, + onClick = {}, + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), + beforeIconDescription = "click me", + afterIconPainter = painterResource(R.drawable.mozac_ic_chevron_right_24), + afterIconDescription = null, ) } } @@ -379,20 +514,29 @@ private fun IconListItemPreview() { @Composable @Preview( - name = "IconListItem with an interactable right icon", + name = "IconListItem with after list action", uiMode = Configuration.UI_MODE_NIGHT_YES, ) -private fun IconListItemWithRightIconPreview() { +private fun IconListItemWithAfterListActionPreview() { FirefoxTheme { - Box(Modifier.background(FirefoxTheme.colors.layer1)) { + Column(Modifier.background(FirefoxTheme.colors.layer1)) { IconListItem( - label = "Left icon list item + right icon", - beforeIconPainter = painterResource(R.drawable.ic_folder_icon), + label = "IconListItem + right icon + clicks", + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), beforeIconDescription = null, - afterIconPainter = painterResource(R.drawable.ic_menu), + afterIconPainter = painterResource(R.drawable.mozac_ic_ellipsis_vertical_24), afterIconDescription = "click me", onAfterIconClick = { println("icon click") }, ) + + IconListItem( + label = "IconListItem + text button", + onClick = { println("list item click") }, + beforeIconPainter = painterResource(R.drawable.mozac_ic_folder_24), + beforeIconDescription = "click me", + afterButtonText = "Edit", + onAfterButtonClick = { println("text button click") }, + ) } } } @@ -410,14 +554,14 @@ private fun FaviconListItemPreview() { description = "Description text", onClick = { println("list item click") }, url = "", - iconPainter = painterResource(R.drawable.ic_menu), + iconPainter = painterResource(R.drawable.mozac_ic_ellipsis_vertical_24), onIconClick = { println("icon click") }, ) FaviconListItem( label = "Favicon + painter", description = "Description text", - faviconPainter = painterResource(id = R.drawable.ic_tab_collection), + faviconPainter = painterResource(id = R.drawable.mozac_ic_collection_24), onClick = { println("list item click") }, url = "", ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt index 802457d4f8..3b40e3278a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/compose/tabstray/DismissedTabBackground.kt @@ -60,7 +60,7 @@ fun DismissedTabBackground( .alpha( if (dismissDirection == DismissDirection.StartToEnd || dismissDirection == null) 1f else 0f, ), - tint = FirefoxTheme.colors.iconWarning, + tint = FirefoxTheme.colors.iconCritical, ) Icon( @@ -72,7 +72,7 @@ fun DismissedTabBackground( .alpha( if (dismissDirection == DismissDirection.EndToStart || dismissDirection == null) 1f else 0f, ), - tint = FirefoxTheme.colors.iconWarning, + tint = FirefoxTheme.colors.iconCritical, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt index 0f1fff66bd..6c3abb3b0c 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/customtabs/ExternalAppBrowserFragment.kt @@ -34,6 +34,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.browser.BaseBrowserFragment import org.mozilla.fenix.browser.CustomTabContextMenuCandidate import org.mozilla.fenix.browser.FenixSnackbarDelegate +import org.mozilla.fenix.components.menu.MenuAccessPoint import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature import org.mozilla.fenix.components.toolbar.ToolbarMenu import org.mozilla.fenix.components.toolbar.ToolbarPosition @@ -130,8 +131,9 @@ class ExternalAppBrowserFragment : BaseBrowserFragment() { onMenuButtonClick = { nav( R.id.externalAppBrowserFragment, - ExternalAppBrowserFragmentDirections - .actionGlobalMenuDialogFragment(), + ExternalAppBrowserFragmentDirections.actionGlobalMenuDialogFragment( + accesspoint = MenuAccessPoint.External, + ), ) }, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt index 5fa97b7c03..54ca60feaf 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/tabs/TabTools.kt @@ -14,8 +14,10 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Text import androidx.compose.material.TextField import androidx.compose.material.TextFieldDefaults @@ -116,7 +118,8 @@ private fun TabToolsContent( Column( modifier = Modifier .fillMaxSize() - .padding(all = 16.dp), + .padding(all = 16.dp) + .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(16.dp), ) { TabCounter( @@ -152,7 +155,7 @@ private fun TabCounter( Spacer(modifier = Modifier.height(16.dp)) TabCountRow( - tabType = stringResource(R.string.debug_drawer_tab_tools_tab_count_normal), + tabType = stringResource(R.string.debug_drawer_tab_tools_tab_count_active), count = activeTabCount, ) @@ -254,10 +257,10 @@ private fun TabCreationTool( textColor = FirefoxTheme.colors.textPrimary, backgroundColor = Color.Transparent, cursorColor = FirefoxTheme.colors.borderFormDefault, - errorCursorColor = FirefoxTheme.colors.borderWarning, + errorCursorColor = FirefoxTheme.colors.borderCritical, focusedIndicatorColor = FirefoxTheme.colors.borderPrimary, unfocusedIndicatorColor = FirefoxTheme.colors.borderPrimary, - errorIndicatorColor = FirefoxTheme.colors.borderWarning, + errorIndicatorColor = FirefoxTheme.colors.borderCritical, ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt index fa1959cd79..92e41355c0 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/ui/DebugOverlay.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController @@ -88,6 +89,7 @@ fun DebugOverlay( onClick = { onDrawerOpen() }, + contentDescription = stringResource(R.string.debug_drawer_fab_content_description), ) // ModalDrawer utilizes a Surface, which blocks ALL clicks behind it, preventing the app diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt index 6ed2c57fb5..96d07d5276 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/StartDownloadDialog.kt @@ -17,7 +17,6 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.VisibleForTesting import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.view.ViewCompat import androidx.core.view.children import androidx.viewbinding.ViewBinding import mozilla.components.concept.base.crash.Breadcrumb @@ -124,10 +123,7 @@ abstract class StartDownloadDialog( parent?.children ?.filterNot { it.id == R.id.startDownloadDialogContainer } ?.forEach { - ViewCompat.setImportantForAccessibility( - it, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES, - ) + it.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES) } } @@ -136,10 +132,7 @@ abstract class StartDownloadDialog( parent?.children ?.filterNot { it.id == R.id.startDownloadDialogContainer } ?.forEach { - ViewCompat.setImportantForAccessibility( - it, - ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, - ) + it.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt index bb927596a4..d0423728d4 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Activity.kt @@ -146,6 +146,27 @@ fun Activity.openSetDefaultBrowserOption( } } +/** + * Checks if the app can prompt the user to set it as the default browser. + * + * From Android 10, a new method to prompt the user to set default apps has been introduced. + * This method checks if the app can prompt the user to set it as the default browser + * based on the Android version and the availability of the ROLE_BROWSER. + */ +fun Activity.isDefaultBrowserPromptSupported(): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + getSystemService(RoleManager::class.java).also { + if (it.isRoleAvailable(RoleManager.ROLE_BROWSER) && !it.isRoleHeld( + RoleManager.ROLE_BROWSER, + ) + ) { + return true + } + } + } + return false +} + @RequiresApi(Build.VERSION_CODES.N) private fun Activity.navigateToDefaultBrowserAppsSettings( from: BrowserDirection, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt index d0491be7f0..db191ed0d1 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt @@ -170,7 +170,7 @@ internal fun getFilteredSponsoredStories( fun AppState.filterState(blocklistHandler: BlocklistHandler): AppState = with(blocklistHandler) { copy( - recentBookmarks = recentBookmarks.filteredByBlocklist(), + bookmarks = bookmarks.filteredByBlocklist(), recentTabs = recentTabs.filteredByBlocklist().filterContile(), recentHistory = recentHistory.filteredByBlocklist().filterContile(), recentSyncedTabState = recentSyncedTabState.filteredByBlocklist().filterContile(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Bitmap.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Bitmap.kt index 02f63839f6..5e02e68873 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Bitmap.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Bitmap.kt @@ -8,6 +8,7 @@ import android.graphics.Bitmap import android.graphics.Matrix import android.view.View import android.widget.ImageView +import androidx.annotation.VisibleForTesting /** * This will scale the received [Bitmap] to the size of the [view]. It retains the bitmap's @@ -33,8 +34,8 @@ fun Bitmap.scaleToBottomOfView(view: ImageView) { oldRight: Int, oldBottom: Int, ) { - val viewWidth: Float = view.width.toFloat() - val viewHeight: Float = view.height.toFloat() + val viewWidth = view.width.toFloat() + val viewHeight = view.safeHeight().toFloat() val bitmapWidth = bitmap.width val bitmapHeight = bitmap.height val widthScale = viewWidth / bitmapWidth @@ -52,3 +53,16 @@ fun Bitmap.scaleToBottomOfView(view: ImageView) { }, ) } + +/** + * If the keyboard is open we must factor in the height for the correct view height. + */ +@VisibleForTesting +internal fun View.safeHeight(): Int { + val keyboardHeight = getKeyboardHeight() + return if (keyboardHeight > 0) { + keyboardHeight.plus(height) + } else { + height + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt index 11f37595d8..a4432ba37a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Context.kt @@ -145,3 +145,9 @@ fun Context.tabClosedUndoMessage(private: Boolean): String = } else { getString(R.string.snackbar_tab_closed) } + +/** + * Returns true if the device is a tablet + */ +fun Context.isTablet(): Boolean = + resources.getBoolean(R.bool.tablet) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt index 0bbc0ee729..db7f36cc40 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/Fragment.kt @@ -6,6 +6,8 @@ package org.mozilla.fenix.ext import android.app.Activity import android.content.Intent +import android.view.View +import android.view.ViewGroup import android.view.WindowManager import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher @@ -18,9 +20,12 @@ import androidx.navigation.NavDirections import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import mozilla.components.concept.base.crash.Breadcrumb +import mozilla.components.support.utils.ext.isLandscape import org.mozilla.fenix.NavHostActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.Components +import org.mozilla.fenix.components.toolbar.ToolbarPosition +import org.mozilla.fenix.components.toolbar.navbar.ToolbarContainerView /** * Get the requireComponents of this application. @@ -149,3 +154,53 @@ fun Fragment.registerForActivityResult( } } } + +/** + * Checks whether the current fragment is running on a tablet. + */ +fun Fragment.isTablet(): Boolean { + return resources.getBoolean(R.bool.tablet) +} + +/** + * + * Manages the state of the NavBar upon an orientation change. + * + * @param parent The top level [ViewGroup] of the fragment, which will be hosting toolbar/navbar container. + * @param toolbarView [View] responsible for showing the AddressBar. + * @param bottomToolbarContainerView The [ToolbarContainerView] hosting the NavBar. + * @param reinitializeNavBar lambda for re-initializing the NavBar inside the host [Fragment]. + */ +fun Fragment.updateNavBarForConfigurationChange( + parent: ViewGroup, + toolbarView: View, + bottomToolbarContainerView: ToolbarContainerView?, + reinitializeNavBar: () -> Unit, +) { + if (requireContext().isLandscape()) { + // In landscape mode we want to remove the navigation bar. + parent.removeView(bottomToolbarContainerView) + + // If address bar was positioned at bottom and we have removed the toolbar container, we are adding address bar + // back. + val isToolbarAtBottom = requireComponents.settings.toolbarPosition == ToolbarPosition.BOTTOM + + // Toolbar already having a parent is an edge case, but it could happen if configurationChange is called after + // onCreateView with the same orientation. Caught it on a foldable emulator while going from single screen + // portrait mode to landscape table, back and forth. + val hasParent = toolbarView.parent != null + if (isToolbarAtBottom && !hasParent) { + parent.addView(toolbarView) + } + } else { + // Already having a bottomContainer after switching back to portrait mode will happen when address bar is + // positioned at bottom and also as an edge case if configurationChange is called after onCreateView with the + // same orientation. Caught it on a foldable emulator while going from single screen portrait mode to landscape + // table, back and forth. + bottomToolbarContainerView?.let { + parent.removeView(it) + } + + reinitializeNavBar() + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/View.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/View.kt index 3c5976e428..9f2d2e0035 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/View.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/View.kt @@ -2,18 +2,16 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@file:Suppress("TooManyFunctions") - package org.mozilla.fenix.ext import android.graphics.Rect import android.os.Build import android.view.TouchDelegate import android.view.View -import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.Dimension import androidx.annotation.Dimension.Companion.DP import androidx.annotation.VisibleForTesting +import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import mozilla.components.support.ktx.android.util.dpToPx import mozilla.components.support.utils.ext.bottom @@ -55,97 +53,11 @@ fun View.removeTouchDelegate() { } /** - * Sets the new a11y parent. - */ -fun View.setNewAccessibilityParent(newParent: View) { - this.accessibilityDelegate = object : View.AccessibilityDelegate() { - override fun onInitializeAccessibilityNodeInfo( - host: View, - info: AccessibilityNodeInfo, - ) { - super.onInitializeAccessibilityNodeInfo(host, info) - info.setParent(newParent) - } - } -} - -/** - * Updates the a11y collection item info for an item in a list. - */ -fun View.updateAccessibilityCollectionItemInfo( - rowIndex: Int, - columnIndex: Int, - isSelected: Boolean, - rowSpan: Int = 1, - columnSpan: Int = 1, -) { - this.accessibilityDelegate = object : View.AccessibilityDelegate() { - override fun onInitializeAccessibilityNodeInfo( - host: View, - info: AccessibilityNodeInfo, - ) { - super.onInitializeAccessibilityNodeInfo(host, info) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - info.collectionItemInfo = - AccessibilityNodeInfo.CollectionItemInfo( - rowIndex, - rowSpan, - columnIndex, - columnSpan, - false, - isSelected, - ) - } else { - @Suppress("DEPRECATION") - AccessibilityNodeInfo.CollectionItemInfo.obtain( - rowIndex, - rowSpan, - columnIndex, - columnSpan, - false, - isSelected, - ) - } - } - } -} - -/** - * Updates the a11y collection info for a list. - */ -fun View.updateAccessibilityCollectionInfo( - rowCount: Int, - columnCount: Int, -) { - this.accessibilityDelegate = object : View.AccessibilityDelegate() { - override fun onInitializeAccessibilityNodeInfo( - host: View, - info: AccessibilityNodeInfo, - ) { - super.onInitializeAccessibilityNodeInfo(host, info) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - info.collectionInfo = AccessibilityNodeInfo.CollectionInfo( - rowCount, - columnCount, - false, - ) - } else { - @Suppress("DEPRECATION") - info.collectionInfo = AccessibilityNodeInfo.CollectionInfo.obtain( - rowCount, - columnCount, - false, - ) - } - } - } -} - -/** * Fills a [Rect] with data about a view's location in the screen. * - * @see View.getLocationOnScreen - * @see View.getRectWithViewLocation for a version of this that is relative to a window + * @see android.view.View.getLocationOnScreen + * @see mozilla.components.support.ktx.android.view.getRectWithViewLocation for a version of this + * that is relative to a window */ fun View.getRectWithScreenLocation(): Rect { val locationOnScreen = IntArray(2).apply { getLocationOnScreen(this) } @@ -196,8 +108,10 @@ internal fun View.getWindowVisibleDisplayFrame(): Rect = with(Rect()) { this } -@VisibleForTesting -internal fun View.getKeyboardHeight(): Int { +/** + * Calculates the height of the onscreen keyboard. + */ +fun View.getKeyboardHeight(): Int { val windowRect = getWindowVisibleDisplayFrame() val statusBarHeight = windowRect.top var keyboardHeight = rootView.height - (windowRect.height() + statusBarHeight) @@ -207,10 +121,3 @@ internal fun View.getKeyboardHeight(): Int { return keyboardHeight } - -/** - * The assumed minimum height of the keyboard. - */ -@VisibleForTesting -@Dimension(unit = DP) -internal const val MINIMUM_KEYBOARD_HEIGHT = 100 diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt index b0837f80cc..b25a5dbc4a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/gecko/GeckoProvider.kt @@ -93,7 +93,10 @@ object GeckoProvider { isCreditCardAutofillEnabled = { context.settings().shouldAutofillCreditCardDetails }, isAddressAutofillEnabled = { context.settings().shouldAutofillAddressDetails }, ), - GeckoLoginStorageDelegate(loginStorage), + GeckoLoginStorageDelegate( + loginStorage = loginStorage, + isLoginAutofillEnabled = { context.settings().shouldAutofillLogins }, + ), ) return geckoRuntime diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 75c837a62b..ac8de36e7b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.home import android.annotation.SuppressLint +import android.content.Intent import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.drawable.ColorDrawable @@ -13,6 +14,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher import androidx.annotation.VisibleForTesting import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -80,10 +82,12 @@ import mozilla.components.lib.state.ext.consumeFlow import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.service.glean.private.NoExtras import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.support.utils.ext.isLandscape import mozilla.components.ui.colors.PhotonColors import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.HomeScreen import org.mozilla.fenix.GleanMetrics.Homepage +import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.GleanMetrics.NavigationBar import org.mozilla.fenix.GleanMetrics.PrivateBrowsingShortcutCfr import org.mozilla.fenix.HomeActivity @@ -93,10 +97,12 @@ import org.mozilla.fenix.addons.showSnackBar import org.mozilla.fenix.browser.BrowserAnimator import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.browser.tabstrip.TabStrip +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.PrivateShortcutCreateManager import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.appstate.AppAction +import org.mozilla.fenix.components.menu.MenuAccessPoint import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.components.toolbar.navbar.BottomToolbarContainerView @@ -107,16 +113,19 @@ import org.mozilla.fenix.databinding.FragmentHomeBinding import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.containsQueryParameters import org.mozilla.fenix.ext.hideToolbar +import org.mozilla.fenix.ext.isTablet import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.ext.registerForActivityResult import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.scaleToBottomOfView import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.tabClosedUndoMessage +import org.mozilla.fenix.ext.updateNavBarForConfigurationChange +import org.mozilla.fenix.home.bookmarks.BookmarksFeature +import org.mozilla.fenix.home.bookmarks.controller.DefaultBookmarksController import org.mozilla.fenix.home.pocket.DefaultPocketStoriesController import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.privatebrowsing.controller.DefaultPrivateBrowsingController -import org.mozilla.fenix.home.recentbookmarks.RecentBookmarksFeature -import org.mozilla.fenix.home.recentbookmarks.controller.DefaultRecentBookmarksController import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabFeature import org.mozilla.fenix.home.recentsyncedtabs.controller.DefaultRecentSyncedTabController import org.mozilla.fenix.home.recenttabs.RecentTabsListFeature @@ -132,6 +141,7 @@ import org.mozilla.fenix.home.toolbar.SearchSelectorBinding import org.mozilla.fenix.home.toolbar.SearchSelectorMenuBinding import org.mozilla.fenix.home.topsites.DefaultTopSitesView import org.mozilla.fenix.messaging.DefaultMessageController +import org.mozilla.fenix.messaging.FenixMessageSurfaceId import org.mozilla.fenix.messaging.MessagingFeature import org.mozilla.fenix.nimbus.FxNimbus import org.mozilla.fenix.perf.MarkersFragmentLifecycleCallbacks @@ -233,12 +243,14 @@ class HomeFragment : Fragment() { private val messagingFeature = ViewBoundFeatureWrapper<MessagingFeature>() private val recentTabsListFeature = ViewBoundFeatureWrapper<RecentTabsListFeature>() private val recentSyncedTabFeature = ViewBoundFeatureWrapper<RecentSyncedTabFeature>() - private val recentBookmarksFeature = ViewBoundFeatureWrapper<RecentBookmarksFeature>() + private val bookmarksFeature = ViewBoundFeatureWrapper<BookmarksFeature>() private val historyMetadataFeature = ViewBoundFeatureWrapper<RecentVisitsFeature>() private val searchSelectorBinding = ViewBoundFeatureWrapper<SearchSelectorBinding>() private val searchSelectorMenuBinding = ViewBoundFeatureWrapper<SearchSelectorMenuBinding>() private val navbarIntegration = ViewBoundFeatureWrapper<NavbarIntegration>() + private lateinit var savedLoginsLauncher: ActivityResultLauncher<Intent> + override fun onCreate(savedInstanceState: Bundle?) { // DO NOT ADD ANYTHING ABOVE THIS getProfilerTime CALL! val profilerStartTime = requireComponents.core.engine.profiler?.getProfilerTime() @@ -246,6 +258,7 @@ class HomeFragment : Fragment() { super.onCreate(savedInstanceState) bundleArgs = args.toBundle() + savedLoginsLauncher = registerForActivityResult { navigateToSavedLoginsFragment() } // DO NOT MOVE ANYTHING BELOW THIS addMarker CALL! requireComponents.core.engine.profiler?.addMarker( @@ -301,6 +314,7 @@ class HomeFragment : Fragment() { messagingFeature.set( feature = MessagingFeature( appStore = requireComponents.appStore, + surface = FenixMessageSurfaceId.HOMESCREEN, ), owner = viewLifecycleOwner, view = binding.root, @@ -347,9 +361,9 @@ class HomeFragment : Fragment() { ) } - if (requireContext().settings().showRecentBookmarksFeature) { - recentBookmarksFeature.set( - feature = RecentBookmarksFeature( + if (requireContext().settings().showBookmarksHomeFeature) { + bookmarksFeature.set( + feature = BookmarksFeature( appStore = components.appStore, bookmarksUseCase = run { requireContext().components.useCases.bookmarksUseCases @@ -409,7 +423,7 @@ class HomeFragment : Fragment() { accessPoint = TabsTrayAccessPoint.HomeRecentSyncedTab, appStore = components.appStore, ), - recentBookmarksController = DefaultRecentBookmarksController( + bookmarksController = DefaultBookmarksController( activity = activity, navController = findNavController(), appStore = components.appStore, @@ -451,7 +465,11 @@ class HomeFragment : Fragment() { searchEngine = components.core.store.state.search.selectedOrDefaultSearchEngine, ) - if (IncompleteRedesignToolbarFeature(requireContext().settings()).isEnabled) { + // We don't show the navigation bar for tablets and in landscape mode. + val shouldAddNavigationBar = IncompleteRedesignToolbarFeature(requireContext().settings()).isEnabled && + !requireContext().isLandscape() && + !isTablet() + if (shouldAddNavigationBar) { initializeNavBar(activity = activity) } @@ -478,11 +496,27 @@ class HomeFragment : Fragment() { return binding.root } + private fun reinitializeNavBar() { + initializeNavBar(activity = requireActivity() as HomeActivity) + } + override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) homeMenuView?.dismissMenu() + // If the navbar feature could be visible, we should update it's state. + val shouldUpdateNavBarState = + IncompleteRedesignToolbarFeature(requireContext().settings()).isEnabled && !isTablet() + if (shouldUpdateNavBarState) { + updateNavBarForConfigurationChange( + parent = binding.homeLayout, + toolbarView = binding.toolbarLayout, + bottomToolbarContainerView = _bottomToolbarContainerView?.toolbarContainerView, + reinitializeNavBar = ::reinitializeNavBar, + ) + } + val currentWallpaperName = requireContext().settings().currentWallpaperName applyWallpaper( wallpaperName = currentWallpaperName, @@ -511,7 +545,10 @@ class HomeFragment : Fragment() { lifecycleOwner = viewLifecycleOwner, homeActivity = activity, navController = findNavController(), + homeFragment = this, menuButton = WeakReference(menuButton), + onShowPinVerification = { intent -> savedLoginsLauncher.launch(intent) }, + onBiometricAuthenticationSuccessful = ::navigateToSavedLoginsFragment, ).also { it.build() } _bottomToolbarContainerView = BottomToolbarContainerView( @@ -559,7 +596,9 @@ class HomeFragment : Fragment() { onMenuButtonClick = { findNavController().nav( findNavController().currentDestination?.id, - HomeFragmentDirections.actionGlobalMenuDialogFragment(), + HomeFragmentDirections.actionGlobalMenuDialogFragment( + accesspoint = MenuAccessPoint.Home, + ), ) }, ) @@ -682,7 +721,10 @@ class HomeFragment : Fragment() { lifecycleOwner = viewLifecycleOwner, homeActivity = activity as HomeActivity, navController = findNavController(), + homeFragment = this, menuButton = WeakReference(binding.menuButton), + onShowPinVerification = { intent -> savedLoginsLauncher.launch(intent) }, + onBiometricAuthenticationSuccessful = { navigateToSavedLoginsFragment() }, ).also { it.build() } tabCounterView = TabCounterView( @@ -693,7 +735,7 @@ class HomeFragment : Fragment() { ) toolbarView?.build() - if (requireContext().settings().isTabletAndTabStripEnabled) { + if (requireContext().isTabStripEnabled()) { initTabStrip() } @@ -1224,6 +1266,18 @@ class HomeFragment : Fragment() { } } + /** + * Called when authentication succeeds. + */ + private fun navigateToSavedLoginsFragment() { + val navController = findNavController() + if (navController.currentDestination?.id == R.id.homeFragment) { + Logins.openLogins.record(NoExtras()) + val directions = HomeFragmentDirections.actionLoginsListFragment() + navController.navigate(directions) + } + } + companion object { // Used to set homeViewModel.sessionToDelete when all tabs of a browsing mode are closed const val ALL_NORMAL_TABS = "all_normal" diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index f2f7ef7522..93b9518b5a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -49,6 +49,11 @@ class HomeMenu( object Bookmarks : Item() object History : Item() object Downloads : Item() + + /** + * The Passwords menu item + */ + object Passwords : Item() object Extensions : Item() data class SyncAccount(val accountState: AccountState) : Item() @@ -142,6 +147,14 @@ class HomeMenu( onItemTapped.invoke(Item.Downloads) } + val passwordsItem = BrowserMenuImageText( + context.getString(R.string.preferences_sync_logins_2), + R.drawable.mozac_ic_login_24, + primaryTextColor, + ) { + onItemTapped.invoke(Item.Passwords) + } + val extensionsItem = BrowserMenuImageText( context.getString(R.string.browser_menu_extensions), R.drawable.ic_addons_extensions, @@ -217,6 +230,7 @@ class HomeMenu( bookmarksItem, historyItem, downloadsItem, + passwordsItem, extensionsItem, syncSignInMenuItem, accountAuthItem, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt index 7a94a7837a..611946a237 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeMenuView.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.home import android.content.Context +import android.content.Intent import android.view.View import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting.Companion.PRIVATE @@ -29,6 +30,7 @@ import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.settings import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.biometric.bindBiometricsCredentialsPromptOrShowWarning import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit import org.mozilla.fenix.theme.ThemeManager import org.mozilla.fenix.whatsnew.WhatsNew @@ -43,18 +45,26 @@ import org.mozilla.fenix.GleanMetrics.HomeMenu as HomeMenuMetrics * @param lifecycleOwner [LifecycleOwner] for the view. * @param homeActivity [HomeActivity] used to open URLs in a new tab. * @param navController [NavController] used for navigation. + * @param homeFragment [HomeFragment] used to attach the biometric prompt. * @param menuButton The [MenuButton] that will be used to create a menu when the button is * clicked. * @param fxaEntrypoint The source entry point to FxA. + * @param onShowPinVerification Callback for registering the pin verification result. + * @param onBiometricAuthenticationSuccessful Callback for displaying the next screen after a + * successful biometric authentication. */ +@Suppress("LongParameterList") class HomeMenuView( private val view: View, private val context: Context, private val lifecycleOwner: LifecycleOwner, private val homeActivity: HomeActivity, private val navController: NavController, + private val homeFragment: HomeFragment, private val menuButton: WeakReference<MenuButton>, private val fxaEntrypoint: FxAEntryPoint = FenixFxAEntryPoint.HomeMenu, + private val onShowPinVerification: (Intent) -> Unit, + private val onBiometricAuthenticationSuccessful: () -> Unit, ) { /** @@ -166,6 +176,13 @@ class HomeMenuView( HomeFragmentDirections.actionGlobalDownloadsFragment(), ) } + HomeMenu.Item.Passwords -> { + bindBiometricsCredentialsPromptOrShowWarning( + view = view, + onShowPinVerification = onShowPinVerification, + onAuthSuccess = onBiometricAuthenticationSuccessful, + ) + } HomeMenu.Item.Help -> { HomeMenuMetrics.helpTapped.record(NoExtras()) homeActivity.openToBrowserAndLoad( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt index 43319eb061..c8802868e8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/ToolbarView.kt @@ -19,6 +19,7 @@ import androidx.core.view.updateLayoutParams import mozilla.components.browser.state.search.SearchEngine import mozilla.components.support.ktx.android.content.res.resolveAttribute import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.databinding.FragmentHomeBinding @@ -106,7 +107,7 @@ class ToolbarView( gravity = Gravity.TOP } - val isTabletAndTabStripEnabled = context.settings().isTabletAndTabStripEnabled + val isTabletAndTabStripEnabled = context.isTabStripEnabled() ConstraintSet().apply { clone(binding.toolbarLayout) clear(binding.bottomBar.id, ConstraintSet.BOTTOM) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistHandler.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistHandler.kt index 041eb95836..80bad8fc76 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistHandler.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistHandler.kt @@ -8,7 +8,7 @@ import android.net.Uri import androidx.annotation.VisibleForTesting import mozilla.components.support.ktx.kotlin.sha1 import org.mozilla.fenix.ext.containsQueryParameters -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem @@ -37,7 +37,7 @@ class BlocklistHandler(private val settings: Settings) { * in a scope. */ @JvmName("filterRecentBookmark") - fun List<RecentBookmark>.filteredByBlocklist(): List<RecentBookmark> = + fun List<Bookmark>.filteredByBlocklist(): List<Bookmark> = settings.homescreenBlocklist.let { blocklist -> filterNot { it.url?.let { url -> blocklistContainsUrl(blocklist, url) } ?: false diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt index 9c8928c41d..1b65af86fa 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt @@ -41,7 +41,7 @@ class BlocklistMiddleware( when (action) { is AppAction.Change -> { action.copy( - recentBookmarks = action.recentBookmarks.filteredByBlocklist(), + bookmarks = action.bookmarks.filteredByBlocklist(), recentTabs = action.recentTabs.filteredByBlocklist().filterContile(), recentHistory = action.recentHistory.filteredByBlocklist().filterContile(), recentSyncedTabState = action.recentSyncedTabState.filteredByBlocklist().filterContile(), @@ -52,9 +52,9 @@ class BlocklistMiddleware( recentTabs = action.recentTabs.filteredByBlocklist().filterContile(), ) } - is AppAction.RecentBookmarksChange -> { + is AppAction.BookmarksChange -> { action.copy( - recentBookmarks = action.recentBookmarks.filteredByBlocklist(), + bookmarks = action.bookmarks.filteredByBlocklist(), ) } is AppAction.RecentHistoryChange -> { @@ -73,8 +73,8 @@ class BlocklistMiddleware( action } } - is AppAction.RemoveRecentBookmark -> { - action.recentBookmark.url?.let { url -> + is AppAction.RemoveBookmark -> { + action.bookmark.url?.let { url -> addUrlToBlocklist(url) state.toActionFilteringAllState(this) } ?: action @@ -99,7 +99,7 @@ class BlocklistMiddleware( with(blocklistHandler) { AppAction.Change( recentTabs = recentTabs.filteredByBlocklist().filterContile(), - recentBookmarks = recentBookmarks.filteredByBlocklist(), + bookmarks = bookmarks.filteredByBlocklist(), recentHistory = recentHistory.filteredByBlocklist().filterContile(), topSites = topSites, mode = mode, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/RecentBookmarksFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/BookmarksFeature.kt index 3e7dc9d6c5..79af88ea7e 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/RecentBookmarksFeature.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/BookmarksFeature.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks +package org.mozilla.fenix.home.bookmarks import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -17,16 +17,15 @@ import org.mozilla.fenix.components.bookmarks.BookmarksUseCase import org.mozilla.fenix.home.HomeFragment /** - * View-bound feature that retrieves a list of recently added [BookmarkNode]s and dispatches + * View-bound feature that retrieves a list of [BookmarkNode]s and dispatches * updates to the [AppStore]. * * @param appStore the [AppStore] that holds the state of the [HomeFragment]. - * @param bookmarksUseCase the [BookmarksUseCase] for retrieving the list of recently saved - * bookmarks from storage. + * @param bookmarksUseCase the [BookmarksUseCase] for retrieving the list of bookmarks from storage. * @param scope the [CoroutineScope] used to fetch the bookmarks list * @param ioDispatcher the [CoroutineDispatcher] for performing read/write operations. */ -class RecentBookmarksFeature( +class BookmarksFeature( private val appStore: AppStore, private val bookmarksUseCase: BookmarksUseCase, private val scope: CoroutineScope, @@ -37,7 +36,7 @@ class RecentBookmarksFeature( override fun start() { job = scope.launch(ioDispatcher) { val bookmarks = bookmarksUseCase.retrieveRecentBookmarks() - appStore.dispatch(AppAction.RecentBookmarksChange(bookmarks)) + appStore.dispatch(AppAction.BookmarksChange(bookmarks)) } } @@ -47,13 +46,13 @@ class RecentBookmarksFeature( } /** - * A bookmark that was recently added. + * The simple metadata of a bookmark. * * @property title The title of the bookmark. * @property url The url of the bookmark. * @property previewImageUrl A preview image of the page (a.k.a. the hero image), if available. */ -data class RecentBookmark( +data class Bookmark( val title: String? = null, val url: String? = null, val previewImageUrl: String? = null, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/controller/BookmarksController.kt index a3591d9b08..6487efc1b3 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/controller/RecentBookmarksController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/controller/BookmarksController.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.controller +package org.mozilla.fenix.home.bookmarks.controller import androidx.navigation.NavController import mozilla.appservices.places.BookmarkRoot @@ -11,49 +11,49 @@ import mozilla.components.concept.engine.EngineSession import mozilla.components.concept.engine.EngineSession.LoadUrlFlags.Companion.ALLOW_JAVASCRIPT_URL import mozilla.components.feature.tabs.TabsUseCases import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.GleanMetrics.RecentBookmarks +import org.mozilla.fenix.GleanMetrics.HomeBookmarks import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.home.HomeFragmentDirections -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark -import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor +import org.mozilla.fenix.home.bookmarks.Bookmark +import org.mozilla.fenix.home.bookmarks.interactor.BookmarksInteractor /** - * An interface that handles the view manipulation of the recently saved bookmarks on the + * An interface that handles the view manipulation of the bookmarks on the * Home screen. */ -interface RecentBookmarksController { +interface BookmarksController { /** - * @see [RecentBookmarksInteractor.onRecentBookmarkClicked] + * @see [BookmarksInteractor.onBookmarkClicked] */ - fun handleBookmarkClicked(bookmark: RecentBookmark) + fun handleBookmarkClicked(bookmark: Bookmark) /** - * @see [RecentBookmarksInteractor.onShowAllBookmarksClicked] + * @see [BookmarksInteractor.onShowAllBookmarksClicked] */ fun handleShowAllBookmarksClicked() /** - * @see [RecentBookmarksInteractor.onRecentBookmarkRemoved] + * @see [BookmarksInteractor.onBookmarkRemoved] */ - fun handleBookmarkRemoved(bookmark: RecentBookmark) + fun handleBookmarkRemoved(bookmark: Bookmark) } /** - * The default implementation of [RecentBookmarksController]. + * The default implementation of [BookmarksController]. */ -class DefaultRecentBookmarksController( +class DefaultBookmarksController( private val activity: HomeActivity, private val navController: NavController, private val appStore: AppStore, private val browserStore: BrowserStore, private val selectTabUseCase: TabsUseCases.SelectTabUseCase, -) : RecentBookmarksController { +) : BookmarksController { - override fun handleBookmarkClicked(bookmark: RecentBookmark) { + override fun handleBookmarkClicked(bookmark: Bookmark) { val existingTabForBookmark = browserStore.state.tabs.firstOrNull { it.content.url == bookmark.url } @@ -70,17 +70,17 @@ class DefaultRecentBookmarksController( navController.navigate(R.id.browserFragment) } - RecentBookmarks.bookmarkClicked.add() + HomeBookmarks.bookmarkClicked.add() } override fun handleShowAllBookmarksClicked() { - RecentBookmarks.showAllBookmarks.add() + HomeBookmarks.showAllBookmarks.add() navController.navigate( HomeFragmentDirections.actionGlobalBookmarkFragment(BookmarkRoot.Mobile.id), ) } - override fun handleBookmarkRemoved(bookmark: RecentBookmark) { - appStore.dispatch(AppAction.RemoveRecentBookmark(bookmark)) + override fun handleBookmarkRemoved(bookmark: Bookmark) { + appStore.dispatch(AppAction.RemoveBookmark(bookmark)) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/interactor/RecentBookmarksInteractor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/interactor/BookmarksInteractor.kt index 810da7e14a..efe95d2979 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/interactor/RecentBookmarksInteractor.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/interactor/BookmarksInteractor.kt @@ -2,35 +2,35 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.interactor +package org.mozilla.fenix.home.bookmarks.interactor -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor /** - * Interface for recently saved bookmark related actions in the [SessionControlInteractor]. + * Interface for bookmark related actions in the [SessionControlInteractor]. */ -interface RecentBookmarksInteractor { +interface BookmarksInteractor { /** - * Opens the given bookmark in a new tab. Called when an user clicks on a recently saved - * bookmark on the home screen. + * Opens the given bookmark in a new tab. Called when an user clicks on a bookmark on the home + * screen. * * @param bookmark The bookmark that will be opened. */ - fun onRecentBookmarkClicked(bookmark: RecentBookmark) + fun onBookmarkClicked(bookmark: Bookmark) /** * Navigates to bookmark list. Called when an user clicks on the "Show all" button for - * recently saved bookmarks on the home screen. + * bookmarks on the home screen. */ fun onShowAllBookmarksClicked() /** - * Removes a bookmark from the recent bookmark list. Called when a user clicks the "Remove" - * button for recently saved bookmarks on the home screen. + * Removes a bookmark from the list on the home screen. Called when a user clicks the "Remove" + * button for a bookmark on the home screen. * * @param bookmark The bookmark that has been removed. */ - fun onRecentBookmarkRemoved(bookmark: RecentBookmark) + fun onBookmarkRemoved(bookmark: Bookmark) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/Bookmarks.kt index df32d3940b..6f70c98db8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarks.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/Bookmarks.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.view +package org.mozilla.fenix.home.bookmarks.view import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -49,7 +49,7 @@ import org.mozilla.fenix.compose.Image import org.mozilla.fenix.compose.MenuItem import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.inComposePreview -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.theme.FirefoxTheme private val cardShape = RoundedCornerShape(8.dp) @@ -61,58 +61,58 @@ private val imageModifier = Modifier .clip(cardShape) /** - * A list of recent bookmarks. + * A list of bookmarks. * - * @param bookmarks List of [RecentBookmark]s to display. - * @param menuItems List of [RecentBookmarksMenuItem] shown when long clicking a [RecentBookmarkItem] + * @param bookmarks List of [Bookmark]s to display. + * @param menuItems List of [BookmarksMenuItem] shown when long clicking a [BookmarkItem] * @param backgroundColor The background [Color] of each bookmark. - * @param onRecentBookmarkClick Invoked when the user clicks on a recent bookmark. + * @param onBookmarkClick Invoked when the user clicks on a bookmark. */ @OptIn(ExperimentalComposeUiApi::class) @Composable -fun RecentBookmarks( - bookmarks: List<RecentBookmark>, - menuItems: List<RecentBookmarksMenuItem>, +fun Bookmarks( + bookmarks: List<Bookmark>, + menuItems: List<BookmarksMenuItem>, backgroundColor: Color, - onRecentBookmarkClick: (RecentBookmark) -> Unit = {}, + onBookmarkClick: (Bookmark) -> Unit = {}, ) { LazyRow( modifier = Modifier.semantics { testTagsAsResourceId = true - testTag = "recent.bookmarks" + testTag = "bookmarks" }, contentPadding = PaddingValues(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), ) { items(bookmarks) { bookmark -> - RecentBookmarkItem( + BookmarkItem( bookmark = bookmark, menuItems = menuItems, backgroundColor = backgroundColor, - onRecentBookmarkClick = onRecentBookmarkClick, + onBookmarkClick = onBookmarkClick, ) } } } /** - * A recent bookmark item. + * A bookmark item. * - * @param bookmark The [RecentBookmark] to display. - * @param menuItems The list of [RecentBookmarksMenuItem] shown when long clicking on the recent bookmark item. - * @param backgroundColor The background [Color] of the recent bookmark item. - * @param onRecentBookmarkClick Invoked when the user clicks on the recent bookmark item. + * @param bookmark The [Bookmark] to display. + * @param menuItems The list of [BookmarksMenuItem] shown when long clicking on the bookmark item. + * @param backgroundColor The background [Color] of the bookmark item. + * @param onBookmarkClick Invoked when the user clicks on the bookmark item. */ @OptIn( ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class, ) @Composable -private fun RecentBookmarkItem( - bookmark: RecentBookmark, - menuItems: List<RecentBookmarksMenuItem>, +private fun BookmarkItem( + bookmark: Bookmark, + menuItems: List<BookmarksMenuItem>, backgroundColor: Color, - onRecentBookmarkClick: (RecentBookmark) -> Unit = {}, + onBookmarkClick: (Bookmark) -> Unit = {}, ) { var isMenuExpanded by remember { mutableStateOf(false) } @@ -121,7 +121,7 @@ private fun RecentBookmarkItem( .width(158.dp) .combinedClickable( enabled = true, - onClick = { onRecentBookmarkClick(bookmark) }, + onClick = { onBookmarkClick(bookmark) }, onLongClick = { isMenuExpanded = true }, ), shape = cardShape, @@ -133,7 +133,7 @@ private fun RecentBookmarkItem( .fillMaxWidth() .padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp), ) { - RecentBookmarkImage(bookmark) + BookmarkImage(bookmark) Spacer(modifier = Modifier.height(8.dp)) @@ -141,7 +141,7 @@ private fun RecentBookmarkItem( text = bookmark.title ?: bookmark.url ?: "", modifier = Modifier.semantics { testTagsAsResourceId = true - testTag = "recent.bookmark.title" + testTag = "bookmark.title" }, color = FirefoxTheme.colors.textPrimary, overflow = TextOverflow.Ellipsis, @@ -155,7 +155,7 @@ private fun RecentBookmarkItem( menuItems = menuItems.map { item -> MenuItem(item.title) { item.onClick(bookmark) } }, modifier = Modifier.semantics { testTagsAsResourceId = true - testTag = "recent.bookmark.menu" + testTag = "bookmark.menu" }, ) } @@ -163,7 +163,7 @@ private fun RecentBookmarkItem( } @Composable -private fun RecentBookmarkImage(bookmark: RecentBookmark) { +private fun BookmarkImage(bookmark: Bookmark) { when { !bookmark.previewImageUrl.isNullOrEmpty() -> { Image( @@ -221,26 +221,26 @@ private fun FallbackBookmarkFaviconImage( @Composable @LightDarkPreview -private fun RecentBookmarksPreview() { +private fun BookmarksPreview() { FirefoxTheme { - RecentBookmarks( + Bookmarks( bookmarks = listOf( - RecentBookmark( + Bookmark( title = "Other Bookmark Title", url = "https://www.example.com", previewImageUrl = null, ), - RecentBookmark( + Bookmark( title = "Other Bookmark Title", url = "https://www.example.com", previewImageUrl = null, ), - RecentBookmark( + Bookmark( title = "Other Bookmark Title", url = "https://www.example.com", previewImageUrl = null, ), - RecentBookmark( + Bookmark( title = "Other Bookmark Title", url = "https://www.example.com", previewImageUrl = null, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksHeaderViewHolder.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksHeaderViewHolder.kt index 210bad9623..354524b7cb 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksHeaderViewHolder.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksHeaderViewHolder.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.view +package org.mozilla.fenix.home.bookmarks.view import android.view.View import androidx.compose.foundation.layout.Column @@ -17,19 +17,19 @@ import androidx.lifecycle.LifecycleOwner import org.mozilla.fenix.R import org.mozilla.fenix.compose.ComposeViewHolder import org.mozilla.fenix.compose.home.HomeSectionHeader -import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor +import org.mozilla.fenix.home.bookmarks.interactor.BookmarksInteractor /** - * View holder for the recent bookmarks header and "Show all" button. + * View holder for the bookmarks header and "Show all" button. * * @param composeView [ComposeView] which will be populated with Jetpack Compose UI content. * @param viewLifecycleOwner [LifecycleOwner] life cycle owner for the view. - * @param interactor [RecentBookmarksInteractor] which will have delegated to all user interactions. + * @param interactor [BookmarksInteractor] which will have delegated to all user interactions. */ -class RecentBookmarksHeaderViewHolder( +class BookmarksHeaderViewHolder( composeView: ComposeView, viewLifecycleOwner: LifecycleOwner, - private val interactor: RecentBookmarksInteractor, + private val interactor: BookmarksInteractor, ) : ComposeViewHolder(composeView, viewLifecycleOwner) { init { @@ -44,8 +44,8 @@ class RecentBookmarksHeaderViewHolder( Spacer(modifier = Modifier.height(40.dp)) HomeSectionHeader( - headerText = stringResource(R.string.recently_saved_title), - description = stringResource(R.string.recently_saved_show_all_content_description_2), + headerText = stringResource(R.string.home_bookmarks_title), + description = stringResource(R.string.home_bookmarks_show_all_content_description), onShowAllClick = { interactor.onShowAllBookmarksClicked() }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksMenuItem.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksMenuItem.kt index 961245ce1f..b447a71166 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksMenuItem.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksMenuItem.kt @@ -2,17 +2,17 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.view +package org.mozilla.fenix.home.bookmarks.view -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark /** - * A menu item in the recent bookmarks dropdown menu. + * A menu item in the bookmarks dropdown menu. * * @property title The menu item title. * @property onClick Invoked when the user clicks on the menu item. */ -data class RecentBookmarksMenuItem( +data class BookmarksMenuItem( val title: String, - val onClick: (RecentBookmark) -> Unit, + val onClick: (Bookmark) -> Unit, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksViewHolder.kt index 13912bd041..de77577701 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/recentbookmarks/view/RecentBookmarksViewHolder.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/bookmarks/view/BookmarksViewHolder.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks.view +package org.mozilla.fenix.home.bookmarks.view import android.view.View import androidx.compose.runtime.Composable @@ -11,21 +11,24 @@ import androidx.compose.ui.res.stringResource import androidx.lifecycle.LifecycleOwner import mozilla.components.lib.state.ext.observeAsComposableState import mozilla.components.service.glean.private.NoExtras +import org.mozilla.fenix.GleanMetrics.HomeBookmarks import org.mozilla.fenix.R import org.mozilla.fenix.components.components import org.mozilla.fenix.compose.ComposeViewHolder -import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor +import org.mozilla.fenix.home.bookmarks.interactor.BookmarksInteractor import org.mozilla.fenix.wallpapers.WallpaperState -import org.mozilla.fenix.GleanMetrics.RecentBookmarks as RecentBookmarksMetrics -class RecentBookmarksViewHolder( +/** + * ViewHolder for the Bookmarks section in the HomeFragment. + */ +class BookmarksViewHolder( composeView: ComposeView, viewLifecycleOwner: LifecycleOwner, - val interactor: RecentBookmarksInteractor, + val interactor: BookmarksInteractor, ) : ComposeViewHolder(composeView, viewLifecycleOwner) { init { - RecentBookmarksMetrics.shown.record(NoExtras()) + HomeBookmarks.shown.record(NoExtras()) } companion object { @@ -34,18 +37,18 @@ class RecentBookmarksViewHolder( @Composable override fun Content() { - val recentBookmarks = components.appStore.observeAsComposableState { state -> state.recentBookmarks } + val bookmarks = components.appStore.observeAsComposableState { state -> state.bookmarks } val wallpaperState = components.appStore .observeAsComposableState { state -> state.wallpaperState }.value ?: WallpaperState.default - RecentBookmarks( - bookmarks = recentBookmarks.value ?: emptyList(), + Bookmarks( + bookmarks = bookmarks.value ?: emptyList(), backgroundColor = wallpaperState.wallpaperCardColor, - onRecentBookmarkClick = interactor::onRecentBookmarkClicked, + onBookmarkClick = interactor::onBookmarkClicked, menuItems = listOf( - RecentBookmarksMenuItem( - stringResource(id = R.string.recently_saved_menu_item_remove), - onClick = { bookmark -> interactor.onRecentBookmarkRemoved(bookmark) }, + BookmarksMenuItem( + stringResource(id = R.string.home_bookmarks_menu_item_remove), + onClick = { bookmark -> interactor.onBookmarkRemoved(bookmark) }, ), ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionViewHolder.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionViewHolder.kt index cd70ec0612..80b783b5da 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionViewHolder.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/collections/CollectionViewHolder.kt @@ -141,7 +141,7 @@ private fun getMenuItems( MenuItem( title = stringResource(R.string.collection_delete), - color = FirefoxTheme.colors.textWarning, + color = FirefoxTheme.colors.textCritical, ) { onDeleteCollectionTapped(collection) }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessor.kt new file mode 100644 index 0000000000..441e2af7f1 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessor.kt @@ -0,0 +1,30 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.home.intent + +import android.content.Intent +import androidx.navigation.NavController +import org.mozilla.fenix.NavGraphDirections +import org.mozilla.fenix.ext.nav + +/** + * Opens the "recently closed tabs" fragment when the user taps on a + * "synced tabs closed" notification. + */ +class OpenRecentlyClosedIntentProcessor : HomeIntentProcessor { + override fun process(intent: Intent, navController: NavController, out: Intent): Boolean { + return if (intent.action == ACTION_OPEN_RECENTLY_CLOSED) { + val directions = NavGraphDirections.actionGlobalRecentlyClosed() + navController.nav(null, directions) + true + } else { + false + } + } + + companion object { + const val ACTION_OPEN_RECENTLY_CLOSED = "org.mozilla.fenix.open_recently_closed" + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index ff93260109..4b5d49e697 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -18,13 +18,13 @@ import mozilla.components.service.nimbus.messaging.Message import org.mozilla.fenix.components.Components import org.mozilla.fenix.home.BottomSpacerViewHolder import org.mozilla.fenix.home.TopPlaceholderViewHolder +import org.mozilla.fenix.home.bookmarks.view.BookmarksHeaderViewHolder +import org.mozilla.fenix.home.bookmarks.view.BookmarksViewHolder import org.mozilla.fenix.home.collections.CollectionViewHolder import org.mozilla.fenix.home.collections.TabInCollectionViewHolder import org.mozilla.fenix.home.pocket.PocketCategoriesViewHolder import org.mozilla.fenix.home.pocket.PocketRecommendationsHeaderViewHolder import org.mozilla.fenix.home.pocket.PocketStoriesViewHolder -import org.mozilla.fenix.home.recentbookmarks.view.RecentBookmarksHeaderViewHolder -import org.mozilla.fenix.home.recentbookmarks.view.RecentBookmarksViewHolder import org.mozilla.fenix.home.recentsyncedtabs.view.RecentSyncedTabViewHolder import org.mozilla.fenix.home.recenttabs.view.RecentTabViewHolder import org.mozilla.fenix.home.recenttabs.view.RecentTabsHeaderViewHolder @@ -155,8 +155,15 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) { object RecentVisitsHeader : AdapterItem(RecentVisitsHeaderViewHolder.LAYOUT_ID) object RecentVisitsItems : AdapterItem(RecentlyVisitedViewHolder.LAYOUT_ID) - object RecentBookmarksHeader : AdapterItem(RecentBookmarksHeaderViewHolder.LAYOUT_ID) - object RecentBookmarks : AdapterItem(RecentBookmarksViewHolder.LAYOUT_ID) + /** + * The header for the Bookmarks section. + */ + object BookmarksHeader : AdapterItem(BookmarksHeaderViewHolder.LAYOUT_ID) + + /** + * The Bookmarks section. + */ + object Bookmarks : AdapterItem(BookmarksViewHolder.LAYOUT_ID) object PocketStoriesItem : AdapterItem(PocketStoriesViewHolder.LAYOUT_ID) object PocketCategoriesItem : AdapterItem(PocketCategoriesViewHolder.LAYOUT_ID) @@ -230,7 +237,7 @@ class SessionControlAdapter( viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, ) - RecentBookmarksViewHolder.LAYOUT_ID -> return RecentBookmarksViewHolder( + BookmarksViewHolder.LAYOUT_ID -> return BookmarksViewHolder( composeView = ComposeView(parent.context), viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, @@ -255,7 +262,7 @@ class SessionControlAdapter( viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, ) - RecentBookmarksHeaderViewHolder.LAYOUT_ID -> return RecentBookmarksHeaderViewHolder( + BookmarksHeaderViewHolder.LAYOUT_ID -> return BookmarksHeaderViewHolder( composeView = ComposeView(parent.context), viewLifecycleOwner = viewLifecycleOwner, interactor = interactor, @@ -314,8 +321,8 @@ class SessionControlAdapter( is CustomizeHomeButtonViewHolder, is RecentlyVisitedViewHolder, is RecentVisitsHeaderViewHolder, - is RecentBookmarksViewHolder, - is RecentBookmarksHeaderViewHolder, + is BookmarksViewHolder, + is BookmarksHeaderViewHolder, is RecentTabViewHolder, is RecentSyncedTabViewHolder, is RecentTabsHeaderViewHolder, @@ -394,7 +401,7 @@ class SessionControlAdapter( } is TopSitesViewHolder, is RecentlyVisitedViewHolder, - is RecentBookmarksViewHolder, + is BookmarksViewHolder, is RecentTabViewHolder, is RecentSyncedTabViewHolder, is PocketStoriesViewHolder, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 6f429e6dfb..a5412eeb9a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -32,10 +32,10 @@ import mozilla.components.ui.widgets.withCenterAlignedButtons import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Collections +import org.mozilla.fenix.GleanMetrics.HomeBookmarks import org.mozilla.fenix.GleanMetrics.HomeScreen import org.mozilla.fenix.GleanMetrics.Pings import org.mozilla.fenix.GleanMetrics.Pocket -import org.mozilla.fenix.GleanMetrics.RecentBookmarks import org.mozilla.fenix.GleanMetrics.RecentTabs import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.HomeActivity @@ -551,6 +551,6 @@ class DefaultSessionControlController( RecentTabs.sectionVisible.set(true) } - RecentBookmarks.recentBookmarksCount.set(state.recentBookmarks.size.toLong()) + HomeBookmarks.bookmarksCount.set(state.bookmarks.size.toLong()) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt index 8ef6086cfe..f5d214fd92 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlInteractor.kt @@ -11,14 +11,14 @@ import mozilla.components.service.nimbus.messaging.Message import mozilla.components.service.pocket.PocketStory import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.appstate.AppState +import org.mozilla.fenix.home.bookmarks.Bookmark +import org.mozilla.fenix.home.bookmarks.controller.BookmarksController +import org.mozilla.fenix.home.bookmarks.interactor.BookmarksInteractor import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketStoriesController import org.mozilla.fenix.home.pocket.PocketStoriesInteractor import org.mozilla.fenix.home.privatebrowsing.controller.PrivateBrowsingController import org.mozilla.fenix.home.privatebrowsing.interactor.PrivateBrowsingInteractor -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark -import org.mozilla.fenix.home.recentbookmarks.controller.RecentBookmarksController -import org.mozilla.fenix.home.recentbookmarks.interactor.RecentBookmarksInteractor import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.controller.RecentSyncedTabController import org.mozilla.fenix.home.recentsyncedtabs.interactor.RecentSyncedTabInteractor @@ -229,7 +229,7 @@ class SessionControlInteractor( private val controller: SessionControlController, private val recentTabController: RecentTabController, private val recentSyncedTabController: RecentSyncedTabController, - private val recentBookmarksController: RecentBookmarksController, + private val bookmarksController: BookmarksController, private val recentVisitsController: RecentVisitsController, private val pocketStoriesController: PocketStoriesController, private val privateBrowsingController: PrivateBrowsingController, @@ -242,7 +242,7 @@ class SessionControlInteractor( MessageCardInteractor, RecentTabInteractor, RecentSyncedTabInteractor, - RecentBookmarksInteractor, + BookmarksInteractor, RecentVisitsInteractor, CustomizeHomeIteractor, PocketStoriesInteractor, @@ -366,16 +366,16 @@ class SessionControlInteractor( recentSyncedTabController.handleRecentSyncedTabRemoved(tab) } - override fun onRecentBookmarkClicked(bookmark: RecentBookmark) { - recentBookmarksController.handleBookmarkClicked(bookmark) + override fun onBookmarkClicked(bookmark: Bookmark) { + bookmarksController.handleBookmarkClicked(bookmark) } override fun onShowAllBookmarksClicked() { - recentBookmarksController.handleShowAllBookmarksClicked() + bookmarksController.handleShowAllBookmarksClicked() } - override fun onRecentBookmarkRemoved(bookmark: RecentBookmark) { - recentBookmarksController.handleBookmarkRemoved(bookmark) + override fun onBookmarkRemoved(bookmark: Bookmark) { + bookmarksController.handleBookmarkRemoved(bookmark) } override fun onHistoryShowAllClicked() { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index 3e7e9ddee7..902d7d8688 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -20,7 +20,7 @@ import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.shouldShowRecentSyncedTabs import org.mozilla.fenix.ext.shouldShowRecentTabs -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem import org.mozilla.fenix.messaging.FenixMessageSurfaceId import org.mozilla.fenix.onboarding.HomeCFRPresenter @@ -35,7 +35,7 @@ internal fun normalModeAdapterItems( topSites: List<TopSite>, collections: List<TabCollection>, expandedCollections: Set<Long>, - recentBookmarks: List<RecentBookmark>, + bookmarks: List<Bookmark>, showCollectionsPlaceholder: Boolean, nimbusMessageCard: Message? = null, showRecentTab: Boolean, @@ -72,10 +72,10 @@ internal fun normalModeAdapterItems( } } - if (settings.showRecentBookmarksFeature && recentBookmarks.isNotEmpty()) { + if (settings.showBookmarksHomeFeature && bookmarks.isNotEmpty()) { shouldShowCustomizeHome = true - items.add(AdapterItem.RecentBookmarksHeader) - items.add(AdapterItem.RecentBookmarks) + items.add(AdapterItem.BookmarksHeader) + items.add(AdapterItem.Bookmarks) } if (settings.historyMetadataUIFeature && recentVisits.isNotEmpty()) { @@ -137,7 +137,7 @@ private fun AppState.toAdapterList(settings: Settings): List<AdapterItem> = when topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, showCollectionPlaceholder, messaging.messageToShow[FenixMessageSurfaceId.HOMESCREEN], shouldShowRecentTabs(settings), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/PagerIndicator.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/PagerIndicator.kt index 72f315d165..8046ed3dfd 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/PagerIndicator.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/topsites/PagerIndicator.kt @@ -8,8 +8,8 @@ import android.content.Context import android.util.AttributeSet import android.util.TypedValue import android.view.View +import android.view.ViewGroup.LayoutParams import android.widget.LinearLayout -import androidx.core.view.MarginLayoutParamsCompat import org.mozilla.fenix.R /** @@ -46,7 +46,7 @@ class PagerIndicator : LinearLayout { }, LayoutParams(dpToPx(DOT_SIZE_IN_DP), dpToPx(DOT_SIZE_IN_DP)).apply { if (!isLast) { - MarginLayoutParamsCompat.setMarginEnd(this, dpToPx(DOT_MARGIN)) + this.setMarginEnd(dpToPx(DOT_MARGIN)) } }, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 4664675890..5afe189836 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -67,9 +67,7 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan private lateinit var bookmarkStore: BookmarkFragmentStore private lateinit var bookmarkView: BookmarkView - private var _bookmarkInteractor: BookmarkFragmentInteractor? = null - private val bookmarkInteractor: BookmarkFragmentInteractor - get() = _bookmarkInteractor!! + private lateinit var bookmarkInteractor: BookmarkFragmentInteractor private val sharedViewModel: BookmarksSharedViewModel by activityViewModels() private val desktopFolders by lazy { DesktopFolders(requireContext(), showMobileRoot = false) } @@ -92,7 +90,7 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan BookmarkFragmentStore(BookmarkFragmentState(null)) } - _bookmarkInteractor = BookmarkFragmentInteractor( + bookmarkInteractor = BookmarkFragmentInteractor( bookmarksController = DefaultBookmarkController( activity = requireActivity() as HomeActivity, navController = findNavController(), @@ -191,7 +189,7 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan menu.findItem(R.id.delete_bookmarks_multi_select).title = SpannableString(getString(R.string.bookmark_menu_delete_button)).apply { - setTextColor(requireContext(), R.attr.textWarning) + setTextColor(requireContext(), R.attr.textCritical) } } } @@ -391,7 +389,6 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), UserInteractionHan override fun onDestroyView() { super.onDestroyView() - _bookmarkInteractor = null _binding = null } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt index fe46380044..58864f750f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenu.kt @@ -104,7 +104,7 @@ class BookmarkItemMenu( }, TextMenuCandidate( text = context.getString(R.string.bookmark_menu_delete_button), - textStyle = TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), + textStyle = TextStyle(color = context.getColorFromAttr(R.attr.textCritical)), ) { onItemTapped.invoke(Item.Delete) }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index b80b013eba..e3e8affee8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -299,7 +299,7 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark), MenuProv ColorStateList.valueOf( ContextCompat.getColor( requireContext(), - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt index 2fcac34ab1..34d68916b9 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragment.kt @@ -165,7 +165,7 @@ class DownloadFragment : LibraryPageFragment<DownloadItem>(), UserInteractionHan menu.findItem(R.id.delete_downloads_multi_select)?.title = SpannableString(getString(R.string.download_delete_item_1)).apply { - setTextColor(requireContext(), R.attr.textWarning) + setTextColor(requireContext(), R.attr.textCritical) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadItemMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadItemMenu.kt index e1c4dc4407..a747139d97 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadItemMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadItemMenu.kt @@ -34,7 +34,7 @@ class DownloadItemMenu( TextMenuCandidate( text = context.getString(R.string.history_delete_item), textStyle = TextStyle( - color = context.getColorFromAttr(R.attr.textWarning), + color = context.getColorFromAttr(R.attr.textCritical), ), ) { onItemTapped.invoke(Item.Delete) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt index fbeda874b7..5de7644db3 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/HistoryFragment.kt @@ -254,7 +254,7 @@ class HistoryFragment : LibraryPageFragment<History>(), UserInteractionHandler, menu.findItem(R.id.share_history_multi_select)?.isVisible = true menu.findItem(R.id.delete_history_multi_select)?.title = SpannableString(getString(R.string.bookmark_menu_delete_button)).apply { - setTextColor(requireContext(), R.attr.textWarning) + setTextColor(requireContext(), R.attr.textCritical) } } else { inflater.inflate(R.menu.history_menu, menu) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt index 7ba3a9cf13..e84fbbc440 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/historymetadata/HistoryMetadataGroupFragment.kt @@ -157,7 +157,7 @@ class HistoryMetadataGroupFragment : menu.findItem(R.id.delete_history_multi_select)?.let { deleteItem -> deleteItem.title = SpannableString(deleteItem.title).apply { - setTextColor(requireContext(), R.attr.textWarning) + setTextColor(requireContext(), R.attr.textCritical) } } } else { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt index 593a9d3678..fb9aa6bfb7 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/recentlyclosed/RecentlyClosedFragment.kt @@ -58,7 +58,7 @@ class RecentlyClosedFragment : inflater.inflate(R.menu.history_select_multi, menu) menu.findItem(R.id.delete_history_multi_select)?.let { deleteItem -> deleteItem.title = SpannableString(deleteItem.title) - .apply { setTextColor(requireContext(), R.attr.textWarning) } + .apply { setTextColor(requireContext(), R.attr.textCritical) } } } else { inflater.inflate(R.menu.library_menu, menu) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/FenixMessageSurfaceId.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/FenixMessageSurfaceId.kt index f7092f6b01..e362b435cb 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/FenixMessageSurfaceId.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/FenixMessageSurfaceId.kt @@ -22,4 +22,9 @@ object FenixMessageSurfaceId { * A survey dialog that is intended to be disruptive. */ const val SURVEY = "survey" + + /** + * A microsurvey UI for a specific feature. + */ + const val MICROSURVEY = "microsurvey" } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/MessagingFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/MessagingFeature.kt index 9e9a5ef812..c8eb6508c7 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/MessagingFeature.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/MessagingFeature.kt @@ -4,17 +4,18 @@ package org.mozilla.fenix.messaging +import mozilla.components.service.nimbus.messaging.MessageSurfaceId import mozilla.components.support.base.feature.LifecycleAwareFeature import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction.MessagingAction /** - * A message observer that updates the provided. + * A [LifecycleAwareFeature] which tries to evaluate if message is available for the provided [surface]. */ -class MessagingFeature(val appStore: AppStore) : LifecycleAwareFeature { +class MessagingFeature(val appStore: AppStore, val surface: MessageSurfaceId) : LifecycleAwareFeature { override fun start() { - appStore.dispatch(MessagingAction.Evaluate(FenixMessageSurfaceId.HOMESCREEN)) + appStore.dispatch(MessagingAction.Evaluate(surface)) } override fun stop() = Unit diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyContent.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyContent.kt new file mode 100644 index 0000000000..e89c5b64ed --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyContent.kt @@ -0,0 +1,123 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Card +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.list.RadioButtonListItem +import org.mozilla.fenix.theme.FirefoxTheme + +private val shape = RoundedCornerShape(16.dp) +private val elevation: Dp = 5.dp + +/** + * The micro survey content UI to hold question and answer data. + * + * @param question The survey question text. + * @param answers The survey answer text options available for the question. + * @param icon The survey icon, this will represent the feature the survey is for. + * @param backgroundColor The view background color. + * @param selectedAnswer The current selected answer. Will be null until user selects an option. + * @param onSelectionChange An event that updates the [selectedAnswer]. + */ +@Composable +fun MicroSurveyContent( + question: String, + answers: List<String>, + @DrawableRes icon: Int = R.drawable.ic_print, // todo currently unknown what the default will be if any. + backgroundColor: Color = FirefoxTheme.colors.layer2, + selectedAnswer: String? = null, + onSelectionChange: (String) -> Unit, +) { + Card( + shape = shape, + backgroundColor = backgroundColor, + elevation = elevation, + modifier = Modifier + .wrapContentHeight() + .fillMaxWidth(), + ) { + Column(modifier = Modifier.wrapContentHeight()) { + Header(icon, question) + + answers.forEach { + RadioButtonListItem( + label = it, + selected = selectedAnswer == it, + onClick = { + onSelectionChange.invoke(it) + }, + ) + } + } + } +} + +@Composable +private fun Header(icon: Int, question: String) { + Row( + modifier = Modifier.padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(icon), + contentDescription = "Survey icon", // todo update to string res once a11y strings are available. + modifier = Modifier.size(24.dp), + ) + + Spacer(modifier = Modifier.width(16.dp)) + + Text( + text = question, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline7, + ) + } +} + +/** + * Preview for [MicroSurveyContent]. + */ +@PreviewScreenSizes +@LightDarkPreview +@Composable +fun MicroSurveyContentPreview() { + FirefoxTheme { + MicroSurveyContent( + question = "How satisfied are you with printing in Firefox?", + icon = R.drawable.ic_print, + answers = listOf( + stringResource(id = R.string.likert_scale_option_1), + stringResource(id = R.string.likert_scale_option_2), + stringResource(id = R.string.likert_scale_option_3), + stringResource(id = R.string.likert_scale_option_4), + stringResource(id = R.string.likert_scale_option_5), + ), + onSelectionChange = {}, + ) + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyFooter.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyFooter.kt new file mode 100644 index 0000000000..e9dd23c97f --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyFooter.kt @@ -0,0 +1,105 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.LinkText +import org.mozilla.fenix.compose.LinkTextState +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * The footer UI used for micro-survey. + * + * @param isSubmitted Whether the user has "Submitted" the survey or not. + * @param isContentAnswerSelected Whether the user clicked on one of the answers or not. + * @param onLinkClick Invoked when the link is clicked. + * @param onButtonClick Invoked when the "Submit"/"Close" button is clicked. + */ +@Composable +fun MicroSurveyFooter( + isSubmitted: Boolean, + isContentAnswerSelected: Boolean, + onLinkClick: () -> Unit, + onButtonClick: () -> Unit, +) { + val buttonText = if (isSubmitted) { + stringResource(id = R.string.micro_survey_close_button_label) + } else { + stringResource(id = R.string.micro_survey_submit_button_label) + } + val buttonColor = if (isContentAnswerSelected) { + FirefoxTheme.colors.actionPrimary + } else { + FirefoxTheme.colors.actionPrimaryDisabled + } + + Row( + verticalAlignment = Alignment.Bottom, + modifier = Modifier.fillMaxWidth(), + ) { + LinkText( + text = stringResource(id = R.string.about_privacy_notice), + linkTextStates = listOf( + LinkTextState( + text = stringResource(id = R.string.micro_survey_privacy_notice), + url = "", + onClick = { + onLinkClick() + }, + ), + ), + style = FirefoxTheme.typography.caption, + linkTextDecoration = TextDecoration.Underline, + ) + + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = { onButtonClick() }, + enabled = isContentAnswerSelected, + shape = RoundedCornerShape(size = 4.dp), + colors = ButtonDefaults.buttonColors( + backgroundColor = buttonColor, + ), + contentPadding = PaddingValues(16.dp, 12.dp), + ) { + Text( + text = buttonText, + color = FirefoxTheme.colors.textActionPrimary, + style = FirefoxTheme.typography.button, + ) + } + } +} + +@PreviewScreenSizes +@LightDarkPreview +@Composable +private fun ReviewQualityCheckFooterPreview() { + FirefoxTheme { + MicroSurveyFooter( + isSubmitted = false, + isContentAnswerSelected = false, + onLinkClick = {}, + onButtonClick = {}, + ) + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyHeader.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyHeader.kt new file mode 100644 index 0000000000..77fda94dc2 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyHeader.kt @@ -0,0 +1,86 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * The header UI used for micro-survey. + * + * @param title The text that will be visible on the header. + * @param onCloseButtonClick Invoked when the close button is clicked. + */ +@Composable +fun MicroSurveyHeader( + title: String, + onCloseButtonClick: () -> Unit, +) { + Row( + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth(), + ) { + Image( + painter = painterResource(R.drawable.ic_firefox), + contentDescription = null, // todo update to string res once a11y strings are available. + modifier = Modifier.size(24.dp), + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Text( + text = title, + style = FirefoxTheme.typography.headline7, + color = FirefoxTheme.colors.textPrimary, + modifier = Modifier.weight(1f), + ) + + IconButton(onClick = onCloseButtonClick) { + Icon( + painter = painterResource(id = R.drawable.ic_close), + contentDescription = null, // todo update to string res once a11y strings are available. + tint = FirefoxTheme.colors.iconPrimary, + modifier = Modifier.size(20.dp), + ) + } + } +} + +@PreviewScreenSizes +@LightDarkPreview +@Composable +private fun MicroSurveyHeaderPreview() { + FirefoxTheme { + Box( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer1) + .padding(16.dp), + ) { + MicroSurveyHeader(stringResource(R.string.micro_survey_survey_header)) {} + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyScaffold.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyScaffold.kt new file mode 100644 index 0000000000..20294a0158 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicroSurveyScaffold.kt @@ -0,0 +1,67 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Card +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A scaffold for micro-survey UI that implements the basic layout structure with + * [content]. + * + * @param content The content of micro-survey. + */ +@Composable +fun MicroSurveyScaffold( + content: @Composable () -> Unit, +) { + var isOpen by remember { mutableStateOf(false) } + val cardShape = if (isOpen) { + RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) + } else { + RectangleShape + } + val height = if (isOpen) { + 600.dp + } else { + 200.dp + } + + Card( + shape = cardShape, + backgroundColor = FirefoxTheme.colors.actionQuarternary, + modifier = Modifier + .fillMaxWidth() + .clickable( + onClick = { isOpen = !isOpen }, + ), + ) { + Column(modifier = Modifier.height(height)) { + content() + } + } +} + +@LightDarkPreview +@Composable +private fun MicroSurveyScaffoldPreview() { + FirefoxTheme { + MicroSurveyScaffold {} + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheet.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheet.kt new file mode 100644 index 0000000000..eaf2f63081 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheet.kt @@ -0,0 +1,117 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.traversalIndex +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.BottomSheetHandle +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.theme.FirefoxTheme + +private const val BOTTOM_SHEET_HANDLE_WIDTH_PERCENT = 0.1f +private val bottomSheetShape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp) + +/** + * The microsurvey bottom sheet. + * + * @param question The question text. + * @param answers The answer text options available for the given [question]. + * @param icon The icon that represents the feature for the given [question]. + */ +@Composable +fun MicrosurveyBottomSheet( + question: String, + answers: List<String>, + @DrawableRes icon: Int = R.drawable.ic_print, // todo currently unknown if default is used FXDROID-1921. +) { + var selectedAnswer by remember { mutableStateOf<String?>(null) } + var isSubmitted by remember { mutableStateOf(false) } + + Surface( + color = FirefoxTheme.colors.layer1, + shape = bottomSheetShape, + ) { + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding( + vertical = 8.dp, + horizontal = 16.dp, + ), + ) { + BottomSheetHandle( + onRequestDismiss = {}, + contentDescription = stringResource(R.string.review_quality_check_close_handle_content_description), + modifier = Modifier + .fillMaxWidth(BOTTOM_SHEET_HANDLE_WIDTH_PERCENT) + .align(Alignment.CenterHorizontally) + .semantics { traversalIndex = -1f }, + ) + + Spacer(modifier = Modifier.height(4.dp)) + + MicroSurveyHeader(title = stringResource(id = R.string.micro_survey_survey_header)) {} + + Spacer(modifier = Modifier.height(8.dp)) + + MicroSurveyContent( + question = question, + icon = icon, + answers = answers, + selectedAnswer = selectedAnswer, + onSelectionChange = { selectedAnswer = it }, + ) + + Spacer(modifier = Modifier.height(24.dp)) + + MicroSurveyFooter( + isSubmitted = isSubmitted, + isContentAnswerSelected = selectedAnswer != null, + onLinkClick = {}, // todo add privacy policy link and open new tab FXDROID-1876. + onButtonClick = { isSubmitted = true }, + ) + } + } +} + +@PreviewScreenSizes +@LightDarkPreview +@Composable +private fun MicroSurveyBottomSheetPreview() { + FirefoxTheme { + MicrosurveyBottomSheet( + question = "How satisfied are you with printing in Firefox?", + icon = R.drawable.ic_print, + answers = listOf( + stringResource(id = R.string.likert_scale_option_1), + stringResource(id = R.string.likert_scale_option_2), + stringResource(id = R.string.likert_scale_option_3), + stringResource(id = R.string.likert_scale_option_4), + stringResource(id = R.string.likert_scale_option_5), + ), + ) + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheetFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheetFragment.kt new file mode 100644 index 0000000000..338b1f3779 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyBottomSheetFragment.kt @@ -0,0 +1,66 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import org.mozilla.fenix.R +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * todo update behaviour FXDROID-1944. + * todo pass question and icon values from messaging FXDROID-1945. + * todo add dismiss request FXDROID-1946. + */ + +/** + * A bottom sheet fragment for displaying a microsurvey. + */ +class MicrosurveyBottomSheetFragment : BottomSheetDialogFragment() { + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = + super.onCreateDialog(savedInstanceState).apply { + setOnShowListener { + val bottomSheet = findViewById<View?>(R.id.design_bottom_sheet) + bottomSheet?.setBackgroundResource(android.R.color.transparent) + val behavior = BottomSheetBehavior.from(bottomSheet) + behavior.peekHeight = resources.displayMetrics.heightPixels + behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + val answers = listOf( + getString(R.string.likert_scale_option_1), + getString(R.string.likert_scale_option_2), + getString(R.string.likert_scale_option_3), + getString(R.string.likert_scale_option_4), + getString(R.string.likert_scale_option_5), + ) + + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + + setContent { + FirefoxTheme { + MicrosurveyBottomSheet( + question = "How satisfied are you with printing in Firefox?", // todo get value from messaging + icon = R.drawable.ic_print, // todo get value from messaging + answers = answers, // todo get value from messaging + ) + } + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyRequestPrompt.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyRequestPrompt.kt new file mode 100644 index 0000000000..44d3ce71b2 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/microsurvey/ui/MicrosurveyRequestPrompt.kt @@ -0,0 +1,96 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.microsurvey.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.compose.ui.unit.dp +import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview +import org.mozilla.fenix.compose.button.PrimaryButton +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * Initial microsurvey prompt displayed to the user to request completion of feedback. + * + * @param title The prompt header title. + */ +@Composable +fun MicrosurveyRequestPrompt( + // todo this is the message title FXDROID-1966). + title: String = "Help make printing in Firefox better. It only takes a sec.", +) { + Column( + modifier = Modifier + .background(color = FirefoxTheme.colors.layer1) + .padding(all = 16.dp), + ) { + Header(title) + + Spacer(modifier = Modifier.height(8.dp)) + + PrimaryButton(text = stringResource(id = R.string.micro_survey_continue_button_label)) {} + } +} + +@Composable +private fun Header( + title: String, +) { + Row( + modifier = Modifier.fillMaxWidth(), + ) { + Image( + painter = painterResource(R.drawable.ic_firefox), + contentDescription = null, // todo update to string res once a11y strings are available FXDROID-1919. + modifier = Modifier.size(24.dp), + ) + + Spacer(modifier = Modifier.width(8.dp)) + + Text( + text = title, + style = FirefoxTheme.typography.headline7, + color = FirefoxTheme.colors.textPrimary, + modifier = Modifier.weight(1f), + ) + + IconButton( + onClick = {}, // todo FXDROID-1947. + modifier = Modifier.size(20.dp), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_close), + contentDescription = null, // todo update to string res once a11y strings are available FXDROID-1919. + tint = FirefoxTheme.colors.iconPrimary, + ) + } + } +} + +@PreviewScreenSizes +@LightDarkPreview +@Composable +private fun MicrosurveyRequestPromptPreview() { + FirefoxTheme { + MicrosurveyRequestPrompt() + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt index 487e46b7d6..7bf2e6a547 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt @@ -10,6 +10,7 @@ import android.content.IntentFilter import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle +import android.os.StrictMode import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -29,6 +30,7 @@ import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint import org.mozilla.fenix.compose.LinkTextState import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.hideToolbar +import org.mozilla.fenix.ext.isDefaultBrowserPromptSupported import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.openSetDefaultBrowserOption import org.mozilla.fenix.ext.requireComponents @@ -51,7 +53,8 @@ class OnboardingFragment : Fragment() { private val pagesToDisplay by lazy { pagesToDisplay( - isNotDefaultBrowser(requireContext()), + isNotDefaultBrowser(requireContext()) && + activity?.isDefaultBrowserPromptSupported() == false, canShowNotificationPage(requireContext()), canShowAddSearchWidgetPrompt(), ) @@ -76,9 +79,11 @@ class OnboardingFragment : Fragment() { .registerReceiver(pinAppWidgetReceiver, filter) if (isNotDefaultBrowser(context) && - pagesToDisplay.none { it.type == OnboardingPageUiData.Type.DEFAULT_BROWSER } + activity?.isDefaultBrowserPromptSupported() == true ) { - promptToSetAsDefaultBrowser() + requireComponents.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { + promptToSetAsDefaultBrowser() + } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerStopDialogFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerStopDialogFragment.kt index f08b1a6552..351860f442 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerStopDialogFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerStopDialogFragment.kt @@ -56,9 +56,8 @@ class ProfilerStopDialogFragment : DialogFragment() { } } - override fun dismiss() { + private fun setProfilerState() { profilerViewModel.setProfilerState(requireContext().components.core.engine.profiler!!.isProfilerActive()) - super.dismiss() } @Composable @@ -111,7 +110,14 @@ class ProfilerStopDialogFragment : DialogFragment() { ) { TextButton( onClick = { - requireContext().components.core.engine.profiler?.stopProfiler({}, {}) + requireContext().components.core.engine.profiler?.stopProfiler( + onSuccess = { + setProfilerState() + }, + onError = { + setProfilerState() + }, + ) dismiss() }, ) { @@ -162,6 +168,7 @@ class ProfilerStopDialogFragment : DialogFragment() { resources.getString(message) + extra, Toast.LENGTH_LONG, ).show() + setProfilerState() dismiss() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerUtils.kt index 28a8211e59..5fddb6500e 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerUtils.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/perf/ProfilerUtils.kt @@ -34,6 +34,7 @@ private val firefox_features = arrayOf( "java", "processcpu", "ipcmessages", + "memory", ) private val firefox_threads = arrayOf( "GeckoMain", @@ -43,7 +44,8 @@ private val firefox_threads = arrayOf( "DOM Worker", ) -private val graphics_features = arrayOf("stackwalk", "js", "cpu", "java", "processcpu", "ipcmessages") +private val graphics_features = + arrayOf("stackwalk", "js", "cpu", "java", "processcpu", "ipcmessages", "memory") private val graphics_threads = arrayOf( "GeckoMain", "Compositor", @@ -64,6 +66,7 @@ private val media_features = arrayOf( "ipcmessages", "processcpu", "java", + "memory", ) private val media_threads = arrayOf( "cubeb", "audio", "BackgroundThreadPool", "camera", "capture", "Compositor", "decoder", "GeckoMain", "gmp", @@ -81,6 +84,7 @@ private val networking_features = arrayOf( "processcpu", "bandwidth", "ipcmessages", + "memory", ) private val networking_threads = arrayOf( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt index cd0bc2f758..def5cd4999 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/toolbar/ToolbarView.kt @@ -17,6 +17,7 @@ import mozilla.components.support.ktx.android.content.res.resolveAttribute import mozilla.components.support.ktx.android.view.hideKeyboard import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature import org.mozilla.fenix.ext.settings @@ -139,7 +140,7 @@ class ToolbarView( }, ) - if (settings.isTabletAndTabStripEnabled) { + if (context.isTabStripEnabled()) { (layoutParams as ViewGroup.MarginLayoutParams).updateMargins( top = context.resources.getDimensionPixelSize(R.dimen.tab_strip_height), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt index 9f5d6b6d05..642e4d4160 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/CustomizationFragment.kt @@ -19,6 +19,7 @@ import org.mozilla.fenix.GleanMetrics.AppTheme import org.mozilla.fenix.GleanMetrics.PullToRefreshInBrowser import org.mozilla.fenix.GleanMetrics.ToolbarSettings import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings @@ -53,7 +54,7 @@ class CustomizationFragment : PreferenceFragmentCompat() { bindLightTheme() bindAutoBatteryTheme() setupRadioGroups() - val tabletAndTabStripEnabled = requireContext().settings().isTabletAndTabStripEnabled + val tabletAndTabStripEnabled = requireContext().isTabStripEnabled() if (tabletAndTabStripEnabled) { val preferenceScreen: PreferenceScreen = requirePreference(R.string.pref_key_customization_preference_screen) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt index 9bba8fca3d..17427cda52 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/HomeSettingsFragment.kt @@ -84,14 +84,14 @@ class HomeSettingsFragment : PreferenceFragmentCompat() { } } - requirePreference<SwitchPreference>(R.string.pref_key_recent_bookmarks).apply { - isChecked = context.settings().showRecentBookmarksFeature + requirePreference<SwitchPreference>(R.string.pref_key_customization_bookmarks).apply { + isChecked = context.settings().showBookmarksHomeFeature onPreferenceChangeListener = object : SharedPreferenceUpdater() { override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { CustomizeHome.preferenceToggled.record( CustomizeHome.PreferenceToggledExtra( newValue as Boolean, - "recently_saved", + "bookmarks", ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt index 5a1f3c3a10..ea82f9f13b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PairFragment.kt @@ -16,6 +16,9 @@ import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import mozilla.components.feature.qr.QrFeature +import mozilla.components.service.fxa.manager.SCOPE_PROFILE +import mozilla.components.service.fxa.manager.SCOPE_SESSION +import mozilla.components.service.fxa.manager.SCOPE_SYNC import mozilla.components.support.base.feature.UserInteractionHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import org.mozilla.fenix.R @@ -54,6 +57,7 @@ class PairFragment : Fragment(R.layout.fragment_pair), UserInteractionHandler { requireContext(), pairingUrl, args.entrypoint, + setOf(SCOPE_SYNC, SCOPE_PROFILE, SCOPE_SESSION), ) val vibrator = requireContext().getSystemService<Vibrator>()!! if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 5101f10f28..c50cbe6a1c 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -18,6 +18,7 @@ import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R +import org.mozilla.fenix.browser.tabstrip.isTabStripEligible import org.mozilla.fenix.debugsettings.data.DefaultDebugSettingsRepository import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav @@ -142,7 +143,7 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { private fun setupTabStripPreference() { requirePreference<SwitchPreference>(R.string.pref_key_enable_tab_strip).apply { - isVisible = Config.channel.isNightlyOrDebug && context.resources.getBoolean(R.bool.tablet) + isVisible = context.isTabStripEligible() isChecked = context.settings().isTabStripEnabled onPreferenceChangeListener = SharedPreferenceUpdater() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index d392ba8697..b6d9e1ea78 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -47,6 +47,7 @@ import org.mozilla.fenix.GleanMetrics.Addons import org.mozilla.fenix.GleanMetrics.CookieBanners import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.GleanMetrics.TrackingProtection +import org.mozilla.fenix.GleanMetrics.Translations import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint @@ -158,6 +159,10 @@ class SettingsFragment : PreferenceFragmentCompat() { updateProfilerUI(it) }, ) + + findPreference<Preference>( + getPreferenceKey(R.string.pref_key_translation), + )?.isVisible = FxNimbus.features.translations.value().globalSettingsEnabled } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -315,6 +320,11 @@ class SettingsFragment : PreferenceFragmentCompat() { SettingsFragmentDirections.actionSettingsFragmentToLocaleSettingsFragment() } + resources.getString(R.string.pref_key_translation) -> { + Translations.action.record(Translations.ActionExtra("global_settings_from_preferences")) + SettingsFragmentDirections.actionSettingsFragmentToTranslationsSettingsFragment() + } + /* Privacy and security preferences */ resources.getString(R.string.pref_key_private_browsing) -> { SettingsFragmentDirections.actionSettingsFragmentToPrivateBrowsingFragment() diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt index da73fcc10e..9b0c7649ce 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -39,6 +39,11 @@ object SupportUtils { const val GOOGLE_XX_URL = "https://www.google.com/webhp?client=firefox-b-m&channel=ts" const val WHATS_NEW_URL = "https://www.mozilla.org/firefox/android/notes" + // This is locale-less on purpose so that the content negotiation happens on the AMO side because the current + // user language might not be supported by AMO and/or the language might not be exactly what AMO is expecting + // (e.g. `en` instead of `en-US`). + const val AMO_HOMEPAGE_FOR_ANDROID = "${BuildConfig.AMO_BASE_URL}/android/" + enum class SumoTopic(internal val topicStr: String) { HELP("faq-android"), PRIVATE_BROWSING_MYTHS("common-myths-about-private-browsing"), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt index b5a0886498..62f33c6ce3 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SyncDebugFragment.kt @@ -11,6 +11,7 @@ import androidx.preference.Preference import androidx.preference.Preference.OnPreferenceClickListener import androidx.preference.PreferenceFragmentCompat import org.mozilla.fenix.R +import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import kotlin.system.exitProcess @@ -59,6 +60,24 @@ class SyncDebugFragment : PreferenceFragmentCompat() { requirePreference<CheckBoxPreference>(R.string.pref_key_use_react_fxa).apply { onPreferenceChangeListener = SharedPreferenceUpdater() } + requirePreference<Preference>(R.string.pref_key_sync_debug_network_error).let { pref -> + pref.onPreferenceClickListener = OnPreferenceClickListener { + requireComponents.backgroundServices.accountManager.simulateNetworkError() + true + } + } + requirePreference<Preference>(R.string.pref_key_sync_debug_temporary_auth_error).let { pref -> + pref.onPreferenceClickListener = OnPreferenceClickListener { + requireComponents.backgroundServices.accountManager.simulateTemporaryAuthTokenIssue() + true + } + } + requirePreference<Preference>(R.string.pref_key_sync_debug_permanent_auth_error).let { pref -> + pref.onPreferenceClickListener = OnPreferenceClickListener { + requireComponents.backgroundServices.accountManager.simulatePermanentAuthTokenIssue() + true + } + } updateMenu() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/AccountProblemFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/AccountProblemFragment.kt index 9b82a91a88..6e39f105d4 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/AccountProblemFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/AccountProblemFragment.kt @@ -15,6 +15,8 @@ import kotlinx.coroutines.launch import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount +import mozilla.components.service.fxa.manager.SCOPE_PROFILE +import mozilla.components.service.fxa.manager.SCOPE_SYNC import mozilla.telemetry.glean.private.NoExtras import org.mozilla.fenix.GleanMetrics.SyncAuth import org.mozilla.fenix.R @@ -27,7 +29,11 @@ class AccountProblemFragment : PreferenceFragmentCompat(), AccountObserver { private val args by navArgs<AccountProblemFragmentArgs>() private val signInClickListener = Preference.OnPreferenceClickListener { - requireComponents.services.accountsAuthFeature.beginAuthentication(requireContext(), args.entrypoint) + requireComponents.services.accountsAuthFeature.beginAuthentication( + requireContext(), + args.entrypoint, + setOf(SCOPE_PROFILE, SCOPE_SYNC), + ) SyncAuth.useEmailProblem.record(NoExtras()) // TODO The sign-in web content populates session history, // so pressing "back" after signing in won't take us back into the settings screen, but rather up the diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt index ab03b079b7..a2e5f5b8e5 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt @@ -17,6 +17,8 @@ import androidx.navigation.fragment.navArgs import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount +import mozilla.components.service.fxa.manager.SCOPE_PROFILE +import mozilla.components.service.fxa.manager.SCOPE_SYNC import mozilla.components.support.ktx.android.content.hasCamera import mozilla.components.support.ktx.android.content.isPermissionGranted import mozilla.components.support.ktx.android.view.hideKeyboard @@ -184,6 +186,7 @@ class TurnOnSyncFragment : Fragment(), AccountObserver { requireComponents.services.accountsAuthFeature.beginAuthentication( requireContext(), entrypoint = args.entrypoint, + setOf(SCOPE_PROFILE, SCOPE_SYNC), ) SyncAuth.useEmail.record(NoExtras()) // TODO The sign-in web content populates session history, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricUtils.kt new file mode 100644 index 0000000000..db83dee4a1 --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/biometric/BiometricUtils.kt @@ -0,0 +1,110 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.settings.biometric + +import android.app.KeyguardManager +import android.content.DialogInterface +import android.content.Intent +import android.provider.Settings +import android.view.View +import androidx.appcompat.app.AlertDialog +import androidx.core.content.getSystemService +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.findFragment +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.ui.widgets.withCenterAlignedButtons +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.runIfFragmentIsAttached +import org.mozilla.fenix.ext.secure +import org.mozilla.fenix.ext.settings + +/** + * Prompts the biometric authentication before navigating to new fragment + * or displays warning dialog in case the feature is not available + */ +@Suppress("Deprecation") +fun bindBiometricsCredentialsPromptOrShowWarning( + view: View, + onShowPinVerification: (Intent) -> Unit, + onAuthSuccess: () -> Unit, + onAuthFailure: () -> Unit = {}, + doWhileAuthenticating: () -> Unit = {}, +) { + val (fragment, context) = Result.runCatching { + view.findFragment() as Fragment to view.context + }.getOrElse { return } + + val biometricPromptFeature = ViewBoundFeatureWrapper( + owner = fragment.viewLifecycleOwner, + view = view, + feature = BiometricPromptFeature( + context = context, + fragment = fragment, + onAuthSuccess = { + fragment.runIfFragmentIsAttached { + fragment.lifecycleScope.launch(Dispatchers.Main) { + onAuthSuccess() + } + } + }, + onAuthFailure = onAuthFailure, + ), + ) + // Use the BiometricPrompt first + if (BiometricPromptFeature.canUseFeature(context)) { + doWhileAuthenticating() + biometricPromptFeature.get() + ?.requestAuthentication(context.resources.getString(R.string.logins_biometric_prompt_message_2)) + return + } + + // Fallback to prompting for password with the KeyguardManager + val manager = context.getSystemService<KeyguardManager>() + if (manager?.isKeyguardSecure == true) { + val confirmDeviceCredentialIntent = manager.createConfirmDeviceCredentialIntent( + context.resources.getString(R.string.logins_biometric_prompt_message_pin), + context.resources.getString(R.string.logins_biometric_prompt_message), + ) + onShowPinVerification(confirmDeviceCredentialIntent) + } else { + // Warn that the device has not been secured + if (context.settings().shouldShowSecurityPinWarning) { + fragment.activity?.let { + showPinDialogWarning(it, onAuthSuccess) + } ?: return + } else { + onAuthSuccess() + } + } +} + +@Suppress("MaxLineLength") +private fun showPinDialogWarning( + activity: FragmentActivity, + onIgnorePinWarning: () -> Unit, +) { + AlertDialog.Builder(activity).apply { + setTitle(context.resources.getString(R.string.logins_warning_dialog_title_2)) + setMessage( + context.resources.getString(R.string.logins_warning_dialog_message_2), + ) + + setNegativeButton(context.resources.getString(R.string.logins_warning_dialog_later)) { _: DialogInterface, _ -> + onIgnorePinWarning() + } + + setPositiveButton(context.resources.getString(R.string.logins_warning_dialog_set_up_now)) { it: DialogInterface, _ -> + it.dismiss() + val intent = Intent(Settings.ACTION_SECURITY_SETTINGS) + context.startActivity(intent) + } + create().withCenterAlignedButtons() + }.show().secure(activity) + activity.settings().incrementSecureWarningCount() +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt index f59b6a1f87..b2501cab3f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/view/CreditCardEditorView.kt @@ -62,12 +62,12 @@ class CreditCardEditorView( binding.cardNumberLayout.setErrorTextColor( ColorStateList.valueOf( - binding.root.context.getColorFromAttr(R.attr.textWarning), + binding.root.context.getColorFromAttr(R.attr.textCritical), ), ) binding.nameOnCardLayout.setErrorTextColor( ColorStateList.valueOf( - binding.root.context.getColorFromAttr(R.attr.textWarning), + binding.root.context.getColorFromAttr(R.attr.textCritical), ), ) @@ -128,7 +128,7 @@ class CreditCardEditorView( binding.cardNumberLayout.error = binding.root.context.getString(R.string.credit_cards_number_validation_error_message_2) - binding.cardNumberTitle.setTextColor(binding.root.context.getColorFromAttr(R.attr.textWarning)) + binding.cardNumberTitle.setTextColor(binding.root.context.getColorFromAttr(R.attr.textCritical)) } if (binding.nameOnCardInput.text.toString().isNotBlank()) { @@ -139,7 +139,7 @@ class CreditCardEditorView( binding.nameOnCardLayout.error = binding.root.context.getString(R.string.credit_cards_name_on_card_validation_error_message_2) - binding.nameOnCardTitle.setTextColor(binding.root.context.getColorFromAttr(R.attr.textWarning)) + binding.nameOnCardTitle.setTextColor(binding.root.context.getColorFromAttr(R.attr.textCritical)) } return isValid diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt index e1cadea39c..5a85e34302 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/AddLoginFragment.kt @@ -281,7 +281,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login), MenuProvider { ColorStateList.valueOf( ContextCompat.getColor( requireContext(), - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ), ) @@ -295,7 +295,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login), MenuProvider { ColorStateList.valueOf( ContextCompat.getColor( requireContext(), - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ), ) @@ -319,7 +319,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login), MenuProvider { layout.setErrorIconDrawable(R.drawable.mozac_ic_warning_with_bottom_padding) layout.setErrorIconTintList( ColorStateList.valueOf( - ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_warning), + ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_critical), ), ) } @@ -332,7 +332,7 @@ class AddLoginFragment : Fragment(R.layout.fragment_add_login), MenuProvider { layout.setErrorIconDrawable(R.drawable.mozac_ic_warning_with_bottom_padding) layout.setErrorIconTintList( ColorStateList.valueOf( - ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_warning), + ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_critical), ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt index 59b210ae36..5310536b77 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/EditLoginFragment.kt @@ -273,7 +273,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login), MenuProvider { ColorStateList.valueOf( ContextCompat.getColor( requireContext(), - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ), ) @@ -290,7 +290,7 @@ class EditLoginFragment : Fragment(R.layout.fragment_edit_login), MenuProvider { layout.setErrorIconDrawable(R.drawable.mozac_ic_warning_with_bottom_padding) layout.setErrorIconTintList( ColorStateList.valueOf( - ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_warning), + ContextCompat.getColor(requireContext(), R.color.fx_mobile_text_color_critical), ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt index 5b7c0c2d71..f492e70bad 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsAuthFragment.kt @@ -4,29 +4,16 @@ package org.mozilla.fenix.settings.logins.fragment -import android.app.KeyguardManager -import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.os.Bundle -import android.provider.Settings.ACTION_SECURITY_SETTINGS -import android.view.View import androidx.activity.result.ActivityResultLauncher -import androidx.appcompat.app.AlertDialog -import androidx.core.content.getSystemService -import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreference -import kotlinx.coroutines.Dispatchers.Main -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import mozilla.components.feature.autofill.preference.AutofillPreference import mozilla.components.service.fxa.SyncEngine import mozilla.components.service.glean.private.NoExtras -import mozilla.components.support.base.feature.ViewBoundFeatureWrapper -import mozilla.components.ui.widgets.withCenterAlignedButtons import org.mozilla.fenix.GleanMetrics.Logins import org.mozilla.fenix.R import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint @@ -34,24 +21,20 @@ import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.navigateWithBreadcrumb import org.mozilla.fenix.ext.registerForActivityResult import org.mozilla.fenix.ext.requireComponents -import org.mozilla.fenix.ext.runIfFragmentIsAttached -import org.mozilla.fenix.ext.secure import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.settings.SharedPreferenceUpdater import org.mozilla.fenix.settings.SyncPreferenceView -import org.mozilla.fenix.settings.biometric.BiometricPromptFeature +import org.mozilla.fenix.settings.biometric.bindBiometricsCredentialsPromptOrShowWarning import org.mozilla.fenix.settings.requirePreference @Suppress("TooManyFunctions") class SavedLoginsAuthFragment : PreferenceFragmentCompat() { - private val biometricPromptFeature = ViewBoundFeatureWrapper<BiometricPromptFeature>() - private lateinit var startForResult: ActivityResultLauncher<Intent> + private lateinit var savedLoginsFragmentLauncher: ActivityResultLauncher<Intent> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - - startForResult = registerForActivityResult { + savedLoginsFragmentLauncher = registerForActivityResult { navigateToSavedLoginsFragment() } } @@ -71,32 +54,7 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { requirePreference<Preference>(R.string.pref_key_saved_logins).isEnabled = enabled } - private fun navigateToSavedLogins() { - runIfFragmentIsAttached { - viewLifecycleOwner.lifecycleScope.launch(Main) { - // Workaround for likely biometric library bug - // https://github.com/mozilla-mobile/fenix/issues/8438 - delay(SHORT_DELAY_MS) - navigateToSavedLoginsFragment() - } - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - biometricPromptFeature.set( - feature = BiometricPromptFeature( - context = requireContext(), - fragment = this, - onAuthFailure = { togglePrefsEnabledWhileAuthenticating(true) }, - onAuthSuccess = ::navigateToSavedLogins, - ), - owner = this, - view = view, - ) - } - + @Suppress("LongMethod") override fun onResume() { super.onResume() showToolbar(getString(R.string.preferences_passwords_logins_and_passwords)) @@ -146,7 +104,17 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { } requirePreference<Preference>(R.string.pref_key_saved_logins).setOnPreferenceClickListener { - verifyCredentialsOrShowSetupWarning(it.context) + view?.let { view -> + bindBiometricsCredentialsPromptOrShowWarning( + view = view, + onShowPinVerification = { intent -> + savedLoginsFragmentLauncher.launch(intent) + }, + onAuthSuccess = ::navigateToSavedLoginsFragment, + onAuthFailure = { togglePrefsEnabledWhileAuthenticating(true) }, + doWhileAuthenticating = { togglePrefsEnabledWhileAuthenticating(false) }, + ) + } true } @@ -178,60 +146,6 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { togglePrefsEnabledWhileAuthenticating(true) } - private fun verifyCredentialsOrShowSetupWarning(context: Context) { - // Use the BiometricPrompt first - if (BiometricPromptFeature.canUseFeature(context)) { - togglePrefsEnabledWhileAuthenticating(false) - biometricPromptFeature.get() - ?.requestAuthentication(getString(R.string.logins_biometric_prompt_message_2)) - return - } - - // Fallback to prompting for password with the KeyguardManager - val manager = context.getSystemService<KeyguardManager>() - if (manager?.isKeyguardSecure == true) { - showPinVerification(manager) - } else { - // Warn that the device has not been secured - if (context.settings().shouldShowSecurityPinWarning) { - showPinDialogWarning(context) - } else { - navigateToSavedLoginsFragment() - } - } - } - - private fun showPinDialogWarning(context: Context) { - AlertDialog.Builder(context).apply { - setTitle(getString(R.string.logins_warning_dialog_title_2)) - setMessage( - getString(R.string.logins_warning_dialog_message_2), - ) - - setNegativeButton(getString(R.string.logins_warning_dialog_later)) { _: DialogInterface, _ -> - navigateToSavedLoginsFragment() - } - - setPositiveButton(getString(R.string.logins_warning_dialog_set_up_now)) { it: DialogInterface, _ -> - it.dismiss() - val intent = Intent(ACTION_SECURITY_SETTINGS) - startActivity(intent) - } - create().withCenterAlignedButtons() - }.show().secure(activity) - context.settings().incrementSecureWarningCount() - } - - @Suppress("Deprecation") - private fun showPinVerification(manager: KeyguardManager) { - val intent = manager.createConfirmDeviceCredentialIntent( - getString(R.string.logins_biometric_prompt_message_pin), - getString(R.string.logins_biometric_prompt_message), - ) - - startForResult.launch(intent) - } - /** * Called when authentication succeeds. */ @@ -260,9 +174,4 @@ class SavedLoginsAuthFragment : PreferenceFragmentCompat() { SavedLoginsAuthFragmentDirections.actionSavedLoginsAuthFragmentToLoginExceptionsFragment() findNavController().navigate(directions) } - - companion object { - const val SHORT_DELAY_MS = 100L - const val PIN_REQUEST = 303 - } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineMenu.kt index d28867513b..cb1b17788f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineMenu.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineMenu.kt @@ -40,7 +40,7 @@ class SearchEngineMenu( items.add( SimpleBrowserMenuItem( context.getString(R.string.search_engine_delete), - textColorResource = ThemeManager.resolveAttribute(R.attr.textWarning, context), + textColorResource = ThemeManager.resolveAttribute(R.attr.textCritical, context), ) { onItemTapped.invoke(Item.Delete) }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineShortcuts.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineShortcuts.kt index 46ca337e42..04d4d90dde 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineShortcuts.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineShortcuts.kt @@ -198,13 +198,13 @@ private fun SearchItem( menuItems = listOf( MenuItem( stringResource(R.string.search_engine_edit), - color = FirefoxTheme.colors.textWarning, + color = FirefoxTheme.colors.textCritical, ) { onEditEngineClicked(engine) }, MenuItem( stringResource(R.string.search_engine_delete), - color = FirefoxTheme.colors.textWarning, + color = FirefoxTheme.colors.textCritical, ) { onDeleteEngineClicked(engine) }, @@ -268,7 +268,7 @@ private fun SearchEngineShortcutsPreview() { initialState = BrowserState( search = SearchState( regionSearchEngines = generateFakeEnginesList(), - disabledSearchEngineIds = listOf("8", "9"), + disabledSearchEngineIds = listOf("7", "8"), ), ), ), @@ -288,13 +288,12 @@ private fun generateFakeEnginesList(): List<SearchEngine> { generateFakeEngines("1", "Google"), generateFakeEngines("2", "Bing"), generateFakeEngines("3", "Bing"), - generateFakeEngines("4", "Amazon.com"), - generateFakeEngines("5", "DuckDuckGo"), - generateFakeEngines("6", "Qwant"), - generateFakeEngines("7", "eBay"), - generateFakeEngines("8", "Reddit"), - generateFakeEngines("9", "YouTube"), - generateFakeEngines("10", "Yandex", SearchEngine.Type.CUSTOM), + generateFakeEngines("4", "DuckDuckGo"), + generateFakeEngines("5", "Qwant"), + generateFakeEngines("6", "eBay"), + generateFakeEngines("7", "Reddit"), + generateFakeEngines("8", "YouTube"), + generateFakeEngines("9", "Yandex", SearchEngine.Type.CUSTOM), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt index 25f28887f4..3e9593851b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -16,6 +16,7 @@ import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.TabSessionState import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext +import org.mozilla.experiments.nimbus.NimbusEventStore import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R import org.mozilla.fenix.browser.StandardSnackbarError @@ -35,10 +36,12 @@ import java.io.IOException * * @param context An Application context. * @param mainScope Coroutine scope to launch coroutines. + * @param nimbusEventStore Nimbus event store for recording events. */ class SaveToPDFMiddleware( private val context: Context, private val mainScope: CoroutineScope = CoroutineScope(Dispatchers.Main), + private val nimbusEventStore: NimbusEventStore = context.components.nimbus.events, ) : Middleware<BrowserState, BrowserAction> { override fun invoke( @@ -151,6 +154,7 @@ class SaveToPDFMiddleware( source = telemetrySource(isPdf), ), ) + nimbusEventStore.recordEvent("print_tapped") } else { Events.saveToPdfTapped.record( Events.SaveToPdfTappedExtra( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt index 3fbb9b8d5a..5c033066c7 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shopping/ui/ReviewQualityCheckInfoCard.kt @@ -40,19 +40,20 @@ import org.mozilla.fenix.theme.FirefoxTheme /** * Review Quality Check Info Card UI. * + * @param modifier Modifier to be applied to the card. * @param title The primary text of the info message. * @param type The [ReviewQualityCheckInfoType] of message to display. - * @param modifier Modifier to be applied to the card. * @param verticalRowAlignment An optional adjustment of how the row of text aligns. * @param description The optional secondary piece of text. * @param footer An optional piece of text with a clickable link. * @param buttonText The text to show in the optional button. */ +@Suppress("LongMethod") @Composable fun ReviewQualityCheckInfoCard( - title: String, - type: ReviewQualityCheckInfoType, modifier: Modifier = Modifier, + title: String? = null, + type: ReviewQualityCheckInfoType, verticalRowAlignment: Alignment.Vertical = Alignment.Top, description: String? = null, footer: Pair<String, LinkTextState>? = null, @@ -67,7 +68,7 @@ fun ReviewQualityCheckInfoCard( ), elevation = 0.dp, ) { - val titleContentDescription = headingResource(title) + val titleContentDescription = title?.let { headingResource(it) } Row( verticalAlignment = verticalRowAlignment, @@ -81,7 +82,10 @@ fun ReviewQualityCheckInfoCard( InfoCardIcon(iconId = R.drawable.mozac_ic_checkmark_24) } - ReviewQualityCheckInfoType.Error, + ReviewQualityCheckInfoType.Error -> { + InfoCardIcon(iconId = R.drawable.mozac_ic_critical_fill_24) + } + ReviewQualityCheckInfoType.Info, ReviewQualityCheckInfoType.AnalysisUpdate, -> { @@ -92,18 +96,22 @@ fun ReviewQualityCheckInfoCard( Spacer(modifier = Modifier.width(12.dp)) Column { - Text( - text = title, - color = FirefoxTheme.colors.textPrimary, - style = FirefoxTheme.typography.headline8, - modifier = Modifier.semantics { - heading() - contentDescription = titleContentDescription - }, - ) + title?.let { + Text( + text = it, + color = FirefoxTheme.colors.textPrimary, + style = FirefoxTheme.typography.headline8, + modifier = Modifier.semantics { + heading() + if (titleContentDescription != null) { + contentDescription = titleContentDescription + } + }, + ) + } description?.let { - Spacer(modifier = Modifier.height(4.dp)) + title?.let { Spacer(modifier = Modifier.height(4.dp)) } Text( text = description, @@ -170,9 +178,9 @@ enum class ReviewQualityCheckInfoType { @Composable get() = when (this) { Warning -> FirefoxTheme.colors.layerWarning - Confirmation -> FirefoxTheme.colors.layerConfirmation - Error -> FirefoxTheme.colors.layerError - Info -> FirefoxTheme.colors.layerInfo + Confirmation -> FirefoxTheme.colors.layerSuccess + Error -> FirefoxTheme.colors.layerCritical + Info -> FirefoxTheme.colors.layerInformation AnalysisUpdate -> Color.Transparent } @@ -180,9 +188,9 @@ enum class ReviewQualityCheckInfoType { @Composable get() = when (this) { Warning -> FirefoxTheme.colors.actionWarning - Confirmation -> FirefoxTheme.colors.actionConfirmation - Error -> FirefoxTheme.colors.actionError - Info -> FirefoxTheme.colors.actionInfo + Confirmation -> FirefoxTheme.colors.actionSuccess + Error -> FirefoxTheme.colors.actionCritical + Info -> FirefoxTheme.colors.actionInformation AnalysisUpdate -> FirefoxTheme.colors.actionSecondary } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsController.kt index 27336f6343..58b0042c64 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsController.kt @@ -16,4 +16,9 @@ interface SyncedTabsController { * @param tab The synced [Tab] that was clicked. */ fun handleSyncedTabClicked(tab: Tab) + + /** + * Handles a click on the "close" button for a synced tab. + */ + fun handleSyncedTabClosed(deviceId: String, tab: Tab) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsInteractor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsInteractor.kt index 153a0f48d7..f37655bcac 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsInteractor.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/SyncedTabsInteractor.kt @@ -16,4 +16,9 @@ interface SyncedTabsInteractor { * @param tab The synced [Tab] that was clicked. */ fun onSyncedTabClicked(tab: Tab) + + /** + * Invoked when the user closes a synced [Tab]. + */ + fun onSyncedTabClosed(deviceId: String, tab: Tab) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt index 65909b5261..533a6454df 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTray.kt @@ -48,6 +48,8 @@ import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsList import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListItem import org.mozilla.fenix.theme.FirefoxTheme import mozilla.components.browser.storage.sync.Tab as SyncTab +import org.mozilla.fenix.tabstray.syncedtabs.OnTabClick as OnSyncedTabClick +import org.mozilla.fenix.tabstray.syncedtabs.OnTabCloseClick as OnSyncedTabClose /** * Top-level UI for displaying the Tabs Tray feature. @@ -75,6 +77,7 @@ import mozilla.components.browser.storage.sync.Tab as SyncTab * @param onInactiveTabClick Invoked when the user clicks on an inactive tab. * @param onInactiveTabClose Invoked when the user clicks on an inactive tab's close button. * @param onSyncedTabClick Invoked when the user clicks on a synced tab. + * @param onSyncedTabClose Invoked when the user clicks on a synced tab's close button. * @param onSaveToCollectionClick Invoked when the user clicks on the save to collection button from * the multi select banner. * @param onShareSelectedTabsClick Invoked when the user clicks on the share button from the @@ -92,6 +95,10 @@ import mozilla.components.browser.storage.sync.Tab as SyncTab * @param onTabAutoCloseBannerDismiss Invoked when the user clicks to dismiss the auto close banner. * @param onTabAutoCloseBannerShown Invoked when the auto close banner has been shown to the user. * @param onMove Invoked after the drag and drop gesture completed. Swaps positions of two tabs. + * @param shouldShowInactiveTabsCFR Returns whether the inactive tabs CFR should be displayed. + * @param onInactiveTabsCFRShown Invoked when the inactive tabs CFR is displayed. + * @param onInactiveTabsCFRClick Invoked when the inactive tabs CFR is clicked. + * @param onInactiveTabsCFRDismiss Invoked when the inactive tabs CFR is dismissed. */ @OptIn(ExperimentalFoundationApi::class) @Suppress("LongMethod", "LongParameterList", "ComplexMethod") @@ -116,7 +123,8 @@ fun TabsTray( onEnableInactiveTabAutoCloseClick: () -> Unit, onInactiveTabClick: (TabSessionState) -> Unit, onInactiveTabClose: (TabSessionState) -> Unit, - onSyncedTabClick: (SyncTab) -> Unit, + onSyncedTabClick: OnSyncedTabClick, + onSyncedTabClose: OnSyncedTabClose, onSaveToCollectionClick: () -> Unit, onShareSelectedTabsClick: () -> Unit, onShareAllTabsClick: () -> Unit, @@ -132,6 +140,10 @@ fun TabsTray( onTabAutoCloseBannerDismiss: () -> Unit, onTabAutoCloseBannerShown: () -> Unit, onMove: (String, String?, Boolean) -> Unit, + shouldShowInactiveTabsCFR: () -> Boolean, + onInactiveTabsCFRShown: () -> Unit, + onInactiveTabsCFRClick: () -> Unit, + onInactiveTabsCFRDismiss: () -> Unit, ) { val multiselectMode = tabsTrayStore .observeAsComposableState { state -> state.mode }.value ?: TabsTrayState.Mode.Normal @@ -210,6 +222,10 @@ fun TabsTray( onInactiveTabClick = onInactiveTabClick, onInactiveTabClose = onInactiveTabClose, onMove = onMove, + shouldShowInactiveTabsCFR = shouldShowInactiveTabsCFR, + onInactiveTabsCFRShown = onInactiveTabsCFRShown, + onInactiveTabsCFRClick = onInactiveTabsCFRClick, + onInactiveTabsCFRDismiss = onInactiveTabsCFRDismiss, ) } @@ -230,6 +246,7 @@ fun TabsTray( SyncedTabsPage( tabsTrayStore = tabsTrayStore, onTabClick = onSyncedTabClick, + onTabClose = onSyncedTabClose, ) } } @@ -258,6 +275,10 @@ private fun NormalTabsPage( onInactiveTabClick: (TabSessionState) -> Unit, onInactiveTabClose: (TabSessionState) -> Unit, onMove: (String, String?, Boolean) -> Unit, + shouldShowInactiveTabsCFR: () -> Boolean, + onInactiveTabsCFRShown: () -> Unit, + onInactiveTabsCFRClick: () -> Unit, + onInactiveTabsCFRDismiss: () -> Unit, ) { val inactiveTabsExpanded = appStore .observeAsComposableState { state -> state.inactiveTabsExpanded }.value ?: false @@ -283,6 +304,7 @@ private fun NormalTabsPage( inactiveTabs = inactiveTabs, expanded = inactiveTabsExpanded, showAutoCloseDialog = showAutoCloseDialog, + showCFR = shouldShowInactiveTabsCFR(), onHeaderClick = onInactiveTabsHeaderClick, onDeleteAllButtonClick = onDeleteAllInactiveTabsClick, onAutoCloseDismissClick = { @@ -295,6 +317,9 @@ private fun NormalTabsPage( }, onTabClick = onInactiveTabClick, onTabCloseClick = onInactiveTabClose, + onCFRShown = onInactiveTabsCFRShown, + onCFRClick = onInactiveTabsCFRClick, + onCFRDismiss = onInactiveTabsCFRDismiss, ) } } @@ -366,7 +391,8 @@ private fun PrivateTabsPage( @Composable private fun SyncedTabsPage( tabsTrayStore: TabsTrayStore, - onTabClick: (SyncTab) -> Unit, + onTabClick: OnSyncedTabClick, + onTabClose: OnSyncedTabClose, ) { val syncedTabs = tabsTrayStore .observeAsComposableState { state -> state.syncedTabs }.value ?: emptyList() @@ -374,6 +400,7 @@ private fun SyncedTabsPage( SyncedTabsList( syncedTabs = syncedTabs, onTabClick = onTabClick, + onTabCloseClick = onTabClose, ) } @@ -565,6 +592,7 @@ private fun TabsTrayPreviewRoot( onInactiveTabClick = {}, onInactiveTabClose = inactiveTabsState::remove, onSyncedTabClick = {}, + onSyncedTabClose = { _, _ -> }, onSaveToCollectionClick = {}, onShareSelectedTabsClick = {}, onShareAllTabsClick = {}, @@ -580,6 +608,10 @@ private fun TabsTrayPreviewRoot( onTabAutoCloseBannerDismiss = {}, onTabAutoCloseBannerShown = {}, onMove = { _, _, _ -> }, + shouldShowInactiveTabsCFR = { false }, + onInactiveTabsCFRShown = {}, + onInactiveTabsCFRClick = {}, + onInactiveTabsCFRDismiss = {}, ) } } @@ -607,10 +639,15 @@ private fun generateFakeSyncedTabsList(deviceCount: Int = 1): List<SyncedTabsLis ) } -private fun generateFakeSyncedTab(tabName: String, tabUrl: String): SyncedTabsListItem.Tab = +private fun generateFakeSyncedTab( + tabName: String, + tabUrl: String, + action: SyncedTabsListItem.Tab.Action = SyncedTabsListItem.Tab.Action.None, +): SyncedTabsListItem.Tab = SyncedTabsListItem.Tab( tabName.ifEmpty { tabUrl }, tabUrl, + action, SyncTab( history = listOf(TabEntry(tabName, tabUrl, null)), active = 0, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt index a48e1d622f..51e23f4b3a 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayController.kt @@ -21,6 +21,7 @@ import mozilla.components.browser.storage.sync.Tab import mozilla.components.concept.base.profiler.Profiler import mozilla.components.concept.engine.mediasession.MediaSession.PlaybackState import mozilla.components.concept.engine.prompt.ShareData +import mozilla.components.feature.accounts.push.CloseTabsUseCases import mozilla.components.feature.downloads.ui.DownloadCancelDialogFragment import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.lib.state.DelicateAction @@ -185,7 +186,8 @@ interface TabsTrayController : SyncedTabsController, InactiveTabsController, Tab * @param navigationInteractor [NavigationInteractor] used to perform navigation actions with side effects. * @param tabsUseCases Use case wrapper for interacting with tabs. * @param bookmarksUseCase Use case wrapper for interacting with bookmarks. - * @param ioDispatcher [CoroutineContext] used to handle saving tabs as bookmarks. + * @param closeSyncedTabsUseCases Use cases for closing synced tabs. + * @param ioDispatcher [CoroutineContext] used for storage and network operations. * @param collectionStorage Storage layer for interacting with collections. * @param selectTabPosition Lambda used to scroll the tabs tray to the desired position. * @param dismissTray Lambda used to dismiss/minimize the tabs tray. @@ -210,6 +212,7 @@ class DefaultTabsTrayController( private val navigationInteractor: NavigationInteractor, private val tabsUseCases: TabsUseCases, private val bookmarksUseCase: BookmarksUseCase, + private val closeSyncedTabsUseCases: CloseTabsUseCases, private val ioDispatcher: CoroutineContext, private val collectionStorage: TabCollectionStorage, private val selectTabPosition: (Int, Boolean) -> Unit, @@ -520,6 +523,12 @@ class DefaultTabsTrayController( ) } + override fun handleSyncedTabClosed(deviceId: String, tab: Tab) { + CoroutineScope(ioDispatcher).launch { + closeSyncedTabsUseCases.close(deviceId, tab.active().url) + } + } + override fun handleTabLongClick(tab: TabSessionState): Boolean { return if (tab.isNormalTab() && tabsTrayStore.state.mode.selectedTabs.isEmpty()) { Collections.longPress.record(NoExtras()) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt index fded1b9494..9086708892 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayFragment.kt @@ -30,6 +30,7 @@ import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.selector.privateTabs import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.base.crash.Breadcrumb +import mozilla.components.feature.accounts.push.CloseTabsUseCases import mozilla.components.feature.downloads.ui.DownloadCancelDialogFragment import mozilla.components.feature.tabs.tabstray.TabsFeature import mozilla.components.support.base.feature.ViewBoundFeatureWrapper @@ -181,6 +182,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { navigationInteractor = navigationInteractor, profiler = requireComponents.core.engine.profiler, tabsUseCases = requireComponents.useCases.tabsUseCases, + closeSyncedTabsUseCases = CloseTabsUseCases(requireComponents.backgroundServices.accountManager), bookmarksUseCase = requireComponents.useCases.bookmarksUseCases, ioDispatcher = Dispatchers.IO, collectionStorage = requireComponents.core.tabCollectionStorage, @@ -275,6 +277,7 @@ class TabsTrayFragment : AppCompatDialogFragment() { onInactiveTabClick = tabsTrayInteractor::onInactiveTabClicked, onInactiveTabClose = tabsTrayInteractor::onInactiveTabClosed, onSyncedTabClick = tabsTrayInteractor::onSyncedTabClicked, + onSyncedTabClose = tabsTrayInteractor::onSyncedTabClosed, onSaveToCollectionClick = tabsTrayInteractor::onAddSelectedTabsToCollectionClicked, onShareSelectedTabsClick = tabsTrayInteractor::onShareSelectedTabs, onShareAllTabsClick = { @@ -307,6 +310,23 @@ class TabsTrayFragment : AppCompatDialogFragment() { requireContext().settings().lastCfrShownTimeInMillis = System.currentTimeMillis() }, onMove = tabsTrayInteractor::onTabsMove, + shouldShowInactiveTabsCFR = { + requireContext().settings().shouldShowInactiveTabsOnboardingPopup && + requireContext().settings().canShowCfr + }, + onInactiveTabsCFRShown = { + TabsTray.inactiveTabsCfrVisible.record(NoExtras()) + }, + onInactiveTabsCFRClick = { + requireContext().settings().shouldShowInactiveTabsOnboardingPopup = false + navigationInteractor.onTabSettingsClicked() + TabsTray.inactiveTabsCfrSettings.record(NoExtras()) + onTabsTrayDismissed() + }, + onInactiveTabsCFRDismiss = { + requireContext().settings().shouldShowInactiveTabsOnboardingPopup = false + TabsTray.inactiveTabsCfrDismissed.record(NoExtras()) + }, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt index b9f8bb5473..e29aafc793 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/TabsTrayInteractor.kt @@ -157,6 +157,10 @@ class DefaultTabsTrayInteractor( controller.handleSyncedTabClicked(tab) } + override fun onSyncedTabClosed(deviceId: String, tab: Tab) { + controller.handleSyncedTabClosed(deviceId, tab) + } + override fun onBackPressed(): Boolean = controller.handleBackPressed() override fun onTabClosed(tab: TabSessionState, source: String?) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt index 6980806179..945cacd5be 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/InactiveTabViewHolder.kt @@ -60,6 +60,7 @@ class InactiveTabViewHolder( inactiveTabs = inactiveTabs, expanded = expanded, showAutoCloseDialog = showAutoClosePrompt, + showCFR = false, // The CFR in XML is handled by [TabsTrayInactiveTabsOnboardingBinding] onHeaderClick = { interactor.onInactiveTabsHeaderClicked(!expanded) }, onDeleteAllButtonClick = interactor::onDeleteAllInactiveTabsClicked, onAutoCloseDismissClick = { @@ -73,6 +74,9 @@ class InactiveTabViewHolder( }, onTabClick = interactor::onInactiveTabClicked, onTabCloseClick = interactor::onInactiveTabClosed, + onCFRShown = {}, + onCFRClick = {}, + onCFRDismiss = {}, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/TabsTouchHelper.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/TabsTouchHelper.kt index b9d762f2f9..37ac921e0f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/TabsTouchHelper.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/browser/TabsTouchHelper.kt @@ -92,7 +92,7 @@ class TouchCallback( val icon = recyclerView.context.getDrawableWithTint( R.drawable.ic_delete, - recyclerView.context.getColorFromAttr(R.attr.textWarning), + recyclerView.context.getColorFromAttr(R.attr.textCritical), )!! val background = AppCompatResources.getDrawable( recyclerView.context, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt index 39462fa9b0..c8654eac3f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/ext/SyncedDeviceTabs.kt @@ -5,22 +5,41 @@ package org.mozilla.fenix.tabstray.ext import mozilla.components.browser.storage.sync.SyncedDeviceTabs +import mozilla.components.concept.sync.DeviceCapability import mozilla.components.support.ktx.kotlin.trimmed import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListItem +import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListSupportedFeature /** * Converts a list of [SyncedDeviceTabs] into a list of [SyncedTabsListItem]. + * + * @param features Supported [SyncedTabsListSupportedFeature]s. */ -fun List<SyncedDeviceTabs>.toComposeList(): List<SyncedTabsListItem> = asSequence().flatMap { (device, tabs) -> - val deviceTabs = if (tabs.isEmpty()) { - emptyList() - } else { - tabs.map { - val url = it.active().url - val titleText = it.active().title.ifEmpty { url.trimmed() } - SyncedTabsListItem.Tab(titleText, url, it) +fun List<SyncedDeviceTabs>.toComposeList( + features: Set<SyncedTabsListSupportedFeature> = emptySet(), +): List<SyncedTabsListItem> = + asSequence().flatMap { (device, tabs) -> + val deviceTabs = if (tabs.isEmpty()) { + emptyList() + } else { + tabs.map { + val url = it.active().url + val titleText = it.active().title.ifEmpty { url.trimmed() } + SyncedTabsListItem.Tab( + displayTitle = titleText, + displayURL = url, + action = if ( + features.contains(SyncedTabsListSupportedFeature.CLOSE_TABS) && + device.capabilities.contains(DeviceCapability.CLOSE_TABS) + ) { + SyncedTabsListItem.Tab.Action.Close(deviceId = device.id) + } else { + SyncedTabsListItem.Tab.Action.None + }, + tab = it, + ) + } } - } - sequenceOf(SyncedTabsListItem.DeviceSection(device.displayName, deviceTabs)) -}.toList() + sequenceOf(SyncedTabsListItem.DeviceSection(device.displayName, deviceTabs)) + }.toList() diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt index 27ad2c1b6c..0fbe3941f8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/inactivetabs/InactiveTabs.kt @@ -6,9 +6,9 @@ package org.mozilla.fenix.tabstray.inactivetabs -import android.content.res.Configuration import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -31,14 +31,19 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import mozilla.components.browser.state.state.ContentState import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.compose.cfr.CFRPopup +import mozilla.components.compose.cfr.CFRPopupLayout +import mozilla.components.compose.cfr.CFRPopupProperties import org.mozilla.fenix.R +import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.button.TextButton import org.mozilla.fenix.compose.list.ExpandableListHeader import org.mozilla.fenix.compose.list.FaviconListItem @@ -54,12 +59,16 @@ private val ROUNDED_CORNER_SHAPE = RoundedCornerShape(8.dp) * @param inactiveTabs List of [TabSessionState] to display. * @param expanded Whether to show the inactive tabs section expanded or collapsed. * @param showAutoCloseDialog Whether to show the auto close inactive tabs dialog. + * @param showCFR Whether to show the CFR. * @param onHeaderClick Called when the user clicks on the inactive tabs section header. * @param onDeleteAllButtonClick Called when the user clicks on the delete all inactive tabs button. * @param onAutoCloseDismissClick Called when the user clicks on the auto close dialog's dismiss button. * @param onEnableAutoCloseClick Called when the user clicks on the auto close dialog's enable button. * @param onTabClick Called when the user clicks on a specific inactive tab. * @param onTabCloseClick Called when the user clicks on a specific inactive tab's close button. + * @param onCFRShown Invoked when the CFR is displayed. + * @param onCFRClick Invoked when the CFR is clicked. + * @param onCFRDismiss Invoked when the CFR is dismissed. */ @Composable @Suppress("LongParameterList") @@ -67,12 +76,16 @@ fun InactiveTabsList( inactiveTabs: List<TabSessionState>, expanded: Boolean, showAutoCloseDialog: Boolean, + showCFR: Boolean, onHeaderClick: (Boolean) -> Unit, onDeleteAllButtonClick: () -> Unit, onAutoCloseDismissClick: () -> Unit, onEnableAutoCloseClick: () -> Unit, onTabClick: (TabSessionState) -> Unit, onTabCloseClick: (TabSessionState) -> Unit, + onCFRShown: () -> Unit, + onCFRClick: () -> Unit, + onCFRDismiss: () -> Unit, ) { Card( modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp), @@ -88,6 +101,10 @@ fun InactiveTabsList( ) { InactiveTabsHeader( expanded = expanded, + showCFR = showCFR, + onCFRShown = onCFRShown, + onCFRClick = onCFRClick, + onCFRDismiss = onCFRDismiss, onClick = { onHeaderClick(!expanded) }, onDeleteAllClick = onDeleteAllButtonClick, ) @@ -128,35 +145,84 @@ fun InactiveTabsList( } /** - * Collapsible header for the Inactive Tabs section. + * Collapsible header for the Inactive Tabs section with a CFR. * * @param expanded Whether the section is expanded. + * @param showCFR Whether to show the CFR. * @param onClick Called when the user clicks on the header. * @param onDeleteAllClick Called when the user clicks on the delete all button. + * @param onCFRShown Invoked when the CFR is displayed. + * @param onCFRClick Invoked when the CFR is clicked. + * @param onCFRDismiss Invoked when the CFR is dismissed. */ @Composable private fun InactiveTabsHeader( expanded: Boolean, + showCFR: Boolean, onClick: () -> Unit, onDeleteAllClick: () -> Unit, + onCFRShown: () -> Unit, + onCFRClick: () -> Unit, + onCFRDismiss: () -> Unit, ) { - ExpandableListHeader( - headerText = stringResource(R.string.inactive_tabs_title), - headerTextStyle = FirefoxTheme.typography.headline7, - expanded = expanded, - expandActionContentDescription = stringResource(R.string.inactive_tabs_expand_content_description), - collapseActionContentDescription = stringResource(R.string.inactive_tabs_collapse_content_description), - onClick = onClick, + CFRPopupLayout( + showCFR = showCFR, + properties = CFRPopupProperties( + popupBodyColors = listOf( + FirefoxTheme.colors.layerGradientEnd.toArgb(), + FirefoxTheme.colors.layerGradientStart.toArgb(), + ), + dismissButtonColor = FirefoxTheme.colors.iconOnColor.toArgb(), + indicatorDirection = CFRPopup.IndicatorDirection.UP, + popupVerticalOffset = (-12).dp, + dismissOnBackPress = true, + dismissOnClickOutside = false, + ), + onCFRShown = onCFRShown, + onDismiss = { onCFRDismiss() }, + text = { + FirefoxTheme { + Text( + text = stringResource(R.string.tab_tray_inactive_onboarding_message), + color = FirefoxTheme.colors.textOnColorPrimary, + style = FirefoxTheme.typography.body2, + ) + } + }, + action = { dismissCFR -> + FirefoxTheme { + Text( + text = stringResource(R.string.tab_tray_inactive_onboarding_button_text), + color = FirefoxTheme.colors.textOnColorPrimary, + modifier = Modifier.clickable { + dismissCFR() + onCFRClick() + }, + style = FirefoxTheme.typography.body2.copy( + textDecoration = TextDecoration.Underline, + ), + ) + } + }, ) { - IconButton( - onClick = onDeleteAllClick, - modifier = Modifier.padding(horizontal = 4.dp), + ExpandableListHeader( + headerText = stringResource(R.string.inactive_tabs_title), + headerTextStyle = FirefoxTheme.typography.headline7, + expanded = expanded, + expandActionContentDescription = stringResource(R.string.inactive_tabs_expand_content_description), + collapseActionContentDescription = stringResource(R.string.inactive_tabs_collapse_content_description), + onClick = onClick, ) { - Icon( - painter = painterResource(R.drawable.ic_delete), - contentDescription = stringResource(R.string.inactive_tabs_delete_all), - tint = FirefoxTheme.colors.iconPrimary, - ) + IconButton( + onClick = onDeleteAllClick, + modifier = Modifier.padding(horizontal = 4.dp), + ) { + Icon( + painter = painterResource(R.drawable.ic_delete), + contentDescription = stringResource(R.string.inactive_tabs_delete_all), + tint = FirefoxTheme.colors.iconPrimary, + ) + } } } } @@ -229,8 +295,7 @@ private fun InactiveTabsAutoClosePrompt( } @Composable -@Preview(name = "Auto close dialog dark", uiMode = Configuration.UI_MODE_NIGHT_YES) -@Preview(name = "Auto close dialog light", uiMode = Configuration.UI_MODE_NIGHT_NO) +@LightDarkPreview private fun InactiveTabsAutoClosePromptPreview() { FirefoxTheme { Box(Modifier.background(FirefoxTheme.colors.layer1)) { @@ -243,8 +308,7 @@ private fun InactiveTabsAutoClosePromptPreview() { } @Composable -@Preview(name = "Full preview dark", uiMode = Configuration.UI_MODE_NIGHT_YES) -@Preview(name = "Full preview light", uiMode = Configuration.UI_MODE_NIGHT_NO) +@LightDarkPreview private fun InactiveTabsListPreview() { var expanded by remember { mutableStateOf(true) } var showAutoClosePrompt by remember { mutableStateOf(true) } @@ -255,12 +319,16 @@ private fun InactiveTabsListPreview() { inactiveTabs = generateFakeInactiveTabsList(), expanded = expanded, showAutoCloseDialog = showAutoClosePrompt, + showCFR = false, onHeaderClick = { expanded = !expanded }, onDeleteAllButtonClick = {}, onAutoCloseDismissClick = { showAutoClosePrompt = !showAutoClosePrompt }, onEnableAutoCloseClick = { showAutoClosePrompt = !showAutoClosePrompt }, onTabClick = {}, onTabCloseClick = {}, + onCFRShown = {}, + onCFRClick = {}, + onCFRDismiss = {}, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt index 2bc7814e53..9dc0a2246f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsIntegration.kt @@ -15,6 +15,7 @@ import mozilla.components.service.fxa.manager.FxaAccountManager import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.base.observer.Observable import mozilla.components.support.base.observer.ObserverRegistry +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.tabstray.FloatingActionButtonBinding import org.mozilla.fenix.tabstray.TabsTrayAction import org.mozilla.fenix.tabstray.TabsTrayStore @@ -91,7 +92,13 @@ class SyncedTabsIntegration( override fun displaySyncedTabs(syncedTabs: List<SyncedDeviceTabs>) { store.dispatch( TabsTrayAction.UpdateSyncedTabs( - syncedTabs.toComposeList(), + syncedTabs.toComposeList( + buildSet { + if (context.settings().enableCloseSyncedTabs) { + add(SyncedTabsListSupportedFeature.CLOSE_TABS) + } + }, + ), ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsList.kt index fe39760447..42e8799697 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabs.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsList.kt @@ -47,17 +47,29 @@ import mozilla.components.browser.storage.sync.Tab as SyncTab private const val EXPANDED_BY_DEFAULT = true /** + * A lambda invoked when the user clicks on a synced tab in the [SyncedTabsList]. + */ +typealias OnTabClick = (tab: SyncTab) -> Unit + +/** + * A lambda invoked when the user clicks a synced tab's close button in the [SyncedTabsList]. + */ +typealias OnTabCloseClick = (deviceId: String, tab: SyncTab) -> Unit + +/** * Top-level list UI for displaying Synced Tabs in the Tabs Tray. * * @param syncedTabs The tab UI items to be displayed. * @param onTabClick The lambda for handling clicks on synced tabs. + * @param onTabCloseClick The lambda for handling clicks on a synced tab's close button. */ @SuppressWarnings("LongMethod") @OptIn(ExperimentalFoundationApi::class) @Composable fun SyncedTabsList( syncedTabs: List<SyncedTabsListItem>, - onTabClick: (SyncTab) -> Unit, + onTabClick: OnTabClick, + onTabCloseClick: OnTabCloseClick, ) { val listState = rememberLazyListState() val expandedState = @@ -86,12 +98,22 @@ fun SyncedTabsList( if (sectionExpanded) { if (syncedTabItem.tabs.isNotEmpty()) { items(syncedTabItem.tabs) { syncedTab -> - FaviconListItem( - label = syncedTab.displayTitle, - description = syncedTab.displayURL, - url = syncedTab.displayURL, - onClick = { onTabClick(syncedTab.tab) }, - ) + when (syncedTab.action) { + is SyncedTabsListItem.Tab.Action.Close -> FaviconListItem( + label = syncedTab.displayTitle, + description = syncedTab.displayURL, + url = syncedTab.displayURL, + onClick = { onTabClick(syncedTab.tab) }, + iconPainter = painterResource(R.drawable.ic_close), + onIconClick = { onTabCloseClick(syncedTab.action.deviceId, syncedTab.tab) }, + ) + is SyncedTabsListItem.Tab.Action.None -> FaviconListItem( + label = syncedTab.displayTitle, + description = syncedTab.displayURL, + url = syncedTab.displayURL, + onClick = { onTabClick(syncedTab.tab) }, + ) + } } } else { item { SyncedTabsNoTabsItem() } @@ -274,9 +296,9 @@ private fun SyncedTabsListPreview() { Box(Modifier.background(FirefoxTheme.colors.layer1)) { SyncedTabsList( syncedTabs = getFakeSyncedTabList(), - ) { - println("Tab clicked") - } + onTabClick = { println("Tab clicked") }, + onTabCloseClick = { _, _ -> println("Tab closed") }, + ) } } } @@ -294,17 +316,29 @@ internal fun getFakeSyncedTabList(): List<SyncedTabsListItem> = listOf( generateFakeTab("", "www.google.com"), ), ), - SyncedTabsListItem.DeviceSection("Device 2", emptyList()), + SyncedTabsListItem.DeviceSection( + displayName = "Device 2", + tabs = listOf( + generateFakeTab("Firefox", "www.getfirefox.org", SyncedTabsListItem.Tab.Action.Close("device2222")), + generateFakeTab("Thunderbird", "www.getthunderbird.org", SyncedTabsListItem.Tab.Action.Close("device2222")), + ), + ), + SyncedTabsListItem.DeviceSection("Device 3", emptyList()), SyncedTabsListItem.Error("Please re-authenticate"), ) /** * Helper function to create a [SyncedTabsListItem.Tab] for previewing. */ -private fun generateFakeTab(tabName: String, tabUrl: String): SyncedTabsListItem.Tab = +private fun generateFakeTab( + tabName: String, + tabUrl: String, + action: SyncedTabsListItem.Tab.Action = SyncedTabsListItem.Tab.Action.None, +): SyncedTabsListItem.Tab = SyncedTabsListItem.Tab( tabName.ifEmpty { tabUrl }, tabUrl, + action, SyncTab( history = listOf(TabEntry(tabName, tabUrl, null)), active = 0, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListItem.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListItem.kt index 186d3192a4..0943187e0b 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListItem.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListItem.kt @@ -31,13 +31,29 @@ sealed class SyncedTabsListItem { * * @property displayTitle The title of the tab's web page. * @property displayURL The tab's URL up to BrowserToolbar.MAX_URI_LENGTH characters long. + * @property action The action button to show for this tab. * @property tab The underlying SyncTab object passed when the tab is clicked. */ data class Tab( val displayTitle: String, val displayURL: String, + val action: Action, val tab: SyncTab, - ) : SyncedTabsListItem() + ) : SyncedTabsListItem() { + /** An action button to show for a [Tab]. */ + sealed class Action { + /** + * An action button to close the [Tab] on the synced device. + * + * @property deviceId The ID of the device on which the [Tab] is + * currently open. + */ + data class Close(val deviceId: String) : Action() + + /** A placeholder for a [Tab] without an action button. */ + data object None : Action() + } + } /** * A placeholder for a device that has no tabs synced. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListSupportedFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListSupportedFeature.kt new file mode 100644 index 0000000000..55fac2a78f --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/syncedtabs/SyncedTabsListSupportedFeature.kt @@ -0,0 +1,12 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.tabstray.syncedtabs + +/** + * Configurable or experimental features that a [SyncedTabsList] supports. + */ +enum class SyncedTabsListSupportedFeature { + CLOSE_TABS, +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt index 58ef98f1f1..d6f96723a4 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tabstray/viewholders/SyncedTabsPageViewHolder.kt @@ -35,6 +35,7 @@ class SyncedTabsPageViewHolder( SyncedTabsList( syncedTabs = tabs ?: emptyList(), onTabClick = interactor::onSyncedTabClicked, + onTabCloseClick = interactor::onSyncedTabClosed, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/theme/FirefoxTheme.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/theme/FirefoxTheme.kt index 921e989a18..02cff3042f 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/theme/FirefoxTheme.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/theme/FirefoxTheme.kt @@ -102,19 +102,19 @@ private val darkColorPalette = FirefoxColors( layerGradientStart = PhotonColors.Violet70, layerGradientEnd = PhotonColors.Violet40, layerWarning = PhotonColors.Yellow70A77, - layerConfirmation = PhotonColors.Green80, - layerError = PhotonColors.Pink80, - layerInfo = PhotonColors.Blue50, + layerSuccess = PhotonColors.Green80, + layerCritical = PhotonColors.Pink80, + layerInformation = PhotonColors.Blue50, layerSearch = PhotonColors.DarkGrey80, actionPrimary = PhotonColors.Violet60, actionPrimaryDisabled = PhotonColors.Violet60A50, - actionSecondary = PhotonColors.LightGrey30, + actionSecondary = PhotonColors.DarkGrey05, actionTertiary = PhotonColors.DarkGrey10, actionQuarternary = PhotonColors.DarkGrey80, actionWarning = PhotonColors.Yellow40A41, - actionConfirmation = PhotonColors.Green70, - actionError = PhotonColors.Pink70A69, - actionInfo = PhotonColors.Blue60, + actionSuccess = PhotonColors.Green70, + actionCritical = PhotonColors.Pink70A69, + actionInformation = PhotonColors.Blue60, formDefault = PhotonColors.LightGrey05, formSelected = PhotonColors.Violet40, formSurface = PhotonColors.DarkGrey05, @@ -126,15 +126,15 @@ private val darkColorPalette = FirefoxColors( textPrimary = PhotonColors.LightGrey05, textSecondary = PhotonColors.LightGrey40, textDisabled = PhotonColors.LightGrey05A40, - textWarning = PhotonColors.Red20, - textWarningButton = PhotonColors.Red70, + textCritical = PhotonColors.Red20, + textCriticalButton = PhotonColors.Red20, textAccent = PhotonColors.Violet20, textAccentDisabled = PhotonColors.Violet20A60, textOnColorPrimary = PhotonColors.LightGrey05, textOnColorSecondary = PhotonColors.LightGrey40, textActionPrimary = PhotonColors.LightGrey05, textActionPrimaryDisabled = PhotonColors.LightGrey05A40, - textActionSecondary = PhotonColors.DarkGrey90, + textActionSecondary = PhotonColors.LightGrey05, textActionTertiary = PhotonColors.LightGrey05, textActionTertiaryActive = PhotonColors.LightGrey05, iconPrimary = PhotonColors.LightGrey05, @@ -146,15 +146,15 @@ private val darkColorPalette = FirefoxColors( iconOnColorDisabled = PhotonColors.LightGrey05A40, iconNotice = PhotonColors.Blue30, iconButton = PhotonColors.LightGrey05, - iconWarning = PhotonColors.Red20, - iconWarningButton = PhotonColors.Red70, + iconCritical = PhotonColors.Red20, + iconCriticalButton = PhotonColors.Red20, iconAccentViolet = PhotonColors.Violet20, iconAccentBlue = PhotonColors.Blue20, iconAccentPink = PhotonColors.Pink20, iconAccentGreen = PhotonColors.Green20, iconAccentYellow = PhotonColors.Yellow20, iconActionPrimary = PhotonColors.LightGrey05, - iconActionSecondary = PhotonColors.DarkGrey90, + iconActionSecondary = PhotonColors.LightGrey05, iconActionTertiary = PhotonColors.LightGrey05, iconGradientStart = PhotonColors.Violet20, iconGradientEnd = PhotonColors.Blue20, @@ -164,7 +164,7 @@ private val darkColorPalette = FirefoxColors( borderFormDefault = PhotonColors.LightGrey05, borderAccent = PhotonColors.Violet40, borderDisabled = PhotonColors.LightGrey05A40, - borderWarning = PhotonColors.Red40, + borderCritical = PhotonColors.Red20, borderToolbarDivider = PhotonColors.DarkGrey60, ) @@ -182,9 +182,9 @@ private val lightColorPalette = FirefoxColors( layerGradientStart = PhotonColors.Violet70, layerGradientEnd = PhotonColors.Violet40, layerWarning = PhotonColors.Yellow20, - layerConfirmation = PhotonColors.Green20, - layerError = PhotonColors.Red10, - layerInfo = PhotonColors.Blue50A44, + layerSuccess = PhotonColors.Green20, + layerCritical = PhotonColors.Red10, + layerInformation = PhotonColors.Blue50A44, layerSearch = PhotonColors.LightGrey30, actionPrimary = PhotonColors.Ink20, actionPrimaryDisabled = PhotonColors.Ink20A50, @@ -192,9 +192,9 @@ private val lightColorPalette = FirefoxColors( actionTertiary = PhotonColors.LightGrey40, actionQuarternary = PhotonColors.LightGrey10, actionWarning = PhotonColors.Yellow60A40, - actionConfirmation = PhotonColors.Green60, - actionError = PhotonColors.Red30, - actionInfo = PhotonColors.Blue50, + actionSuccess = PhotonColors.Green60, + actionCritical = PhotonColors.Red30, + actionInformation = PhotonColors.Blue50, formDefault = PhotonColors.DarkGrey90, formSelected = PhotonColors.Ink20, formSurface = PhotonColors.LightGrey50, @@ -206,8 +206,8 @@ private val lightColorPalette = FirefoxColors( textPrimary = PhotonColors.DarkGrey90, textSecondary = PhotonColors.DarkGrey05, textDisabled = PhotonColors.DarkGrey90A40, - textWarning = PhotonColors.Red70, - textWarningButton = PhotonColors.Red70, + textCritical = PhotonColors.Red70, + textCriticalButton = PhotonColors.Red70, textAccent = PhotonColors.Violet70, textAccentDisabled = PhotonColors.Violet70A80, textOnColorPrimary = PhotonColors.LightGrey05, @@ -226,9 +226,9 @@ private val lightColorPalette = FirefoxColors( iconOnColorDisabled = PhotonColors.LightGrey05A40, iconNotice = PhotonColors.Blue30, iconButton = PhotonColors.Ink20, - iconWarning = PhotonColors.Red70, - iconWarningButton = PhotonColors.Red70, - iconAccentViolet = PhotonColors.Violet60, + iconCritical = PhotonColors.Red70, + iconCriticalButton = PhotonColors.Red70, + iconAccentViolet = PhotonColors.Violet70, iconAccentBlue = PhotonColors.Blue60, iconAccentPink = PhotonColors.Pink60, iconAccentGreen = PhotonColors.Green60, @@ -244,15 +244,16 @@ private val lightColorPalette = FirefoxColors( borderFormDefault = PhotonColors.DarkGrey90, borderAccent = PhotonColors.Ink20, borderDisabled = PhotonColors.DarkGrey90A40, - borderWarning = PhotonColors.Red70, + borderCritical = PhotonColors.Red70, borderToolbarDivider = PhotonColors.LightGrey10, ) private val privateColorPalette = darkColorPalette.copy( - layer1 = PhotonColors.Ink50, - layer2 = PhotonColors.Ink50, + layer1 = PhotonColors.Violet90, + layer2 = PhotonColors.Violet90, layer3 = PhotonColors.Ink90, layerSearch = PhotonColors.Ink90, + borderPrimary = PhotonColors.Ink05, borderSecondary = PhotonColors.Ink10, borderToolbarDivider = PhotonColors.Violet80, ) @@ -276,9 +277,9 @@ class FirefoxColors( layerGradientStart: Color, layerGradientEnd: Color, layerWarning: Color, - layerConfirmation: Color, - layerError: Color, - layerInfo: Color, + layerSuccess: Color, + layerCritical: Color, + layerInformation: Color, layerSearch: Color, actionPrimary: Color, actionPrimaryDisabled: Color, @@ -286,9 +287,9 @@ class FirefoxColors( actionTertiary: Color, actionQuarternary: Color, actionWarning: Color, - actionConfirmation: Color, - actionError: Color, - actionInfo: Color, + actionSuccess: Color, + actionCritical: Color, + actionInformation: Color, formDefault: Color, formSelected: Color, formSurface: Color, @@ -300,8 +301,8 @@ class FirefoxColors( textPrimary: Color, textSecondary: Color, textDisabled: Color, - textWarning: Color, - textWarningButton: Color, + textCritical: Color, + textCriticalButton: Color, textAccent: Color, textAccentDisabled: Color, textOnColorPrimary: Color, @@ -320,8 +321,8 @@ class FirefoxColors( iconOnColorDisabled: Color, iconNotice: Color, iconButton: Color, - iconWarning: Color, - iconWarningButton: Color, + iconCritical: Color, + iconCriticalButton: Color, iconAccentViolet: Color, iconAccentBlue: Color, iconAccentPink: Color, @@ -338,7 +339,7 @@ class FirefoxColors( borderFormDefault: Color, borderAccent: Color, borderDisabled: Color, - borderWarning: Color, + borderCritical: Color, borderToolbarDivider: Color, ) { // Layers @@ -395,15 +396,15 @@ class FirefoxColors( private set // Confirmation background - var layerConfirmation by mutableStateOf(layerConfirmation) + var layerSuccess by mutableStateOf(layerSuccess) private set // Error Background - var layerError by mutableStateOf(layerError) + var layerCritical by mutableStateOf(layerCritical) private set // Info background - var layerInfo by mutableStateOf(layerInfo) + var layerInformation by mutableStateOf(layerInformation) private set // Search @@ -437,15 +438,15 @@ class FirefoxColors( private set // Confirmation button - var actionConfirmation by mutableStateOf(actionConfirmation) + var actionSuccess by mutableStateOf(actionSuccess) private set // Error button - var actionError by mutableStateOf(actionError) + var actionCritical by mutableStateOf(actionCritical) private set // Info button - var actionInfo by mutableStateOf(actionInfo) + var actionInformation by mutableStateOf(actionInformation) private set // Checkbox default, Radio button default @@ -495,11 +496,11 @@ class FirefoxColors( private set // Warning text - var textWarning by mutableStateOf(textWarning) + var textCritical by mutableStateOf(textCritical) private set // Warning text on Secondary button - var textWarningButton by mutableStateOf(textWarningButton) + var textCriticalButton by mutableStateOf(textCriticalButton) private set // Small heading, Text link @@ -575,11 +576,11 @@ class FirefoxColors( // Icon button var iconButton by mutableStateOf(iconButton) private set - var iconWarning by mutableStateOf(iconWarning) + var iconCritical by mutableStateOf(iconCritical) private set // Warning icon on Secondary button - var iconWarningButton by mutableStateOf(iconWarningButton) + var iconCriticalButton by mutableStateOf(iconCriticalButton) private set var iconAccentViolet by mutableStateOf(iconAccentViolet) private set @@ -638,7 +639,7 @@ class FirefoxColors( private set // Form parts - var borderWarning by mutableStateOf(borderWarning) + var borderCritical by mutableStateOf(borderCritical) private set // Toolbar divider @@ -663,9 +664,9 @@ class FirefoxColors( layerGradientStart = other.layerGradientStart layerGradientEnd = other.layerGradientEnd layerWarning = other.layerWarning - layerConfirmation = other.layerConfirmation - layerError = other.layerError - layerInfo = other.layerInfo + layerSuccess = other.layerSuccess + layerCritical = other.layerCritical + layerInformation = other.layerInformation layerSearch = other.layerSearch actionPrimary = other.actionPrimary actionPrimaryDisabled = other.actionPrimaryDisabled @@ -673,9 +674,9 @@ class FirefoxColors( actionTertiary = other.actionTertiary actionQuarternary = other.actionQuarternary actionWarning = other.actionWarning - actionConfirmation = other.actionConfirmation - actionError = other.actionError - actionInfo = other.actionInfo + actionSuccess = other.actionSuccess + actionCritical = other.actionCritical + actionInformation = other.actionInformation formDefault = other.formDefault formSelected = other.formSelected formSurface = other.formSurface @@ -687,8 +688,8 @@ class FirefoxColors( textPrimary = other.textPrimary textSecondary = other.textSecondary textDisabled = other.textDisabled - textWarning = other.textWarning - textWarningButton = other.textWarningButton + textCritical = other.textCritical + textCriticalButton = other.textCriticalButton textAccent = other.textAccent textAccentDisabled = other.textAccentDisabled textOnColorPrimary = other.textOnColorPrimary @@ -707,8 +708,8 @@ class FirefoxColors( iconOnColorDisabled = other.iconOnColorDisabled iconNotice = other.iconNotice iconButton = other.iconButton - iconWarning = other.iconWarning - iconWarningButton = other.iconWarningButton + iconCritical = other.iconCritical + iconCriticalButton = other.iconCriticalButton iconAccentViolet = other.iconAccentViolet iconAccentBlue = other.iconAccentBlue iconAccentPink = other.iconAccentPink @@ -725,7 +726,7 @@ class FirefoxColors( borderFormDefault = other.borderFormDefault borderAccent = other.borderAccent borderDisabled = other.borderDisabled - borderWarning = other.borderWarning + borderCritical = other.borderCritical borderToolbarDivider = other.borderToolbarDivider } @@ -747,9 +748,9 @@ class FirefoxColors( layerGradientStart: Color = this.layerGradientStart, layerGradientEnd: Color = this.layerGradientEnd, layerWarning: Color = this.layerWarning, - layerConfirmation: Color = this.layerConfirmation, - layerError: Color = this.layerError, - layerInfo: Color = this.layerInfo, + layerSuccess: Color = this.layerSuccess, + layerCritical: Color = this.layerCritical, + layerInformation: Color = this.layerInformation, layerSearch: Color = this.layerSearch, actionPrimary: Color = this.actionPrimary, actionPrimaryDisabled: Color = this.actionPrimaryDisabled, @@ -757,9 +758,9 @@ class FirefoxColors( actionTertiary: Color = this.actionTertiary, actionQuarternary: Color = this.actionQuarternary, actionWarning: Color = this.actionWarning, - actionConfirmation: Color = this.actionConfirmation, - actionError: Color = this.actionError, - actionInfo: Color = this.actionInfo, + actionSuccess: Color = this.actionSuccess, + actionCritical: Color = this.actionCritical, + actionInformation: Color = this.actionInformation, formDefault: Color = this.formDefault, formSelected: Color = this.formSelected, formSurface: Color = this.formSurface, @@ -771,8 +772,8 @@ class FirefoxColors( textPrimary: Color = this.textPrimary, textSecondary: Color = this.textSecondary, textDisabled: Color = this.textDisabled, - textWarning: Color = this.textWarning, - textWarningButton: Color = this.textWarningButton, + textCritical: Color = this.textCritical, + textCriticalButton: Color = this.textCriticalButton, textAccent: Color = this.textAccent, textAccentDisabled: Color = this.textAccentDisabled, textOnColorPrimary: Color = this.textOnColorPrimary, @@ -791,8 +792,8 @@ class FirefoxColors( iconOnColorDisabled: Color = this.iconOnColorDisabled, iconNotice: Color = this.iconNotice, iconButton: Color = this.iconButton, - iconWarning: Color = this.iconWarning, - iconWarningButton: Color = this.iconWarningButton, + iconCritical: Color = this.iconCritical, + iconCriticalButton: Color = this.iconCriticalButton, iconAccentViolet: Color = this.iconAccentViolet, iconAccentBlue: Color = this.iconAccentBlue, iconAccentPink: Color = this.iconAccentPink, @@ -809,7 +810,7 @@ class FirefoxColors( borderFormDefault: Color = this.borderFormDefault, borderAccent: Color = this.borderAccent, borderDisabled: Color = this.borderDisabled, - borderWarning: Color = this.borderWarning, + borderWarning: Color = this.borderCritical, borderToolbarDivider: Color = this.borderToolbarDivider, ): FirefoxColors = FirefoxColors( layer1 = layer1, @@ -825,9 +826,9 @@ class FirefoxColors( layerGradientStart = layerGradientStart, layerGradientEnd = layerGradientEnd, layerWarning = layerWarning, - layerConfirmation = layerConfirmation, - layerError = layerError, - layerInfo = layerInfo, + layerSuccess = layerSuccess, + layerCritical = layerCritical, + layerInformation = layerInformation, layerSearch = layerSearch, actionPrimary = actionPrimary, actionPrimaryDisabled = actionPrimaryDisabled, @@ -835,9 +836,9 @@ class FirefoxColors( actionTertiary = actionTertiary, actionQuarternary = actionQuarternary, actionWarning = actionWarning, - actionConfirmation = actionConfirmation, - actionError = actionError, - actionInfo = actionInfo, + actionSuccess = actionSuccess, + actionCritical = actionCritical, + actionInformation = actionInformation, formDefault = formDefault, formSelected = formSelected, formSurface = formSurface, @@ -849,8 +850,8 @@ class FirefoxColors( textPrimary = textPrimary, textSecondary = textSecondary, textDisabled = textDisabled, - textWarning = textWarning, - textWarningButton = textWarningButton, + textCritical = textCritical, + textCriticalButton = textCriticalButton, textAccent = textAccent, textAccentDisabled = textAccentDisabled, textOnColorPrimary = textOnColorPrimary, @@ -869,8 +870,8 @@ class FirefoxColors( iconOnColorDisabled = iconOnColorDisabled, iconNotice = iconNotice, iconButton = iconButton, - iconWarning = iconWarning, - iconWarningButton = iconWarningButton, + iconCritical = iconCritical, + iconCriticalButton = iconCriticalButton, iconAccentViolet = iconAccentViolet, iconAccentBlue = iconAccentBlue, iconAccentPink = iconAccentPink, @@ -887,7 +888,7 @@ class FirefoxColors( borderFormDefault = borderFormDefault, borderAccent = borderAccent, borderDisabled = borderDisabled, - borderWarning = borderWarning, + borderCritical = borderWarning, borderToolbarDivider = borderToolbarDivider, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/DownloadIndicator.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/DownloadIndicator.kt index 952727fe85..89c9cb47dc 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/DownloadIndicator.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/DownloadIndicator.kt @@ -14,6 +14,9 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.material.ButtonDefaults import androidx.compose.material.Icon import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -26,7 +29,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.disabled import androidx.compose.ui.semantics.role import androidx.compose.ui.unit.dp import org.mozilla.fenix.R @@ -87,15 +89,15 @@ fun DownloadIndicator( modifier = modifier.then( Modifier .clearAndSetSemantics { - disabled() role = Role.Button contentDescription?.let { this.contentDescription = contentDescription } - }, + } + .wrapContentSize(), ), - enabled = false, icon = icon, iconModifier = Modifier - .rotate(rotationAnimation()), + .rotate(rotationAnimation()) + .size(ButtonDefaults.IconSize), onClick = {}, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt index d29da59cfd..9edbaef823 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettings.kt @@ -46,6 +46,7 @@ fun TranslationSettings( onNeverTranslationClicked: () -> Unit, onDownloadLanguageClicked: () -> Unit, ) { + val showHeader = showAutomaticTranslations || showNeverTranslate || showDownloads Column( modifier = Modifier .background( @@ -67,12 +68,12 @@ fun TranslationSettings( .padding(start = 72.dp, end = 16.dp), ) - if (item.type.hasDivider) { + if (item.type.hasDivider && showHeader) { Divider(Modifier.padding(top = 8.dp, bottom = 8.dp)) } } - if (showAutomaticTranslations || showNeverTranslate || showDownloads) { + if (showHeader) { item { Text( text = stringResource( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt index 5fbd7a2dc1..0859c51bd3 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationSettingsFragment.kt @@ -17,11 +17,9 @@ import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.stringResource import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs import mozilla.components.browser.state.action.TranslationsAction -import mozilla.components.browser.state.selector.findTab +import mozilla.components.browser.state.state.TranslationsBrowserState import mozilla.components.browser.state.store.BrowserStore -import mozilla.components.concept.engine.translate.TranslationPageSettingOperation import mozilla.components.lib.state.ext.observeAsComposableState import mozilla.components.support.base.feature.UserInteractionHandler import org.mozilla.fenix.GleanMetrics.Translations @@ -36,7 +34,6 @@ import org.mozilla.fenix.theme.FirefoxTheme * A fragment displaying the Firefox Translation settings screen. */ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { - private val args by navArgs<TranslationSettingsFragmentArgs>() private val browserStore: BrowserStore by lazy { requireComponents.core.store } override fun onResume() { @@ -67,7 +64,7 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { Translations.action.record(Translations.ActionExtra("global_site_settings")) findNavController().navigate( TranslationSettingsFragmentDirections - .actionTranslationSettingsFragmentToNeverTranslateSitePreferenceFragment(), + .actionTranslationSettingsToNeverTranslateSitePreference(), ) }, onDownloadLanguageClicked = { @@ -84,19 +81,19 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { /** * Set the switch item values. - * The first one is based on [TranslationPageSettings.alwaysOfferPopup]. + * The first one is based on [TranslationsBrowserState.offerTranslation]. * The second one is [DownloadLanguageFileDialog] visibility. * This pop-up will appear if the switch item is unchecked, the phone is in saving mode, and * doesn't have a WiFi connection. */ @Composable private fun getTranslationSwitchItemList(): MutableList<TranslationSwitchItem> { - val pageSettingsState = browserStore.observeAsComposableState { state -> - state.findTab(args.sessionId)?.translationsState?.pageSettings + val offerToTranslate = browserStore.observeAsComposableState { state -> + state.translationEngine.offerTranslation }.value val translationSwitchItems = mutableListOf<TranslationSwitchItem>() - pageSettingsState?.alwaysOfferPopup?.let { + offerToTranslate?.let { translationSwitchItems.add( TranslationSwitchItem( type = TranslationSettingsScreenOption.OfferToTranslate( @@ -107,10 +104,8 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { isEnabled = true, onStateChange = { _, checked -> browserStore.dispatch( - TranslationsAction.UpdatePageSettingAction( - tabId = args.sessionId, - operation = TranslationPageSettingOperation.UPDATE_ALWAYS_OFFER_POPUP, - setting = checked, + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = checked, ), ) // Ensures persistence of value @@ -141,12 +136,15 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler { } override fun onBackPressed(): Boolean { - findNavController().navigate( - TranslationSettingsFragmentDirections.actionTranslationSettingsFragmentToTranslationsDialogFragment( - sessionId = args.sessionId, - translationsDialogAccessPoint = TranslationsDialogAccessPoint.TranslationsOptions, - ), - ) - return true + return if (findNavController().previousBackStackEntry?.destination?.id == R.id.browserFragment) { + findNavController().navigate( + TranslationSettingsFragmentDirections.actionTranslationSettingsFragmentToTranslationsDialogFragment( + translationsDialogAccessPoint = TranslationsDialogAccessPoint.TranslationsOptions, + ), + ) + true + } else { + false + } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt index 8d4a74e02c..f6e27391be 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsBottomSheet.kt @@ -171,6 +171,7 @@ internal fun TranslationsOptionsDialog( context: Context, showGlobalSettings: Boolean, translationPageSettings: TranslationPageSettings? = null, + offerTranslation: Boolean? = null, initialFrom: Language? = null, onStateChange: (TranslationSettingsOption, Boolean) -> Unit, onBackClicked: () -> Unit, @@ -181,6 +182,7 @@ internal fun TranslationsOptionsDialog( showGlobalSettings = showGlobalSettings, translationOptionsList = getTranslationSwitchItemList( translationPageSettings = translationPageSettings, + offerTranslation = offerTranslation, initialFrom = initialFrom, context = context, onStateChange = onStateChange, @@ -194,6 +196,7 @@ internal fun TranslationsOptionsDialog( @Composable private fun getTranslationSwitchItemList( translationPageSettings: TranslationPageSettings? = null, + offerTranslation: Boolean? = null, initialFrom: Language? = null, context: Context, onStateChange: (TranslationSettingsOption, Boolean) -> Unit, @@ -201,12 +204,11 @@ private fun getTranslationSwitchItemList( val translationSwitchItemList = mutableListOf<TranslationSwitchItem>() translationPageSettings?.let { - val alwaysOfferPopup = translationPageSettings.alwaysOfferPopup val alwaysTranslateLanguage = translationPageSettings.alwaysTranslateLanguage val neverTranslateLanguage = translationPageSettings.neverTranslateLanguage val neverTranslateSite = translationPageSettings.neverTranslateSite - alwaysOfferPopup?.let { + offerTranslation?.let { translationSwitchItemList.add( TranslationSwitchItem( type = TranslationPageSettingsOption.AlwaysOfferPopup(), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBinding.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBinding.kt index e2d25f82dc..b053e70498 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBinding.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBinding.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.mapNotNull -import mozilla.components.browser.state.selector.findTab +import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.TranslationsBrowserState @@ -29,7 +29,6 @@ import java.util.Locale class TranslationsDialogBinding( browserStore: BrowserStore, private val translationsDialogStore: TranslationsDialogStore, - private val sessionId: String, private val getTranslatedPageTitle: (localizedFrom: String?, localizedTo: String?) -> String, ) : AbstractBinding<BrowserState>(browserStore) { @@ -42,7 +41,7 @@ class TranslationsDialogBinding( } // Session level flows - val sessionFlow = flow.mapNotNull { state -> state.findTab(sessionId) } + val sessionFlow = flow.mapNotNull { state -> state.selectedTab } .distinctUntilChangedBy { it.translationsState } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt index 2c834aea08..727034c0d8 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogBottomSheet.kt @@ -484,16 +484,18 @@ private fun TranslationErrorWarning( when (translationError) { is TranslationError.CouldNotTranslateError -> { ReviewQualityCheckInfoCard( - title = stringResource(id = R.string.translation_error_could_not_translate_warning_text), + description = stringResource(id = R.string.translation_error_could_not_translate_warning_text), type = ReviewQualityCheckInfoType.Error, + verticalRowAlignment = Alignment.CenterVertically, modifier = modifier, ) } is TranslationError.CouldNotLoadLanguagesError -> { ReviewQualityCheckInfoCard( - title = stringResource(id = R.string.translation_error_could_not_load_languages_warning_text), + description = stringResource(id = R.string.translation_error_could_not_load_languages_warning_text), type = ReviewQualityCheckInfoType.Error, + verticalRowAlignment = Alignment.CenterVertically, modifier = modifier, ) } @@ -501,7 +503,7 @@ private fun TranslationErrorWarning( is TranslationError.LanguageNotSupportedError -> { documentLangDisplayName?.let { ReviewQualityCheckInfoCard( - title = stringResource( + description = stringResource( id = R.string.translation_error_language_not_supported_warning_text, it, ), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt index 7e31dd594d..0d5909548e 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogFragment.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.unit.dp import androidx.core.os.bundleOf @@ -28,7 +29,7 @@ import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import mozilla.components.browser.state.selector.findTab +import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.translate.Language import mozilla.components.concept.engine.translate.TranslationError @@ -48,6 +49,9 @@ import org.mozilla.fenix.translations.preferences.downloadlanguages.DownloadLang import org.mozilla.fenix.translations.preferences.downloadlanguages.DownloadLanguageFileDialogType import org.mozilla.fenix.translations.preferences.downloadlanguages.DownloadLanguagesFeature +// Friction should be increased, since peek height on this dialog is to fill the screen. +private const val DIALOG_FRICTION = .65f + /** * The enum is to know what bottom sheet to open. */ @@ -78,6 +82,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { behavior = BottomSheetBehavior.from(bottomSheet) behavior?.peekHeight = resources.displayMetrics.heightPixels behavior?.state = BottomSheetBehavior.STATE_EXPANDED + behavior?.hideFriction = DIALOG_FRICTION } } @@ -92,7 +97,6 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { listOf( TranslationsDialogMiddleware( browserStore = browserStore, - sessionId = args.sessionId, settings = requireContext().settings(), ), ), @@ -245,7 +249,6 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { feature = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = args.sessionId, getTranslatedPageTitle = { localizedFrom, localizedTo -> requireContext().getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -280,6 +283,8 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { onSettingClicked: () -> Unit, onShowDownloadLanguageFileDialog: () -> Unit, ) { + val localView = LocalView.current + TranslationsDialog( translationsDialogState = translationsDialogState, learnMoreUrl = learnMoreUrl, @@ -295,6 +300,11 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { }, onNegativeButtonClicked = { if (translationsDialogState.isTranslated) { + localView.announceForAccessibility( + requireContext().getString( + R.string.translations_bottom_sheet_restore_accessibility_announcement, + ), + ) translationsDialogStore.dispatch(TranslationsDialogAction.RestoreTranslation) } dismiss() @@ -384,12 +394,19 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { ) { val pageSettingsState = browserStore.observeAsComposableState { state -> - state.findTab(args.sessionId)?.translationsState?.pageSettings + state.selectedTab?.translationsState?.pageSettings }.value + val offerTranslation = browserStore.observeAsComposableState { state -> + state.translationEngine.offerTranslation + }.value + + val localView = LocalView.current + TranslationsOptionsDialog( context = requireContext(), translationPageSettings = pageSettingsState, + offerTranslation = offerTranslation, showGlobalSettings = showGlobalSettings, initialFrom = initialFrom, onStateChange = { type, checked -> @@ -402,15 +419,17 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { checked, ), ) + + if (checked) { + localView.announceForAccessibility(type.descriptionId?.let { getString(it) }) + } }, onBackClicked = onBackClicked, onTranslationSettingsClicked = { Translations.action.record(Translations.ActionExtra("global_settings")) findNavController().navigate( TranslationsDialogFragmentDirections - .actionTranslationsDialogFragmentToTranslationSettingsFragment( - sessionId = args.sessionId, - ), + .actionTranslationsDialogFragmentToTranslationSettingsFragment(), ) }, aboutTranslationClicked = { @@ -425,7 +444,7 @@ class TranslationsDialogFragment : BottomSheetDialogFragment() { setFragmentResult( TRANSLATION_IN_PROGRESS, bundleOf( - SESSION_ID to args.sessionId, + SESSION_ID to browserStore.state.selectedTab?.id, ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt index 20bfee0d84..cb6ac2c62d 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt @@ -5,12 +5,12 @@ package org.mozilla.fenix.translations import mozilla.components.browser.state.action.TranslationsAction +import mozilla.components.browser.state.selector.selectedTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.translate.TranslationOperation import mozilla.components.concept.engine.translate.TranslationPageSettingOperation import mozilla.components.lib.state.Middleware import mozilla.components.lib.state.MiddlewareContext -import org.mozilla.fenix.ext.settings import org.mozilla.fenix.utils.Settings /** @@ -18,16 +18,17 @@ import org.mozilla.fenix.utils.Settings */ class TranslationsDialogMiddleware( private val browserStore: BrowserStore, - private val sessionId: String, private val settings: Settings, ) : Middleware<TranslationsDialogState, TranslationsDialogAction> { - @Suppress("LongMethod") + @Suppress("LongMethod", "CyclomaticComplexMethod") override fun invoke( context: MiddlewareContext<TranslationsDialogState, TranslationsDialogAction>, next: (TranslationsDialogAction) -> Unit, action: TranslationsDialogAction, ) { + val sessionId = browserStore.state.selectedTab?.id ?: return + when (action) { is TranslationsDialogAction.InitTranslationsDialog -> { // If the languages are missing, we should attempt to fetch the supported languages. @@ -98,10 +99,8 @@ class TranslationsDialogMiddleware( is TranslationPageSettingsOption.AlwaysOfferPopup -> { // Ensures the translations engine has the correct value browserStore.dispatch( - TranslationsAction.UpdatePageSettingAction( - tabId = sessionId, - operation = TranslationPageSettingOperation.UPDATE_ALWAYS_OFFER_POPUP, - setting = action.checkValue, + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = action.checkValue, ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt index 30bfed028e..8c32bc570c 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationItemPreference.kt @@ -6,17 +6,20 @@ package org.mozilla.fenix.translations.preferences.automatic import android.os.Parcelable import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.RawValue +import mozilla.components.concept.engine.translate.Language +import mozilla.components.concept.engine.translate.LanguageSetting import org.mozilla.fenix.R /** * AutomaticTranslationItem that will appear on Automatic Translation screen. * - * @property displayName The text that will appear in the list. + * @property language The text that will appear in the list. * @property automaticTranslationOptionPreference The option that the user selected. */ @Parcelize data class AutomaticTranslationItemPreference( - val displayName: String, + val language: @RawValue Language, val automaticTranslationOptionPreference: AutomaticTranslationOptionPreference, ) : Parcelable @@ -65,3 +68,23 @@ sealed class AutomaticTranslationOptionPreference( ), ) : AutomaticTranslationOptionPreference(titleId = titleId, summaryId = summaryId) } + +internal fun getAutomaticTranslationOptionPreference( + languageSetting: LanguageSetting, +): AutomaticTranslationOptionPreference { + return when (languageSetting) { + LanguageSetting.ALWAYS -> AutomaticTranslationOptionPreference.AlwaysTranslate() + LanguageSetting.OFFER -> AutomaticTranslationOptionPreference.OfferToTranslate() + LanguageSetting.NEVER -> AutomaticTranslationOptionPreference.NeverTranslate() + } +} + +internal fun getLanguageSetting( + automaticTranslationItemPreference: AutomaticTranslationOptionPreference, +): LanguageSetting { + return when (automaticTranslationItemPreference) { + is AutomaticTranslationOptionPreference.AlwaysTranslate -> LanguageSetting.ALWAYS + is AutomaticTranslationOptionPreference.NeverTranslate -> LanguageSetting.NEVER + is AutomaticTranslationOptionPreference.OfferToTranslate -> LanguageSetting.OFFER + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt index bbfd3d42ba..a62e6d3a36 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreference.kt @@ -21,10 +21,12 @@ import org.mozilla.fenix.theme.FirefoxTheme * Firefox Automatic Translation Options preference screen. * * @param selectedOption Selected option that will come from the translations engine. + * @param onItemClick Invoked when the user clicks on a [AutomaticTranslationOptionPreference] from the list. */ @Composable fun AutomaticTranslationOptionsPreference( selectedOption: AutomaticTranslationOptionPreference, + onItemClick: (AutomaticTranslationOptionPreference) -> Unit, ) { val optionsList = arrayListOf( AutomaticTranslationOptionPreference.OfferToTranslate(), @@ -50,6 +52,7 @@ fun AutomaticTranslationOptionsPreference( maxDescriptionLines = Int.MAX_VALUE, onClick = { selected.value = item + onItemClick(item) }, ) } @@ -63,6 +66,7 @@ private fun AutomaticTranslationOptionsPreview() { FirefoxTheme { AutomaticTranslationOptionsPreference( selectedOption = AutomaticTranslationOptionPreference.AlwaysTranslate(), + onItemClick = {}, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt index b144227312..ad2dea0072 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationOptionsPreferenceFragment.kt @@ -11,6 +11,9 @@ import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs +import mozilla.components.browser.state.action.TranslationsAction +import mozilla.components.browser.state.store.BrowserStore +import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.theme.FirefoxTheme @@ -19,10 +22,11 @@ import org.mozilla.fenix.theme.FirefoxTheme */ class AutomaticTranslationOptionsPreferenceFragment : Fragment() { private val args by navArgs<AutomaticTranslationOptionsPreferenceFragmentArgs>() + private val browserStore: BrowserStore by lazy { requireComponents.core.store } override fun onResume() { super.onResume() - showToolbar(args.selectedTranslationOptionPreference.displayName) + args.selectedTranslationOptionPreference.language.localizedDisplayName?.let { showToolbar(it) } } override fun onCreateView( @@ -34,6 +38,14 @@ class AutomaticTranslationOptionsPreferenceFragment : Fragment() { FirefoxTheme { AutomaticTranslationOptionsPreference( selectedOption = args.selectedTranslationOptionPreference.automaticTranslationOptionPreference, + onItemClick = { + browserStore.dispatch( + TranslationsAction.UpdateLanguageSettingsAction( + languageCode = args.selectedTranslationOptionPreference.language.code, + setting = getLanguageSetting(it), + ), + ) + }, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt index 4ce45c4e2b..76183742c3 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreference.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.heading import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp +import mozilla.components.concept.engine.translate.Language import org.mozilla.fenix.R import org.mozilla.fenix.compose.annotation.LightDarkPreview import org.mozilla.fenix.compose.list.TextListItem @@ -58,16 +59,18 @@ fun AutomaticTranslationPreference( ) { description = stringResource(item.automaticTranslationOptionPreference.titleId) } - TextListItem( - label = item.displayName, - description = description, - modifier = Modifier - .fillMaxWidth() - .padding(start = 56.dp), - onClick = { - onItemClick(item) - }, - ) + item.language.localizedDisplayName?.let { + TextListItem( + label = it, + description = description, + modifier = Modifier + .fillMaxWidth() + .padding(start = 56.dp), + onClick = { + onItemClick(item) + }, + ) + } } } } @@ -78,25 +81,25 @@ internal fun getAutomaticTranslationListPreferences(): List<AutomaticTranslation return mutableListOf<AutomaticTranslationItemPreference>().apply { add( AutomaticTranslationItemPreference( - displayName = Locale.ENGLISH.displayLanguage, + language = Language(Locale.ENGLISH.toLanguageTag(), Locale.ENGLISH.displayLanguage), automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.AlwaysTranslate(), ), ) add( AutomaticTranslationItemPreference( - displayName = Locale.FRENCH.displayLanguage, + language = Language(Locale.FRANCE.toLanguageTag(), Locale.FRANCE.displayLanguage), automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.OfferToTranslate(), ), ) add( AutomaticTranslationItemPreference( - displayName = Locale.GERMAN.displayLanguage, + language = Language(Locale.GERMAN.toLanguageTag(), Locale.GERMAN.displayLanguage), automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.NeverTranslate(), ), ) add( AutomaticTranslationItemPreference( - displayName = Locale.ITALIAN.displayLanguage, + language = Language(Locale.ITALIAN.toLanguageTag(), Locale.ITALIAN.displayLanguage), automaticTranslationOptionPreference = AutomaticTranslationOptionPreference.AlwaysTranslate(), ), ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt index 9830a17156..c2b07f98bb 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/automatic/AutomaticTranslationPreferenceFragment.kt @@ -11,7 +11,13 @@ import android.view.ViewGroup import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.concept.engine.translate.LanguageSetting +import mozilla.components.concept.engine.translate.TranslationSupport +import mozilla.components.concept.engine.translate.findLanguage +import mozilla.components.lib.state.ext.observeAsComposableState import org.mozilla.fenix.R +import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.theme.FirefoxTheme @@ -19,6 +25,8 @@ import org.mozilla.fenix.theme.FirefoxTheme * A fragment displaying the Firefox Automatic Translation list screen. */ class AutomaticTranslationPreferenceFragment : Fragment() { + private val browserStore: BrowserStore by lazy { requireComponents.core.store } + override fun onResume() { super.onResume() showToolbar(getString(R.string.automatic_translation_toolbar_title_preference)) @@ -31,8 +39,18 @@ class AutomaticTranslationPreferenceFragment : Fragment() { ): View = ComposeView(requireContext()).apply { setContent { FirefoxTheme { + val languageSettings = browserStore.observeAsComposableState { state -> + state.translationEngine.languageSettings + }.value + val translationSupport = browserStore.observeAsComposableState { state -> + state.translationEngine.supportedLanguages + }.value + AutomaticTranslationPreference( - automaticTranslationListPreferences = getAutomaticTranslationListPreferences(), + automaticTranslationListPreferences = getAutomaticTranslationListPreferences( + languageSettings = languageSettings, + translationSupport = translationSupport, + ), onItemClick = { findNavController().navigate( AutomaticTranslationPreferenceFragmentDirections @@ -45,4 +63,28 @@ class AutomaticTranslationPreferenceFragment : Fragment() { } } } + + private fun getAutomaticTranslationListPreferences( + languageSettings: Map<String, LanguageSetting>? = null, + translationSupport: TranslationSupport? = null, + ): List<AutomaticTranslationItemPreference> { + val automaticTranslationListPreferences = + mutableListOf<AutomaticTranslationItemPreference>() + + if (translationSupport != null && languageSettings != null) { + languageSettings.forEach { entry -> + translationSupport.findLanguage(entry.key)?.let { + automaticTranslationListPreferences.add( + AutomaticTranslationItemPreference( + language = it, + automaticTranslationOptionPreference = getAutomaticTranslationOptionPreference( + entry.value, + ), + ), + ) + } + } + } + return automaticTranslationListPreferences + } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt index 20204b2afb..42caba39a5 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteDialogPreferenceFragment.kt @@ -13,6 +13,9 @@ import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.DialogFragment import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs +import mozilla.components.browser.state.action.TranslationsAction +import mozilla.components.browser.state.store.BrowserStore +import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.theme.FirefoxTheme /** @@ -21,6 +24,7 @@ import org.mozilla.fenix.theme.FirefoxTheme class NeverTranslateSiteDialogPreferenceFragment : DialogFragment() { private val args by navArgs<NeverTranslateSiteDialogPreferenceFragmentArgs>() + private val browserStore: BrowserStore by lazy { requireComponents.core.store } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = super.onCreateDialog(savedInstanceState).apply { @@ -37,9 +41,18 @@ class NeverTranslateSiteDialogPreferenceFragment : DialogFragment() { setContent { FirefoxTheme { NeverTranslateSiteDialogPreference( - websiteUrl = args.websiteUrl, - onConfirmDelete = { findNavController().popBackStack() }, - onCancel = { findNavController().popBackStack() }, + websiteUrl = args.neverTranslateSiteUrl, + onConfirmDelete = { + browserStore.dispatch( + TranslationsAction.RemoveNeverTranslateSiteAction( + origin = args.neverTranslateSiteUrl, + ), + ) + findNavController().popBackStack() + }, + onCancel = { + findNavController().popBackStack() + }, ) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt deleted file mode 100644 index 6baf2868ef..0000000000 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSiteListItemPreference.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.translations.preferences.nevertranslatesite - -/** - * NeverTranslateSiteListItemPreference that will appear on [NeverTranslateSitePreferenceFragment] screens. - * - * @property websiteUrl The text that will appear on the item list. - */ -data class NeverTranslateSiteListItemPreference(val websiteUrl: String) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt deleted file mode 100644 index 473d397b86..0000000000 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreferenceFragment.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.fenix.translations.preferences.nevertranslatesite - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.compose.ui.platform.ComposeView -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import org.mozilla.fenix.R -import org.mozilla.fenix.ext.showToolbar -import org.mozilla.fenix.theme.FirefoxTheme - -/** - * A fragment displaying never translate site items list. - */ -class NeverTranslateSitePreferenceFragment : Fragment() { - override fun onResume() { - super.onResume() - showToolbar(getString(R.string.never_translate_site_toolbar_title_preference)) - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle?, - ): View = ComposeView(requireContext()).apply { - setContent { - FirefoxTheme { - NeverTranslateSitePreference( - neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(), - onItemClick = { - findNavController().navigate( - NeverTranslateSitePreferenceFragmentDirections - .actionNeverTranslateSitePreferenceFragmentToNeverTranslateSiteDialogPreferenceFragment( - it.websiteUrl, - ), - ) - }, - ) - } - } - } -} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreference.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitesPreference.kt index e8cf6c1a44..02215ea1fa 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitePreference.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitesPreference.kt @@ -28,13 +28,13 @@ import org.mozilla.fenix.theme.FirefoxTheme /** * Never Translate Site preference screen. * - * @param neverTranslateSiteListPreferences List of [NeverTranslateSiteListItemPreference]s to display. + * @param neverTranslateSitesListPreferences List of site urls to display. * @param onItemClick Invoked when the user clicks on the a item from the list. */ @Composable -fun NeverTranslateSitePreference( - neverTranslateSiteListPreferences: List<NeverTranslateSiteListItemPreference>, - onItemClick: (NeverTranslateSiteListItemPreference) -> Unit, +fun NeverTranslateSitesPreference( + neverTranslateSitesListPreferences: List<String>, + onItemClick: (String) -> Unit, ) { Column( modifier = Modifier @@ -53,13 +53,13 @@ fun NeverTranslateSitePreference( ) LazyColumn { - items(neverTranslateSiteListPreferences) { item: NeverTranslateSiteListItemPreference -> + items(neverTranslateSitesListPreferences) { item: String -> val itemContentDescription = stringResource( id = R.string.never_translate_site_item_list_content_description_preference, - item.websiteUrl, + item, ) TextListItem( - label = item.websiteUrl, + label = item, modifier = Modifier .padding( start = 56.dp, @@ -78,12 +78,10 @@ fun NeverTranslateSitePreference( } @Composable -internal fun getNeverTranslateListItemsPreference(): List<NeverTranslateSiteListItemPreference> { - return mutableListOf<NeverTranslateSiteListItemPreference>().apply { +internal fun getNeverTranslateSitesList(): List<String> { + return mutableListOf<String>().apply { add( - NeverTranslateSiteListItemPreference( - websiteUrl = "mozilla.org", - ), + "mozilla.org", ) } } @@ -92,8 +90,8 @@ internal fun getNeverTranslateListItemsPreference(): List<NeverTranslateSiteList @LightDarkPreview private fun NeverTranslateSitePreferencePreview() { FirefoxTheme { - NeverTranslateSitePreference( - neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(), + NeverTranslateSitesPreference( + neverTranslateSitesListPreferences = getNeverTranslateSitesList(), ) {} } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitesPreferenceFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitesPreferenceFragment.kt new file mode 100644 index 0000000000..429c89f18f --- /dev/null +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/preferences/nevertranslatesite/NeverTranslateSitesPreferenceFragment.kt @@ -0,0 +1,60 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.translations.preferences.nevertranslatesite + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.lib.state.ext.observeAsComposableState +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.requireComponents +import org.mozilla.fenix.ext.showToolbar +import org.mozilla.fenix.theme.FirefoxTheme + +/** + * A fragment displaying never translate site items list. + */ +class NeverTranslateSitesPreferenceFragment : Fragment() { + + private val browserStore: BrowserStore by lazy { requireComponents.core.store } + + override fun onResume() { + super.onResume() + showToolbar(getString(R.string.never_translate_site_toolbar_title_preference)) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?, + ): View = ComposeView(requireContext()).apply { + setContent { + FirefoxTheme { + val neverTranslateSites = browserStore.observeAsComposableState { state -> + state.translationEngine.neverTranslateSites + }.value + + neverTranslateSites?.let { neverTranslateSitesList -> + NeverTranslateSitesPreference( + neverTranslateSitesListPreferences = neverTranslateSitesList, + onItemClick = { + findNavController().navigate( + NeverTranslateSitesPreferenceFragmentDirections + .actionNeverTranslateSitePreferenceToNeverTranslateSiteDialogPreference( + neverTranslateSiteUrl = it, + ), + ) + }, + ) + } + } + } + } +} diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index ebcf83e21f..5262cad451 100644 --- a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -35,6 +35,7 @@ import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.settings.counterPreference import org.mozilla.fenix.components.settings.featureFlagPreference @@ -862,9 +863,6 @@ class Settings(private val appContext: Context) : PreferencesHolder { return touchExplorationIsEnabled || switchServiceIsEnabled } - private val isTablet: Boolean - get() = appContext.resources.getBoolean(R.bool.tablet) - /** * Indicates if the user has enabled the tab strip feature. */ @@ -873,9 +871,6 @@ class Settings(private val appContext: Context) : PreferencesHolder { default = false, ) - val isTabletAndTabStripEnabled: Boolean - get() = isTablet && isTabStripEnabled - var lastKnownMode: BrowsingMode = BrowsingMode.Normal get() { val lastKnownModeWasPrivate = preferences.getBoolean( @@ -944,7 +939,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) val toolbarPosition: ToolbarPosition - get() = if (isTabletAndTabStripEnabled) { + get() = if (appContext.isTabStripEnabled()) { ToolbarPosition.TOP } else if (shouldUseBottomToolbar) { ToolbarPosition.BOTTOM @@ -1594,9 +1589,9 @@ class Settings(private val appContext: Context) : PreferencesHolder { /** * Indicates if the recent saved bookmarks functionality should be visible. */ - var showRecentBookmarksFeature by lazyFeatureFlagPreference( - appContext.getPreferenceKey(R.string.pref_key_recent_bookmarks), - default = { homescreenSections[HomeScreenSection.RECENTLY_SAVED] == true }, + var showBookmarksHomeFeature by lazyFeatureFlagPreference( + appContext.getPreferenceKey(R.string.pref_key_customization_bookmarks), + default = { homescreenSections[HomeScreenSection.BOOKMARKS] == true }, featureFlag = true, ) @@ -2005,6 +2000,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { ) /** + * Indicates if the feature to close synced tabs is enabled. + */ + val enableCloseSyncedTabs: Boolean + get() = FxNimbus.features.remoteTabManagement.value().closeTabsEnabled + + /** * Returns the height of the bottom toolbar. * * The bottom toolbar can consist of a navigation bar, @@ -2033,7 +2034,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { val isToolbarAtTop = toolbarPosition == ToolbarPosition.TOP val toolbarHeight = appContext.resources.getDimensionPixelSize(R.dimen.browser_toolbar_height) - return if (isToolbarAtTop && includeTabStrip && isTabletAndTabStripEnabled) { + return if (isToolbarAtTop && includeTabStrip) { toolbarHeight + appContext.resources.getDimensionPixelSize(R.dimen.tab_strip_height) } else if (isToolbarAtTop) { toolbarHeight diff --git a/mobile/android/fenix/app/src/main/res/drawable/microsurvey_success.xml b/mobile/android/fenix/app/src/main/res/drawable/microsurvey_success.xml new file mode 100644 index 0000000000..2dc8041181 --- /dev/null +++ b/mobile/android/fenix/app/src/main/res/drawable/microsurvey_success.xml @@ -0,0 +1,81 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="149dp" + android:height="136dp" + android:viewportWidth="149" + android:viewportHeight="136"> + <path + android:pathData="M29.01,94.78C27.83,93.06 29.31,87.17 29.4,86.72C29.43,86.41 30.76,79.47 30.83,79.11C30.89,78.92 34.6,71.13 37.02,67.92C39.53,64.6 43.16,61.26 46.71,59.19C53.48,55.22 60.85,52.75 68.97,52.89C70.48,52.92 74.9,53.81 75.26,52.89C75.35,52.68 73.95,49.51 73.95,49.51C73.37,47.95 72.37,46.37 72.89,44.68C73.49,42.75 75.8,40.63 77.07,39.08C79.88,35.66 79.11,33.47 79.04,29.35C78.97,25.11 80.12,20.34 80.92,16.17C81.77,11.78 86.13,-5.44 92.2,3.05C94.42,6.15 96,10.53 97.4,14.07C98.11,15.86 99.13,18.72 99.94,20.47C101.07,22.91 103.7,20.78 106.24,20.95C109.91,21.2 111.91,21.75 115.49,22.61C116.56,22.87 119.37,23.79 120.27,23.37C121.4,22.84 122.79,19.73 123.57,18.67C125.69,15.77 128.32,13.09 130.87,10.56C132.45,9 137.29,4.86 139.76,5.96C142.26,7.08 142.98,14.87 143.41,17.18C144.31,21.95 143.23,33.53 142.53,38.37C141.86,43 140.92,41.29 143.02,45.63C144.02,47.72 146.37,49.94 146.85,52.15C147.34,54.4 145.88,55.45 144.46,57.24C144.32,57.41 144.17,57.59 144.03,57.77C141.75,60.79 139.73,63.12 136.72,65.47C136.46,65.69 130.74,69.63 130.4,70.27C130.4,70.27 129.78,70.84 129.83,71.02C130.05,71.86 131.55,91.47 131.38,91.81C131.12,92.36 130.89,92.92 131.6,93.33C131.71,93.47 131.82,93.61 131.93,93.75L132.59,94.53C133.02,94.99 133.45,95.45 133.88,95.91L134.34,96.41L134.35,96.41C134.73,96.83 135.11,97.25 135.49,97.68C135.57,97.76 135.65,97.84 135.73,97.93C136.13,98.57 136.54,99.21 136.95,99.85C137.13,100.08 137.31,100.3 137.48,100.53C138.02,101.44 138.55,102.35 139.09,103.26L139.27,103.63C139.78,104.55 140.29,105.48 140.8,106.4C140.85,106.52 140.91,106.65 140.96,106.77C141.54,108.1 142.08,109.44 142.73,110.73C143.23,111.74 145.32,117.03 145.43,117.25C146.78,121.04 147.43,126.63 147.37,126.93C147.13,127.32 145.86,127.31 145.74,127.31C145.45,127.16 145.16,127.02 144.86,126.88C143.95,126.53 143.03,126.18 142.12,125.83C141.9,125.77 141.69,125.71 141.48,125.65C141.03,125.52 140.57,125.39 140.11,125.27C139.68,125.14 139.26,125.02 138.82,124.89L137.74,124.68C137.56,124.61 137.39,124.54 137.21,124.48C136.99,124.46 136.76,124.43 136.54,124.41C136.18,124.31 135.81,124.22 135.46,124.11C135.16,124.09 134.85,124.07 134.55,124.04C133.96,123.93 133.37,123.81 132.78,123.69C131.77,123.75 130.77,123.8 129.76,123.86C129.34,123.92 128.92,123.98 128.5,124.04C123.67,125.09 119.04,126.99 114.47,128.86C112.21,129.79 109.86,130.68 107.5,131.2C104.89,131.78 102.27,132.29 99.61,132.64C89.02,134.04 78.94,133.53 68.35,132.16C63.43,131.52 59.03,129.96 54.38,128.32C49.97,126.78 45.09,125.18 41.77,121.7C34.5,114.09 29.77,106.12 29.01,94.76L29.01,94.78Z" + android:fillColor="#FEA619"/> + <path + android:pathData="M141.57,42.25C140.83,43.32 139.26,43.75 138.24,43.4C136.95,42.95 136,42.92 135.38,41.49C134.93,40.49 135.63,38.17 134.93,37.43C134.22,36.69 132.46,37.24 131.54,36.24C130.38,34.97 129.22,33.1 129.47,31.6C130.09,27.71 134.11,17.12 134.79,15.15C135.33,13.57 136.39,9.98 137.69,8.85C141.08,5.94 141.88,11.21 142.75,13.67C144.24,17.87 144.95,28.21 141.57,42.25Z" + android:fillColor="#FE6D2E"/> + <path + android:pathData="M79.31,31.56C80.13,25.51 80.61,19.28 81.99,13.34C82.67,10.44 83.41,7.16 85.25,4.76C87.03,2.44 88.2,4.22 88.81,6.44C90.26,11.76 90.26,15.15 91.17,23.74C89.78,26.28 88.95,27.78 86.97,29.56C84.73,31.56 81.74,34.94 79.12,36.44C78.82,35.16 79.39,31.56 79.3,31.56H79.31Z" + android:fillColor="#FE6D2E"/> + <path + android:pathData="M85.42,133.72C80.63,132.59 75.65,132.78 70.78,132.01C65.74,131.21 61.2,130.46 56.38,128.74C52.09,127.22 47.43,125.97 43.66,123.32C40.64,121.2 36.93,116.88 35.61,113.45C38.29,113.94 40.36,115.4 43.18,115.7C45.73,115.97 47.88,115.94 50.36,115.21C55.69,113.65 59.66,110.51 64.23,107.46C73.96,100.94 84.22,96.12 95.98,94.9C98.9,94.59 100.45,94.43 103.02,95.77C105.76,97.2 108.07,97.55 111.13,97.34C117.22,96.92 123.35,96.77 129.43,96.24C132.84,95.95 134.08,95.73 136.01,98.74C137.59,101.2 139.05,103.72 140.42,106.29C141.71,108.7 142.98,111.13 144.14,113.6C145.24,115.94 145.82,119.65 147.37,121.62V122.58C146.25,124.12 147.11,126.43 145.09,126.81C143.17,127.18 139.39,124.8 137.42,124.36C131.57,123.03 126.87,123.54 121.22,125.41C118.6,126.27 115.99,127.24 113.42,128.25C111.04,129.19 108.91,130.53 106.4,131.09C100.75,132.37 94.93,132.43 89.29,133.71H89.05C88.08,133.19 87.11,133.25 86.15,133.71H85.42L85.42,133.72Z" + android:fillColor="#FE7C01"/> + <path + android:pathData="M125.07,72.66C121.55,73.24 118.08,71.95 114.64,71.42C111.08,70.87 107.45,70.95 103.87,70.74C106.41,66.51 111.35,63.65 115.18,60.73C119.05,57.78 122.9,54.61 125.71,50.59C128.55,46.51 130.01,41.71 129.64,36.74C129.48,34.65 128.05,31.34 130.01,29.71C131.67,28.34 133.35,29.51 134.16,31.13C134.7,32.19 134.67,33.43 135.27,34.54C135.8,35.52 136.57,36.45 137.22,37.35C138.93,39.73 140.77,42.12 142.25,44.65C143.57,46.9 144.68,49.4 145.83,51.74C147.21,54.57 145.66,55.64 143.82,57.96C140.57,62.08 130.44,70.6 129.99,70.69C129.61,71 130.45,71.96 129.13,72.67C128.35,73.08 125.96,72.66 125.06,72.66H125.07Z" + android:fillColor="#FE7C01"/> + <path + android:pathData="M95.5,10.01C96.68,12.88 97.82,15.79 99.04,18.65C99.65,20.1 100.75,21.02 101.88,21.44C103.09,21.89 104.42,20.37 105.75,20.95C100.91,22.4 98.36,23.53 96.29,21C94.01,18.2 94.87,13.32 95.14,10.04C95.26,10.03 95.38,10.02 95.5,10.01Z" + android:fillColor="#FE7C01"/> + <path + android:pathData="M146.4,127.91C142.78,127.43 129.88,124.14 129.5,123.85C128.79,123.3 129.16,123.12 129.03,122.24C128.65,119.76 129,117.89 127.36,115.69C124.59,111.98 119.25,110.18 114.88,109.35C111.75,108.76 112.29,108.53 110.22,106.25C108.69,104.56 106.69,103.35 104.65,102.36C102.25,101.2 99.66,99.91 97.16,99.03C94.38,98.05 91.75,98.9 89,98.49C91.25,95.39 96.22,93.28 99.66,91.79C103.16,90.26 106.37,89.3 110.52,88.41C110.85,88.33 111,87.95 110.8,87.67C109.01,85.25 104.64,80.8 97.52,79.03C97.52,79.03 87.84,77.58 69.45,86.77C70.11,84.31 76.81,77.54 78.99,75.47C85.91,68.86 87.84,68.38 86.87,66.93C86.71,66.77 77.36,55.96 77.19,55.8L73.31,45.89L73.32,44.67C73.65,44.5 77.46,44.79 79.02,45.17C79.49,45.29 86.99,49.06 89.29,50.96C90.3,51.79 94.76,54.96 95.59,56.28C98,49.51 105.64,49.73 108.06,50.08C110.17,50.39 115.87,51.8 118.06,58.27C118.2,58.7 118.69,58.9 119.09,58.68C123.53,56.16 138.08,53.54 139.15,53.38C139.39,53.38 146.69,53.43 146.78,54.34C146.9,55.5 143.02,59.17 142.33,59.92C139.33,63.18 131.08,70.08 130.92,70.08C129.82,70.27 129.56,71.15 129.47,71.77C129.47,71.77 132.85,85.32 130.92,93.06C130.92,93.06 135.12,97.26 135.27,97.42C135.27,97.42 147.63,110.98 146.41,127.91H146.4Z" + android:fillColor="#FEEDD3"/> + <path + android:pathData="M91.46,25.31C89.78,27.24 86.77,29.77 84.94,31.6C83.32,33.21 82.52,32.73 82.52,30.15C83.25,22.4 85.42,17.64 85.42,17.56C87.04,16.47 88.81,19.5 88.81,19.5C88.81,19.5 89.87,18.13 90.74,18.05C90.82,18.45 91.38,24.66 91.46,25.31Z" + android:fillColor="#FEEDD3"/> + <path + android:pathData="M146.89,127.91C145.1,128.01 140.2,125.58 138.32,125.12C135.71,124.47 133.12,123.75 130.42,123.98C130.42,123.98 124.94,124.93 122.33,125.6C119.34,126.36 109.42,131.25 107.21,131.79C102.2,132.99 97.53,133.72 92.21,133.6C92.17,133.49 100.41,128.52 104.31,125.62C106.18,124.23 108,122.71 109.54,120.95C111.31,118.93 111.08,119.69 107.24,118.58C102.3,117.23 97.29,116.1 92.36,114.74C89.26,113.88 89.79,113.88 92.51,111.42C94.09,109.98 96.57,108.07 97.66,106.68C96.14,105.88 88.09,103.68 85.18,102.92C84.86,102.84 84.75,102.44 84.97,102.2C86.03,101.07 88.47,98.48 89.23,97.83C90.1,97.08 91.33,95.86 92.21,95.48C93.66,94.99 95.53,95.08 96.57,94.99C101.5,94.6 104.61,95.2 109.52,95.81C116.63,97.26 118.49,97.4 121.82,98.53C122.17,98.64 122.46,98.25 122.25,97.95C121.22,96.53 120.1,95.15 119.1,93.72C118.83,93.33 119.21,92.82 119.66,92.96C122.66,93.88 125.61,94.84 128.51,96.08C131.57,97.39 135.58,98.91 137.82,101.46C140.04,104.01 141.3,108 142.79,111.02C144.51,114.52 148.71,127.8 146.89,127.9L146.89,127.91Z" + android:fillColor="#FE9A94"/> + <path + android:pathData="M130.41,91.79C128.32,90.65 120.6,85.95 118.75,84.73C115.96,82.9 114.93,78.46 112.35,76.03C109.48,73.32 105.33,73.24 102.15,70.92C99.16,68.74 96.02,64.83 95.94,60.97C98,64.03 101.16,66.92 105.86,67.48C109.24,67.88 114.26,65.68 114.95,64.99C118.33,61.61 117.78,60 118.33,59.19C119.4,57.62 127.64,55.25 132.85,54.35C134.27,54.1 144.7,52.74 145.91,53.5C147.53,54.52 144.04,57.57 143.17,58.64C140.17,62.32 130.44,69.75 129.95,71.14C129.65,71.97 133.51,92.11 130.41,91.78V91.79Z" + android:fillColor="#FE9A94"/> + <path + android:pathData="M129.95,29.66C130.38,27.76 131.48,21.9 132.85,20.47C133.75,21.38 134.79,24.34 134.79,24.34C135.92,24.36 137.82,21.36 138.66,21.92C140.44,23.09 140.88,29.33 140.6,31.12C140.44,32.08 139.26,37.19 138.18,37.41C137.26,37.59 135.19,35.39 134.93,34.62C132.85,28.21 133.34,27.73 129.95,29.66Z" + android:fillColor="#FE9A94"/> + <path + android:pathData="M91.23,25.31C89.78,27.24 87.22,30.01 86.88,29.66C86.39,29.18 88.28,25.15 88.51,24.45C89,22.92 89.96,20.9 90.75,19.5C91.72,21.08 91.23,23.47 91.23,25.31Z" + android:fillColor="#FE9A94"/> + <path + android:pathData="M144.95,112.95C142.22,105.54 138.07,99 132.12,93.52C132.98,86 131.4,78.57 130.27,71.13C130.78,70.79 131.36,70.45 131.87,70.03C133.4,68.73 134.85,67.32 136.45,66.1C140.29,63.17 143.41,59.54 146.41,55.82C147.4,54.6 148.05,53.13 146.94,51.32C145.36,48.77 144.1,46.01 142.74,43.33C142.53,42.92 142.26,42.34 142.4,42C143.38,39.59 143.65,37.04 144.03,34.51C144.63,30.39 145.01,26.26 144.65,22.13C144.16,16.61 143.58,11.09 141.6,5.83C141.11,4.53 140.34,3.82 139.02,4.1C138.02,4.31 136.93,4.62 136.12,5.21C132.85,7.59 129.95,10.39 127.36,13.48C124.89,16.42 122.5,19.42 119.92,22.59C113.98,21.09 107.9,19.47 101.57,20.81C99.17,14.27 96.27,8.07 92.45,2.33C91.87,1.46 90.81,0.76 89.81,0.33C88.15,-0.38 87.11,0.06 86.11,1.53C84.17,4.37 82.59,7.38 81.55,10.67C80.21,14.89 79.18,19.19 78.68,23.6C78.24,27.49 78.16,31.59 78.38,35.35C78.26,35.51 78.11,35.7 77.97,35.89C76.26,38.21 74.53,40.51 72.86,42.86C72,44.07 71.79,45.41 72.35,46.85C72.87,48.16 73.31,49.5 73.8,50.83C73.95,51.26 74.14,51.67 74.41,52.29C73.82,52.25 73.48,52.21 73.13,52.2C71.03,52.13 68.93,52.01 66.83,52.04C65.54,52.05 64.25,52.16 62.98,52.35C60.51,52.71 58.01,53.01 55.63,53.68C49.9,55.3 45.05,58.56 40.74,62.57C37.03,66.02 34.04,70.04 32.21,74.84C31.51,76.68 30.52,78.4 29.75,80.21C28.56,82.98 28.44,85.99 27.92,88.91C27.16,93.24 27.71,97.51 28.8,101.67C29.95,106.11 32,110.21 34.43,114.1C36.81,117.89 39.72,121.17 43.33,123.83C46.27,126.01 49.43,127.81 52.89,129.03C55.44,129.92 58.01,130.81 60.61,131.54C64.06,132.51 67.51,133.7 71.04,134.13C76.3,134.76 81.63,134.99 86.93,135.05C90.82,135.09 94.72,134.68 98.59,134.26C101.29,133.97 103.99,133.45 106.63,132.81C109.24,132.18 111.83,131.39 114.34,130.44C116.96,129.45 119.43,128.1 122.04,127.07C123.93,126.33 125.9,125.5 127.89,125.34C132.67,124.96 137.28,126.2 141.84,127.53C143.11,127.9 144.33,128.31 145.62,128.58C147.02,128.87 148.3,127.69 148.15,126.27C147.66,121.8 146.47,117.04 144.96,112.95H144.95ZM144.43,126.32C141.01,125.16 137.51,124.35 133.98,123.61C130.72,122.93 125.59,122.58 115.46,127.74C112.12,129.44 108.48,130.35 104.86,131.23C102.91,131.71 100.9,131.92 98.94,132.32C94.77,133.16 90.54,133.26 86.33,133.17C81.83,133.07 77.33,132.75 72.86,132.33C70.11,132.07 67.35,131.62 64.67,130.94C61.69,130.18 58.77,129.13 55.86,128.1C52.11,126.78 48.48,125.2 45.24,122.83C40.86,119.62 37.41,115.68 34.81,110.89C33.05,107.63 31.49,104.3 30.51,100.74C29.41,96.71 29.49,92.59 29.82,88.43C30.22,83.48 32.24,79.13 34.28,74.75C35.51,72.09 36.71,69.36 38.82,67.28C41.37,64.79 43.98,62.31 46.81,60.16C50.91,57.05 55.63,55.19 60.76,54.56C63.38,54.23 69.46,53.38 74.96,54.21C75.2,54.24 75.45,54.31 75.59,54.52C76.97,56.53 78.3,58.53 79.71,60.47C80.57,61.64 83.98,64.51 84.95,64.51C85.46,64.51 85.27,63.86 84.93,63.47C83.97,62.4 83.13,61.47 82.29,60.52C78.99,56.81 76.61,52.54 74.67,48.02C74.34,47.25 73.99,46.47 73.8,45.65C73.71,45.29 73.89,44.78 74.11,44.45C75.64,42.23 77.23,40.06 78.76,37.85C79.08,37.38 80.16,36.16 80.11,35.95C79.14,32.4 80.86,21.05 81.45,18.57C82.25,15.26 83.22,11.98 84.3,8.75C85.01,6.61 86.24,3.87 87.99,1.94C88.2,1.71 88.54,1.65 88.81,1.78C91.38,2.92 92.63,5.86 93.8,8.24C95.7,12.09 97.4,16.04 99.18,19.94C99.5,20.63 99.82,21.32 100.14,21.97C100.26,22.23 100.51,22.39 100.79,22.39C103.95,22.37 107.08,22.16 110.17,22.45C113.22,22.74 116.23,23.54 119.46,24.18C119.75,24.24 120.02,24.41 120.19,24.66L120.25,24.73C120.36,24.89 120.59,24.9 120.72,24.75C124.28,20.43 127.61,16.27 131.1,12.24C132.56,10.54 134.36,9.15 136.01,7.62C136.12,7.53 136.79,6.82 137.71,6.42C138.84,5.93 140.16,6.55 140.49,7.74C143.5,18.33 143.91,29.45 140.98,40.28C140.89,40.62 140.65,40.91 140.32,41.03C140.31,41.03 140.31,41.03 140.3,41.04C139.88,41.19 139.68,41.66 139.89,42.05C141.84,45.79 143.73,49.43 145.66,53.15C145.79,53.4 145.76,53.69 145.6,53.92C140.83,60.29 134.77,65.2 128.59,70.45C128.39,70.61 128.3,70.86 128.34,71.12C129.39,77.31 130.82,83.69 130.48,90.42C130.45,90.98 129.83,91.3 129.37,90.99C129.1,90.81 128.84,90.64 128.59,90.47C126.95,89.39 125.3,88.33 123.69,87.22C122.21,86.2 120.74,85.14 119.31,84.04C116.33,81.73 112.84,80.6 109.29,79.53C104.95,78.23 100.5,78.03 96.03,78.01C90.59,77.98 85.2,79 80.15,81.04C76.81,82.39 73.43,83.69 70.16,85.22C66.25,87.05 62.77,89.57 59.49,92.4C55.83,95.58 51.88,98.41 47.01,99.37C44.88,99.79 42.64,99.79 40.46,99.72C39.52,99.69 38.95,99.68 38.55,99.9C38.04,100.17 38.1,100.93 38.63,101.17C39.92,101.76 41.35,101.74 42.73,101.75C49.19,101.85 54.55,99.06 59.35,95.06C62.87,92.11 66.4,89.18 70.57,87.21C74.24,85.47 77.97,83.87 81.76,82.44C85.16,81.15 88.71,80.12 92.37,79.97C95.61,79.84 98.88,80.11 102.13,80.26C107.19,80.49 112.13,81.69 116.31,84.44C121.38,87.78 126.78,90.68 131.11,95.15C134.41,98.56 137.34,102.14 139.7,106.24C142.62,111.3 144.55,116.71 145.72,122.41C145.91,123.32 146.15,124.21 146.32,125.12C146.37,125.38 146.4,125.64 146.43,125.92C146.48,126.45 145.96,126.85 145.47,126.67C145.11,126.54 144.77,126.42 144.44,126.31L144.43,126.32Z" + android:fillColor="#000000"/> + <path + android:pathData="M98.4,64.68C102.43,67.77 106.84,69.03 111.93,67.07C114.47,66.1 116.35,64.6 117.7,62.35C117.94,61.94 118.21,60.58 117.86,60.15C117.73,60.1 117.44,60.98 117.37,61.12C115.73,64.95 112.21,66.59 108.54,67.02C104.23,67.51 100.31,65.93 97.55,62.45C95.76,60.2 94.76,57.59 96.56,54.83C96.7,54.61 97.53,52.89 96.63,53.83C96.24,54.39 95.84,54.95 95.45,55.49C93.22,53.69 91.01,51.9 88.79,50.12C85.13,47.15 81.08,45.15 75.27,44.66C74.7,44.61 73.33,44.66 73.33,45.15C82.53,45.15 89.32,50.75 95.11,56.28C94.63,59.66 95.85,62.71 98.41,64.67L98.4,64.68Z" + android:fillColor="#000000"/> + <path + android:pathData="M131.96,29.15C132.08,29.04 132.27,29.01 132.4,29.1C132.72,29.34 132.94,29.9 133.05,30.49C133.19,31.27 133.44,32.05 133.71,32.8C133.85,33.16 134.3,34.02 134.79,34.02C134.97,33.92 134.79,33.54 134.79,33.54C134.24,31.98 133.86,30.34 133.29,28.79C133.02,28.05 132.46,27.99 131.82,28.33C131.62,28.44 131.09,28.85 130.74,29.06C130.63,29.13 130.48,29.03 130.52,28.89C131.01,26.76 131.93,23.63 132.85,21.44C133.34,21.93 134.14,23.33 134.3,23.86C134.75,25.28 134.76,25.22 135.91,24.31C136.61,23.74 137.36,23.23 138.21,22.63C138.33,22.55 138.51,22.57 138.58,22.7C138.86,23.15 139.55,24.46 139.63,24.83C139.92,26.12 141.08,30.64 138.58,36.27C138.4,36.69 138.18,37.9 138.45,37.7C138.57,37.72 139.53,36.16 139.63,35.96C140.6,34.02 141.55,29.11 140.51,24.85C140.27,23.91 139.88,22.91 139.27,22.18C138.56,21.34 138.48,21.42 137.21,22.41C136.76,22.76 135.76,23.38 135.27,23.86C134.64,22.69 133.85,21.36 133.26,20.28C134.23,17.75 135.28,15.06 136.3,12.36C136.49,11.84 136.56,11.27 136.69,10.73C136.73,9.83 135.71,11.36 135.53,11.78C133.07,17.56 130.97,23.45 129.58,29.59C129.53,29.83 129.49,30.17 129.57,30.5C129.64,30.84 130.04,30.94 130.28,30.72C130.89,30.15 131.39,29.69 131.96,29.16L131.96,29.15Z" + android:fillColor="#000000"/> + <path + android:pathData="M82.91,31.74C82.88,26.97 83.59,22.39 85.89,18.12C86.05,17.82 86.46,17.78 86.69,18.02C87.41,18.79 88.05,19.5 88.71,20.21C89.09,19.63 90.08,18.5 90.27,18.53C90.75,23.37 90.74,23.35 90.88,24.34C90.99,25.08 90.75,25.53 90.14,25.96C89.71,26.27 88.81,27.73 89.47,27.58C90.1,27.13 90.73,26.68 91.37,26.22C91.76,25.95 91.97,25.49 91.93,25.02C91.79,23.45 91.69,21.86 91.47,20.28C90.92,16.31 90.32,12.34 89.69,8.37C89.61,7.88 88.81,5.95 88.59,7.09C89.19,10.59 89.29,10.78 90.26,17.56C89.45,18.05 89.29,18.53 88.81,19.01C88.57,18.68 87.96,18.01 87.75,17.72C86.67,16.23 85.67,16.26 84.86,17.87C82.83,21.89 82.01,26.21 81.91,30.69C81.9,31.09 82.51,32.56 82.9,31.74L82.91,31.74Z" + android:fillColor="#000000"/> + <path + android:pathData="M118.82,58.7C119.3,59.19 121.88,57.86 122.21,57.73C126.08,56.28 128.24,55.55 132.37,54.83C143.5,52.89 146.4,53.86 146.89,53.38C146.87,53.26 146.51,52.89 143.98,52.89C140.11,52.89 135.97,53.61 132.29,54.21C127.84,54.93 123.56,56.27 119.45,58.16C119.09,58.32 118.71,58.6 118.82,58.7Z" + android:fillColor="#000000"/> + <path + android:pathData="M109.14,55.04C109.79,54.06 109.35,53.05 108.17,52.89C107.5,52.81 106.72,52.41 105.27,52.41C103.82,52.41 103.67,52.53 102.85,52.89C101.53,53.48 102.23,54.38 103.33,55.31C104.97,56.69 107.98,56.8 109.14,55.04Z" + android:fillColor="#000000"/> + <path + android:pathData="M98.97,48.05C100.43,48.05 100.51,48.03 100.91,47.57C101.37,47.03 101.68,45.39 101.71,44.66C101.76,43.8 101.88,43.22 101.24,42.11C100.75,41.25 99.46,40.8 98.15,41.99C97.04,44.19 97.53,44.87 97.53,46.12C97.53,46.61 98.25,48.06 98.98,48.06L98.97,48.05Z" + android:fillColor="#000000"/> + <path + android:pathData="M116.4,49.02C117.37,48.54 117.85,47.57 117.92,46.63C118,45.69 118.33,44.67 117.9,43.77C116.89,42.25 114.5,42.92 114.26,44.75C114.14,45.7 113.91,46.61 113.98,47.57C114.07,48.85 115.33,49.56 116.4,49.02Z" + android:fillColor="#000000"/> + <path + android:pathData="M100.91,60.64C103.42,62.55 106.09,63.02 109.17,62.75C109.78,62.69 110.59,62.09 110.91,61.64C110.99,61.53 110.83,61.4 110.7,61.43C106.83,62.32 103.34,61.74 100.39,58.9C100.29,58.8 100.18,58.88 100.09,58.99C99.95,59.19 100.22,60.11 100.92,60.64L100.91,60.64Z" + android:fillColor="#000000"/> + <path + android:pathData="M101.53,50.69C101.76,50.67 102,50.63 102.24,50.58C104.88,49.97 107.45,49.81 110.13,50.71C110.95,50.98 111.75,51.34 112.75,51.89C112.91,51.98 114.83,53.45 113.49,51.92C111.22,49.32 103.86,48.55 101.36,50.55C101.42,50.6 101.48,50.69 101.53,50.68V50.69Z" + android:fillColor="#000000"/> + <path + android:pathData="M30.25,21.19C32.19,21.19 34.12,21.19 36.06,21.19C43.66,23.1 50.13,24.8 55.96,30.49C61.78,36.17 64.4,43.12 65.82,50.96V56.77C63.93,64.39 62.19,70.9 56.48,76.72C50.82,82.51 43.86,85.1 36.06,86.53H30.25C22.65,84.63 16.18,82.93 10.35,77.24C4.53,71.56 1.91,64.6 0.49,56.77C0.49,54.83 0.49,52.89 0.49,50.96C2.39,43.34 4.12,36.83 9.83,31C15.5,25.22 22.45,22.63 30.25,21.19Z" + android:fillColor="#84D09A"/> + <path + android:pathData="M9.97,30.48C15.84,24.33 24.42,20.69 32.94,20.47C41.42,20.25 49.75,24.04 55.93,29.69C58.86,32.37 68.96,42.73 66.79,57.73C66.54,59.18 64.63,85.14 35.09,87.25C21.54,88.22 12.57,80.81 9.65,77.7C3.61,71.26 0.24,64.99 0,54.83C0.24,44.66 3.95,36.77 9.96,30.47L9.97,30.48ZM64.65,55.33C65.58,40.52 54.62,27.1 40.53,23.4C27.94,20.1 13.9,26.48 7.23,37.35C0.41,48.46 0.85,62.4 8.41,72.96C16.03,83.62 31.61,87.99 43.94,83.65C55.59,79.55 64.96,67.96 64.64,55.33H64.65Z" + android:fillColor="#354158"/> + <path + android:pathData="M48.64,36.92C50.58,38.86 51.26,39.57 52.6,40.93C53.57,41.9 53.97,42.73 56.39,45.39C46.22,54.83 37.03,64.51 26.87,74.43C26.82,74.43 14.69,62.32 8.72,56.28C8.72,56.2 12.25,52.65 13.9,50.98C15.09,49.79 17.19,48.05 17.19,48.05C17.19,48.05 21.28,52.29 22.67,53.73C23.44,54.52 26.87,58.22 26.87,58.22C26.87,58.22 31.23,53.83 32.13,52.96C33.97,51.18 35.8,49.39 37.62,47.58C41.25,43.99 45.08,40.59 48.64,36.92Z" + android:fillColor="#E5FEEC"/> +</vector> diff --git a/mobile/android/fenix/app/src/main/res/layout/fragment_address_editor.xml b/mobile/android/fenix/app/src/main/res/layout/fragment_address_editor.xml index 4f6e4e14d7..2b02b16a4f 100644 --- a/mobile/android/fenix/app/src/main/res/layout/fragment_address_editor.xml +++ b/mobile/android/fenix/app/src/main/res/layout/fragment_address_editor.xml @@ -354,7 +354,7 @@ android:text="@string/addressess_delete_address_button" android:textAlignment="center" android:textAllCaps="false" - android:textColor="@color/fx_mobile_text_color_warning" + android:textColor="@color/fx_mobile_text_color_critical" android:visibility="gone" app:layout_constraintTop_toBottomOf="@+id/email_layout" app:layout_constraintStart_toStartOf="parent" /> diff --git a/mobile/android/fenix/app/src/main/res/layout/fragment_browser.xml b/mobile/android/fenix/app/src/main/res/layout/fragment_browser.xml index b61d82c1b9..43794b80d5 100644 --- a/mobile/android/fenix/app/src/main/res/layout/fragment_browser.xml +++ b/mobile/android/fenix/app/src/main/res/layout/fragment_browser.xml @@ -45,7 +45,7 @@ android:clickable="true" android:focusable="true" android:visibility="gone" - app:findInPageNoMatchesTextColor="?attr/textWarning" + app:findInPageNoMatchesTextColor="?attr/textCritical" app:findInPageButtonsTint="?attr/textPrimary" app:findInPageResultCountTextColor="?attr/textPrimary" /> @@ -78,6 +78,8 @@ android:layout_height="wrap_content" android:layout_gravity="bottom" android:visibility="gone" + android:clickable="true" + android:focusable="true" android:elevation="@dimen/browser_fragment_toolbar_elevation"/> <FrameLayout diff --git a/mobile/android/fenix/app/src/main/res/layout/fragment_credit_card_editor.xml b/mobile/android/fenix/app/src/main/res/layout/fragment_credit_card_editor.xml index 76211b90b2..1c22e91ec9 100644 --- a/mobile/android/fenix/app/src/main/res/layout/fragment_credit_card_editor.xml +++ b/mobile/android/fenix/app/src/main/res/layout/fragment_credit_card_editor.xml @@ -180,7 +180,7 @@ android:text="@string/credit_cards_delete_card_button" android:textAlignment="center" android:textAllCaps="false" - android:textColor="@color/fx_mobile_text_color_warning" + android:textColor="@color/fx_mobile_text_color_critical" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" /> diff --git a/mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml b/mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml index f33313ff0d..1e59de2f0b 100644 --- a/mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml +++ b/mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml @@ -119,6 +119,14 @@ android:id="@+id/action_global_addonsManagementFragment" app:destination="@id/addons_management_graph" /> <action + android:id="@+id/action_loginsListFragment" + app:destination="@id/savedLogins" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + + <action android:id="@+id/action_global_trackingProtectionFragment" app:destination="@id/trackingProtectionFragment" /> <action @@ -208,6 +216,13 @@ android:name="scrollToCollection" android:defaultValue="false" app:argType="boolean" /> + <action + android:id="@+id/action_homeFragment_to_loginsListFragment" + app:destination="@id/savedLogins" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> </fragment> <dialog @@ -304,7 +319,14 @@ app:destination="@id/reviewQualityCheckFragment" /> <action android:id="@+id/action_browserFragment_to_translationsDialogFragment" - app:destination="@id/translations_graph" /> + app:destination="@id/translationsDialogFragment" /> + <action + android:id="@+id/action_loginsListFragment" + app:destination="@id/savedLogins" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> </fragment> <fragment @@ -616,6 +638,13 @@ app:popEnterAnim="@anim/slide_in_left" app:popExitAnim="@anim/slide_out_right" /> <action + android:id="@+id/action_settingsFragment_to_translationsSettingsFragment" + app:destination="@id/translations_settings_graph" + app:enterAnim="@anim/slide_in_right" + app:exitAnim="@anim/slide_out_left" + app:popEnterAnim="@anim/slide_in_left" + app:popExitAnim="@anim/slide_out_right" /> + <action android:id="@+id/action_settingsFragment_to_addonsFragment" app:destination="@id/addons_management_graph" app:enterAnim="@anim/slide_in_right" @@ -1422,33 +1451,24 @@ </fragment> </navigation> - <navigation - android:id="@+id/translations_graph" - app:startDestination="@id/translationsDialogFragment"> + <dialog + android:id="@+id/translationsDialogFragment" + android:name="org.mozilla.fenix.translations.TranslationsDialogFragment"> <argument - android:name="sessionId" - app:argType="string" - app:nullable="true" /> - <dialog - android:id="@+id/translationsDialogFragment" - android:name="org.mozilla.fenix.translations.TranslationsDialogFragment"> - <argument - android:name="sessionId" - app:argType="string" /> - <argument - android:name="translationsDialogAccessPoint" - android:defaultValue="Translations" - app:argType="org.mozilla.fenix.translations.TranslationsDialogAccessPoint" /> - <action - android:id="@+id/action_translationsDialogFragment_to_translationSettingsFragment" - app:destination="@id/translationSettingsFragment" /> - </dialog> + android:name="translationsDialogAccessPoint" + android:defaultValue="Translations" + app:argType="org.mozilla.fenix.translations.TranslationsDialogAccessPoint" /> + <action + android:id="@+id/action_translationsDialogFragment_to_translationSettingsFragment" + app:destination="@id/translations_settings_graph" /> + </dialog> + + <navigation + android:id="@+id/translations_settings_graph" + app:startDestination="@id/translationSettingsFragment"> <fragment android:id="@+id/translationSettingsFragment" android:name="org.mozilla.fenix.translations.TranslationSettingsFragment"> - <argument - android:name="sessionId" - app:argType="string" /> <action android:id="@+id/action_translationSettingsFragment_to_translationsDialogFragment" app:destination="@id/translationsDialogFragment" @@ -1461,7 +1481,7 @@ android:id="@+id/action_translationSettingsFragment_to_automaticTranslationPreferenceFragment" app:destination="@id/automaticTranslationPreferenceFragment" /> <action - android:id="@+id/action_translationSettingsFragment_to_neverTranslateSitePreferenceFragment" + android:id="@+id/action_translationSettings_to_neverTranslateSitePreference" app:destination="@id/neverTranslateSitePreferenceFragment" /> </fragment> <fragment @@ -1480,16 +1500,16 @@ </fragment> <fragment android:id="@+id/neverTranslateSitePreferenceFragment" - android:name="org.mozilla.fenix.translations.preferences.nevertranslatesite.NeverTranslateSitePreferenceFragment"> + android:name="org.mozilla.fenix.translations.preferences.nevertranslatesite.NeverTranslateSitesPreferenceFragment"> <action - android:id="@+id/action_neverTranslateSitePreferenceFragment_to_neverTranslateSiteDialogPreferenceFragment" + android:id="@+id/action_neverTranslateSitePreference_to_neverTranslateSiteDialogPreference" app:destination="@id/neverTranslateSiteDialogPreferenceFragment" /> </fragment> <dialog android:id="@+id/neverTranslateSiteDialogPreferenceFragment" android:name="org.mozilla.fenix.translations.preferences.nevertranslatesite.NeverTranslateSiteDialogPreferenceFragment"> <argument - android:name="websiteUrl" + android:name="neverTranslateSiteUrl" app:argType="string" /> </dialog> <fragment @@ -1519,8 +1539,18 @@ <navigation android:id="@+id/menu_graph" app:startDestination="@id/menuDialogFragment"> + <argument + android:name="accesspoint" + app:argType="org.mozilla.fenix.components.menu.MenuAccessPoint" /> <dialog android:id="@+id/menuDialogFragment" - android:name="org.mozilla.fenix.components.menu.MenuDialogFragment" /> + android:name="org.mozilla.fenix.components.menu.MenuDialogFragment"> + <argument + android:name="accesspoint" + app:argType="org.mozilla.fenix.components.menu.MenuAccessPoint" /> + <action + android:id="@+id/action_menuDialogFragment_to_translationsDialogFragment" + app:destination="@id/translationsDialogFragment" /> + </dialog> </navigation> </navigation> diff --git a/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json b/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json index f0efae5b6d..d67e48ce88 100644 --- a/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json +++ b/mobile/android/fenix/app/src/main/res/raw/initial_experiments.json @@ -68,7 +68,7 @@ "channel": "release", "userFacingName": "Android Onboarding - Remove Sync Card", "userFacingDescription": "Mobile Onboarding experiment", - "isEnrollmentPaused": false, + "isEnrollmentPaused": true, "isRollout": false, "bucketConfig": { "randomizationUnit": "nimbus_id", @@ -160,7 +160,7 @@ ], "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('126.!') >= 0) && (language in ['en'])))", "startDate": "2024-04-30", - "enrollmentEndDate": null, + "enrollmentEndDate": "2024-05-30", "endDate": null, "proposedDuration": 42, "proposedEnrollment": 14, @@ -169,111 +169,6 @@ "localizations": null, "locales": null, "publishedDate": "2024-04-30T20:18:06.070479Z" - }, - { - "schemaVersion": "1.12.0", - "slug": "splash-screen-max-duration-test-lower-times", - "id": "splash-screen-max-duration-test-lower-times", - "arguments": {}, - "application": "org.mozilla.firefox", - "appName": "fenix", - "appId": "org.mozilla.firefox", - "channel": "release", - "userFacingName": "Splash screen max duration test - lower times", - "userFacingDescription": "Testing a splashscreen on app launch.", - "isEnrollmentPaused": true, - "isRollout": false, - "bucketConfig": { - "randomizationUnit": "nimbus_id", - "namespace": "fenix-splash-screen-release-3", - "start": 0, - "count": 10000, - "total": 10000 - }, - "featureIds": [ - "splash-screen" - ], - "probeSets": [], - "outcomes": [ - { - "slug": "onboarding", - "priority": "primary" - }, - { - "slug": "default-browser", - "priority": "primary" - } - ], - "branches": [ - { - "slug": "control", - "ratio": 1, - "feature": { - "featureId": "this-is-included-for-mobile-pre-96-support", - "enabled": false, - "value": {} - }, - "features": [ - { - "featureId": "splash-screen", - "enabled": true, - "value": { - "enabled": true, - "maximum_duration_ms": 0 - } - } - ] - }, - { - "slug": "treatment-a", - "ratio": 1, - "feature": { - "featureId": "this-is-included-for-mobile-pre-96-support", - "enabled": false, - "value": {} - }, - "features": [ - { - "featureId": "splash-screen", - "enabled": true, - "value": { - "enabled": true, - "maximum_duration_ms": 1750 - } - } - ] - }, - { - "slug": "treatment-b", - "ratio": 1, - "feature": { - "featureId": "this-is-included-for-mobile-pre-96-support", - "enabled": false, - "value": {} - }, - "features": [ - { - "featureId": "splash-screen", - "enabled": true, - "value": { - "enabled": true, - "maximum_duration_ms": 2500 - } - } - ] - } - ], - "targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('124.!') >= 0) && (region in ['AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW'])))", - "startDate": "2024-03-13", - "enrollmentEndDate": "2024-04-03", - "endDate": null, - "proposedDuration": 56, - "proposedEnrollment": 28, - "referenceBranch": "control", - "featureValidationOptOut": false, - "localizations": null, - "locales": null, - "publishedDate": "2024-03-13T15:04:41.938148Z" } ] } diff --git a/mobile/android/fenix/app/src/main/res/values-azb/strings.xml b/mobile/android/fenix/app/src/main/res/values-azb/strings.xml index 38bae805ff..1be1d508e8 100644 --- a/mobile/android/fenix/app/src/main/res/values-azb/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-azb/strings.xml @@ -58,13 +58,22 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">سون ساخلانانلار</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">سون ساخلانانلار</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">بوتون ساخلانمیش بوکمارکلاری گؤستر</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">بوتون ساخلانمیش بوکمارکلاری گؤستر</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">قالدیر</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">قالدیر</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">بوکمارکلار</string> + + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">بوتون بوکمارکلاری گؤستر</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">قالدیر</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s موزیلا طرفیندن دوزهدیلمیش.</string> @@ -210,6 +219,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">تاخیلانلار</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">اوزانتیلار</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">اوزانتیْلار مودیریتی</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">داها چوْخ اوزانتیْ گؤر</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">حساب بیلگیلری</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -230,6 +243,8 @@ <string name="browser_menu_open_in_regular_tab">معمولی تاغدا آچ</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">آناصفحهیه آرتیر</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">آنا اکرانا آرتیر…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">قوْش</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -238,12 +253,18 @@ <string name="browser_menu_find_in_page">صفحهده تاپ</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">یارپاقدا آختار…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">صفحهنی ترجومه ائله</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">مجموعهده ساخلا…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">مجموعهده ساخلا</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">پایلاش</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">پایلاش…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s ایله آچ</string> @@ -287,10 +308,33 @@ The first parameter is the name of the app defined in app_name (for example: Fenix)--> <string name="browser_menu_new_in_firefox">%1$s-دا یئنی</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">دسکتاپ سایتا گئچ</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">آلتلر</string> <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">ساخلا</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">بو صفحهنی بوکمارک ائله</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">بوکمارک دوزهلیشی</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF اوْلاراق ساخلا…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">اوْخوجو گؤرونوشونو آچ</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">اوْخوجو گؤرونوشونو باغلا</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">صفحهنی ترجومه ائله…</string> + + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s دیلینه چئویر</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">پرینت…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">بوردا هئچ اوزانتی یوخ</string> @@ -391,8 +435,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">فایرفاکس گیزللیک بیلدیریمی</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">گیزلیلیک بیلدیریمیزده آرتیق بیلین</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">سیزی قوروماغی سئویریک</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -605,6 +647,10 @@ <string name="preferences_account_sync_error">دؤنگلی ایدامه وئرمک اوچون یئنیدن باغلانین.</string> <!-- Preference for language --> <string name="preferences_language">دیل</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">ترجومه</string> + <!-- Preference for translations --> + <string name="preferences_translations">ترجومهلر</string> <!-- Preference for data choices --> <string name="preferences_data_choices">دیتا سئچیمی</string> <!-- Preference for data collection --> @@ -672,8 +718,11 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">ایجازه وئریلمهدی</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">سایتی سیل</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">لازیم</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">گؤیوللو</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">بوتون سایتلار اوچون ایجازه وئر</string> @@ -696,7 +745,7 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">قاباقکی تاغلارا قاییت</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">سوْن بوکمارکلار</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">سوْن بوکمارکلار</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">سون باخیلانلار</string> @@ -780,8 +829,6 @@ <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">بوُکمارکلار</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">گیریشلر</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">رمزلر</string> <!-- Preference for syncing tabs --> @@ -810,8 +857,6 @@ The first parameter is the application name, the second is the device manufacturer name and the third is the device model. --> <string name="default_device_name_2">%1$s - %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">اعتباری کارتلار</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">اؤدمه آپاریْلاری</string> diff --git a/mobile/android/fenix/app/src/main/res/values-be/strings.xml b/mobile/android/fenix/app/src/main/res/values-be/strings.xml index af5728eb07..0c182fa6af 100644 --- a/mobile/android/fenix/app/src/main/res/values-be/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-be/strings.xml @@ -48,12 +48,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Нядаўна захаваныя</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Нядаўна захаваныя</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Паказаць усе захаваныя закладкі</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Паказаць усе захаваныя закладкі</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Выдаліць</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Выдаліць</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Закладкі</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Паказаць усе закладкі</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Выдаліць</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s распрацаваны Mozilla.</string> @@ -141,8 +149,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Прыватная картка</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Хуткі доступ да пароляў</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Паролі</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Хуткі доступ да пароляў</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -186,6 +196,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Дадаткі</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Пашырэнні</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Кіраваць пашырэннямі</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Адкрыйце для сябе іншыя пашырэнні</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Ваш уліковы запіс</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -204,20 +218,28 @@ <string name="browser_menu_open_in_regular_tab">Адкрыць у звычайнай картцы</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Дадаць на хатні экран</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Дадаць на хатні экран…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Усталяваць</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Сінхранізаваць ізноў</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Знайсці на старонцы</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Знайсці на старонцы…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Перакласці старонку</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Захаваць у калекцыі…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Захаваць у калекцыі</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Падзяліцца</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Падзяліцца…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Адкрыць у %1$s</string> @@ -246,7 +268,50 @@ <string name="browser_menu_customize_home_1">Уладкаваць хатнюю старонку</string> <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> - <string name="browser_menu_sign_in" tools:ignore="UnusedResources">Увайсці</string> + <string name="browser_menu_sign_in">Увайсці</string> + + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Сінхранізуйце паролі, карткі і іншае</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Увайдзіце зноў, каб сінхранізаваць</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Сінхранізацыя прыпынена</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Прыватная картка</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Паролі</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Новае ў %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Пераключыцца на версію для ПК</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Прылады</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Захаваць</string> + + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Дадаць закладку на старонку</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Рэдагаваць закладку</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Захаваць як PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Уключыць рэжым чытання</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Выключыць рэжым чытання</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Перакласці старонку…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Перакладзена на %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Друкаваць…</string> + + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">Тут няма пашырэнняў</string> <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> @@ -340,13 +405,13 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Паведамленне аб прыватнасці Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Даведайцеся больш у нашым паведамленні аб прыватнасці</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Нам падабаецца забяспечваць вашу бяспеку</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. Note: The word "Firefox" should NOT be translated --> <string name="juno_onboarding_default_browser_title_nimbus_3" tools:ignore="UnusedResources">Даведайцеся, чаму мільёны людзей любяць Firefox</string> + <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_title_nimbus_4" tools:ignore="UnusedResources">Бяспечнае агляданне з вялікім выбарам</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_description_nimbus_3">Наш браўзер, падтрыманы некамерцыйнай арганізацыяй, дапамагае не даваць кампаніям таемна сачыць за вамі ў сеціве.</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> @@ -549,6 +614,10 @@ <string name="preferences_account_sync_error">Падключыцеся, каб аднавіць сінхранізацыю</string> <!-- Preference for language --> <string name="preferences_language">Мова</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Пераклад</string> + <!-- Preference for translations --> + <string name="preferences_translations">Пераклады</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Выбар дадзеных</string> <!-- Preference for data collection --> @@ -605,6 +674,8 @@ <string name="preferences_extensions">Пашырэнні</string> <!-- Preference for installing a local add-on --> <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Усталяваць дадатак з файла</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Усталяваць пашырэнне з файла</string> <!-- Preference for notifications --> <string name="preferences_notifications">Абвесткі</string> @@ -613,6 +684,14 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Не дазволена</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Абавязкова</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Неабавязкова</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Дазволіць для ўсіх сайтаў</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Уласная калекцыя дадаткаў</string> @@ -632,7 +711,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Пераход назад да</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Нядаўнія закладкі</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Нядаўнія закладкі</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Закладкі</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Нядаўна наведаныя</string> @@ -684,6 +765,8 @@ <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Даступныя новыя дадаткі</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Даступныя новыя пашырэнні</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Азнаёмцеся з больш за 100 новых пашырэнняў, якія дазваляюць зрабіць Firefox вашым уласным.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> @@ -712,8 +795,6 @@ <string name="preferences_sync_history">Гісторыю</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Закладкі</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Лагіны</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Паролі</string> <!-- Preference for syncing tabs --> @@ -740,8 +821,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s на %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Крэдытныя карты</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Спосабы аплаты</string> <!-- Preference for syncing addresses --> @@ -1698,12 +1777,8 @@ <string name="add_to_homescreen_description_2">Вы можаце лёгка дадаць гэты вэб-сайт на хатні экран вашай прылады, каб мець да яго імгненны доступ і аглядаць хутчэй, нібыта гэта асобная праграма.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Лагіны і паролі</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Паролі</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Захаванне лагінаў і пароляў</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Захоўваць паролі</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Пытаць пра захаванне</string> @@ -1718,41 +1793,23 @@ <string name="preferences_android_autofill">Аўтазапаўненне ў іншых праграмах</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Запаўняць імёны карыстальнікаў і паролі ў іншых праграмах на вашай прыладзе.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Дадаць лагін</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Дадаць пароль</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Сінхранізацыя лагінаў</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Сінхранізаваць паролі</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Сінхранізаваць лагіны паміж прыладамі</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Сінхранізаваць паролі паміж прыладамі</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Захаваныя лагіны</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Захаваныя паролі</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Лагіны, якія вы захаваеце альбо сінхранізуеце праз %s, з’явяцца тут.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Даведацца больш пра сінхранізацыю.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Даведайцеся больш пра сінхранізацыю</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Выключэнні</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Не захаваныя лагіны і паролі з’явяцца тут.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Лагіны і паролі не будуць захаваны для гэтых сайтаў.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Выдаліць усе выключэнні</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Шукаць лагіны</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Пошук пароляў</string> <!-- The header for the site that a login is for --> @@ -1782,18 +1839,12 @@ <string name="saved_login_reveal_password">Паказаць пароль</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Схаваць пароль</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Разблакуйце, каб пабачыць захаваныя лагіны</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Разблакуйце, каб пабачыць захаваныя паролі</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Абараніце свае лагіны і паролі</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Абараніце захаваныя паролі</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Наладзьце графічны ключ, пін ці пароль для блакавання прылады, каб абараніць захаваныя лагіны і паролі ад крадзяжу, калі Вашай прыладай завалодае хтосьці іншы.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Наладзьце графічны ключ, пін або пароль для блакавання прылады, каб абараніць захаваныя паролі, калі хтосьці іншы атрымае доступ да вашай прылады.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Пазней</string> @@ -1810,9 +1861,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Апошняе выкарыстанне</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Меню сартавання лагінаў</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Меню сартавання пароляў</string> @@ -1821,27 +1869,17 @@ <string name="preferences_autofill">Аўтазапаўненне</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Адрасы</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Крэдытныя карты</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Спосабы аплаты</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Захоўваць і аўтаматычна запаўняць карты</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Захоўваць і запаўняць спосабы аплаты</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Дадзеныя зашыфраваны</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Сінхранізаваць карты паміж прыладамі</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Сінхранізаваць карты</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Дадаць крэдытную карту</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Дадаць карту</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Кіраванне захаванымі картамі</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Кіраваць картамі</string> @@ -1849,13 +1887,9 @@ <string name="preferences_addresses_add_address">Дадаць адрас</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Кіраваць адрасамі</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Захоўваць і аўтаматычна запаўняць адрасы</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Захоўваць і запаўняць адрасы</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Уключаць звесткі, такія як нумары, адрасы электроннай пошты і дастаўкі</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Уключае нумары тэлефонаў і адрасы электроннай пошты</string> @@ -1880,8 +1914,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Выдаліць карту</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы ўпэўнены, што жадаеце выдаліць гэту крэдытную карту?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Выдаліць карту?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Выдаліць</string> @@ -1894,23 +1926,14 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Захаваныя карты</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Калі ласка, увядзіце сапраўдны нумар крэдытнай карты</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Увядзіце сапраўдны нумар карты</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Калі ласка, запоўніце гэтае поле</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Дадайце імя</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Разблакуйце, каб пабачыць захаваныя карты</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Абараніце свае крэдытныя карты</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Абараніце захаваныя спосабы аплаты</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Наладзьце графічны ключ, пін або пароль для блакавання прылады, каб абараніць захаваныя крэдытныя карты, калі хтось іншы атрымае доступ да вашай прылады.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Наладзіць зараз</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> @@ -1918,8 +1941,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Разблакуйце сваю прыладу</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Разблакуйце, каб выкарыстаць захаваную інфармацыю крэдытнай карты</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Разблакуйце, каб выкарыстаць захаваныя спосабы аплаты</string> @@ -1929,12 +1950,6 @@ <string name="addresses_edit_address">Змяніць адрас</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Кіраваць адрасамі</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Імя</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Імя па бацьку</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Прозвішча</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Назва</string> <!-- The header for the street address of an address --> @@ -1961,8 +1976,6 @@ <string name="addressess_delete_address_button">Выдаліць адрас</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы ўпэўнены, што жадаеце выдаліць гэты адрас?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Выдаліць гэты адрас?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Выдаліць</string> @@ -2066,49 +2079,29 @@ <string name="login_menu_delete_button">Выдаліць</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Змяніць</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы сапраўды хочаце выдаліць гэтае лагін?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Вы ўпэўнены, што хочаце выдаліць гэты пароль?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Выдаліць</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Адмяніць</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Налады лагіна</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Параметры пароля</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Тэкставае поле для рэдагавання вэб-адраса для ўваходу ў сістэму.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Тэкставае поле для рэдагавання адраса сайта.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Тэкставае поле для рэдагавання імені карыстальніка для ўваходу ў сістэму.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Тэкставае поле для рэдагавання імя карыстальніка.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Тэкставае поле для рэдагавання пароля для ўваходу ў сістэму.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Тэкставае поле для рэдагавання пароля.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Захаваць змены ва ўваходных даных.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Захаваць змены.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Рэдагаванне</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Змяніць пароль</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Дадаць новы лагін</string> <!-- The page title for adding new password. --> <string name="add_login_2">Дадаць пароль</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Патрабуецца пароль</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Увядзіце пароль</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Патрабуецца імя карыстальніка</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Увядзіце імя карыстальніка</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Патрабуецца імя хоста</string> @@ -2474,7 +2467,7 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">На жаль, мы пакуль не падтрымліваем %1$s.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Падрабязней</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Падрабязней</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> @@ -2490,7 +2483,9 @@ <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Параметры перакладу</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Параметры перакладу</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Параметры перакладу</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Заўсёды прапаноўваць пераклад</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2608,12 +2603,14 @@ <string name="debug_drawer_title">Інструменты адладкі</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Перайсці назад</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Інструменты картак</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Колькасць картак</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Дзейныя</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Дзейныя</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Неактыўныя</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2630,4 +2627,35 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Дадаць да неактыўных картак</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Дадаць да прыватных картак</string> -</resources> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Працягнуць</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Паведамленне аб прыватнасці</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Падаць</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Закрыць</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Дзякуй за ваш водгук!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Вельмі задаволены</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Задаволены</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Нейтральны</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Незадаволены</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Вельмі незадаволены</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Лагіны</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Бягучы дамен: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Дадаць несапраўдны лагін для гэтага дамена</string> + </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-bg/strings.xml b/mobile/android/fenix/app/src/main/res/values-bg/strings.xml index 63fe480125..721c694545 100644 --- a/mobile/android/fenix/app/src/main/res/values-bg/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-bg/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Добавки</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Разширения</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Управление на добавки</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Открийте още разширения</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Информация за профила</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Отваряне в обикновен раздел</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Добавяне към екрана</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Добавяне към началния екран…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Инсталиране</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,9 +236,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Превеждане на страницатa</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Запазване в списък…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Добавяне към списък</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Споделяне</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Споделяне…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Отваряне в %1$s</string> @@ -287,6 +297,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Запазване</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Отбележете тази страница</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Промяна на отметка</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Запазване като PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Включете изгледа за четене</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Изключете изгледа за четене</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Превеждане на страницата…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Преведено на %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Отпечатване…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Няма разширения</string> @@ -383,8 +411,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">бележка за поверителността на Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Научете повече в нашата политика за поверителност</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Обичаме да ви пазим в безопасност</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -591,7 +617,9 @@ <!-- Preference for language --> <string name="preferences_language">Език</string> <!-- Preference for translation --> - <string name="preferences_translation">Превод</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Превод</string> + <!-- Preference for translations --> + <string name="preferences_translations">Преводи</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Избор на данни</string> <!-- Preference for data collection --> @@ -664,10 +692,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Задължително</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">По желание</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Четене и промяна на данни на уебсайта</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Изтриване на уебсайт</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Разрешено за всички сайтове</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -793,8 +817,6 @@ <string name="preferences_sync_history">История</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Отметки</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Регистрации</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Пароли</string> <!-- Preference for syncing tabs --> @@ -820,8 +842,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s на %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Банкови карти</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Начини на плащане</string> <!-- Preference for syncing addresses --> @@ -837,6 +857,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Раздел от %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s затворени раздела: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Преглед на наскоро затворените раздели</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Изключения</string> @@ -1777,12 +1805,8 @@ <string name="add_to_homescreen_description_2">Можете лесно да добавите тази страница към началния екран, за да имате бърз достъп до нея, подобно на приложение.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Регистрации и пароли</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Пароли</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Запазване на регистрации и пароли</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Запазване на пароли</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Питане за запазване</string> @@ -1797,47 +1821,29 @@ <string name="preferences_android_autofill">Попълване в други приложения</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Попълват се потребителски имена и пароли в други приложения на устройството.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавяне на регистрация</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Добавяне на парола</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронизиране на регистрации</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Синхронизиране на пароли</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронизиране на регистрации между устройства</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Синхронизиране на пароли между устройства</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Запазени регистрации</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Запазени пароли</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Тук се показват нещата, които запазвате или синхронизирате във %s.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Паролите, които запазите или синхронизирате с %s ще бъдат изброени тук. Всички запазени пароли са шифровани. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Научете повече за Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Научете повече за синхронизирането</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Изключения</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Тук се показват регистрации и пароли, които не са запазени.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s няма да запазва пароли за сайтове, изброени тук.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Следните страници няма да запазват регистрации и пароли.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s няма да запази пароли за тези сайтове.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Изтриване на всички</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Търсене на регистрация</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Търсене на пароли</string> <!-- The header for the site that a login is for --> @@ -1867,17 +1873,11 @@ <string name="saved_login_reveal_password">Показване на парола</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Скриване на парола</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Отключете, за да видите запазените регистрации</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Отключете, за да видите запазените пароли</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Защитете вашите данни за вход</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Защитете запазените пароли</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройте фигура, PIN или парола за отключване на устройството, за да защитите запазените регистрации и пароли, в случай че някой друг има достъп до него.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Настройте фигура, PIN или парола за отключване на устройството, за да защитите запазените пароли от достъп, ако някой друг има вашето устройство.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">По-късно</string> @@ -1893,8 +1893,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Име (А-Я)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Последно използване</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Меню за сортиране на регистрации</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Меню за сортиране на пароли</string> @@ -1904,28 +1902,18 @@ <string name="preferences_autofill">Автоматично попълване</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Адреси</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Банкови карти</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Начини на плащане</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Запазване и автоматично попълване на карти</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Запазване и попълване на начини на плащане</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Данните са криптирани</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s шифрова всички запазени от вас начини на плащане</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Синхронизиране на карти между устройства</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Синхронизиране на карти</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавяне на карта</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Добавяне на карта</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Управление на карти</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Управление на карти</string> @@ -1934,12 +1922,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Управление на адреси</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Запазване и попълване на адреси</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Запазване и попълване на адреси</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Включително номера, електронни адреси и адреси за доставка</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Включва телефонни номера и имейл адреси</string> @@ -1963,8 +1947,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Изтриване на картата</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Сигурни ли сте, че искате да премахнете тази банкова карта?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Изтриване на картата?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Премахване</string> @@ -1976,23 +1958,15 @@ <string name="credit_cards_cancel_button">Отказ</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Запазени карти</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Моля, въведете валиден номер на банкова карта</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Въведете валиден номер на карта</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Попълнете полето</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Добавяне на име</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Отключете, за да видите запазените карти</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Защитете банковите си карти</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Защитете запазените начини на плащане</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройте фигура, PIN или парола за отключване на устройството, за да защитите запазените банкови карти, в случай че някой друг има достъп до него.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Настройте фигура, PIN или парола за отключване на устройството, за да защитите запазените методи на плащане от достъп, ако някой друг има вашето устройство.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Настройване</string> @@ -2001,9 +1975,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Отключете устройството си</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Отключете, за да използвате запазената банкова карта</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Отключете, за да използвате запазените методи на плащане</string> <!-- Title of the "Add address" screen --> @@ -2012,13 +1983,7 @@ <string name="addresses_edit_address">Промяна на адрес</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Управление на адреси</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Първо име</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Презиме</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Фамилия</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Име</string> <!-- The header for the street address of an address --> @@ -2045,8 +2010,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Премахване на адреса</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Сигурни ли сте, че искате да премахнете този адрес?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Изтриване на този адрес?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Премахване</string> @@ -2146,49 +2109,29 @@ <string name="login_menu_delete_button">Изтриване</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Редактиране</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Сигурни ли сте, че искате да изтриете тези данни за вход?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Сигурни ли сте, че искате да изтриете тази парола?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Изтриване</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Отказ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройки за вход</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Опции за парола</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстовото поле за редактиране на адреса на регистрация.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Текстовото поле за редактиране на адреса на уебсайта.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстовото поле за редактиране на потребителското име на регистрация.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Текстовото поле за редактиране на потребителското име.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстовото поле за редактиране на паролата на регистрация.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Текстовото поле за редактиране на паролата.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Запазване на промените на регистрацията.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Запазване на промените.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Редактиране</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Редактиране на паролата</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавете регистрация</string> <!-- The page title for adding new password. --> <string name="add_login_2">Добавяне на парола</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Паролата е задължителна</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Въведете парола</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Потребителското име е задължително</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Въведете потребителско име</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Името на хоста е задължително</string> @@ -2592,6 +2535,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Затваряне на листа Преводи</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Някои настройки временно не са налични.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Преводи</string> @@ -2614,6 +2560,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Изберете език, който да управлявате „винаги превежда“ и „never translate“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Езиците не можаха да бъдат заредени. Моля, проверете отново по-късно.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Предложение за превод (по подразбиране)</string> @@ -2636,6 +2585,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Премахване на %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Сайтовете не можаха да бъдат заредени. Моля, проверете отново по-късно.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Изтриване на %1$s?</string> @@ -2713,13 +2664,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Връщане назад</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Отваряне на чекмеджето за отстраняване на грешки</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Инструменти за раздели</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Брой на разделите</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Включен</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Включен</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Включен</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Изключени</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2730,6 +2686,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Инструмент за създаване на раздели</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Количество на разделите за създаване</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Текстовото поле е празно</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Моля, въведете само положителни цели числа</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Моля, въведете число, по-голямо от нула</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Надвишен е максималният брой раздели (%1$s), които могат да бъдат генерирани с една операция</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Добавяне към активните раздели</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2746,11 +2712,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Политика на поверителност</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Изпращане</string> + <string name="micro_survey_submit_button_label">Изпращане</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Затваряне</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Затваряне</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Благодарим ви за отзива!</string> + <string name="micro_survey_feedback_confirmation">Благодарим ви за отзива!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Много доволен</string> <!-- Option for likert scale --> @@ -2762,6 +2728,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Много недоволен</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Отваряне на анкета</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Затваряне на анкетата</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Затваряне</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Регистрации</string> diff --git a/mobile/android/fenix/app/src/main/res/values-br/strings.xml b/mobile/android/fenix/app/src/main/res/values-br/strings.xml index 053dc5cc07..4b32c7a51c 100644 --- a/mobile/android/fenix/app/src/main/res/values-br/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-br/strings.xml @@ -46,11 +46,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Enrollet nevez ’zo</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Enrollet nevez ’zo</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Diskouez an holl sinedoù enrollet</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Diskouez an holl sinedoù enrollet</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Dilemel</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Dilemel</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Sinedoù</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Diskouez an holl sinedoù</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Dilemel</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">Gant Mozilla eo produet %1$s.</string> @@ -100,6 +108,11 @@ <string name="tcp_cfr_learn_more">Gouzout hiroc’h a-zivout ar gwarez toupinoù hollek</string> + <!-- Private browsing erase action "contextual feature recommendation" (CFR) --> + <!-- Text for the message displayed in the contextual feature recommendation popup promoting the erase private browsing feature. --> + <string name="erase_action_cfr_message">Stokit amañ da gregiñ un estez prevez nevez. Dilemel a raio ho roll istor, ho toupinoù — pep tra.</string> + + <!-- Text for the info dialog when camera permissions have been denied but user tries to access a camera feature. --> <string name="camera_permissions_needed_message">Ezhomm a zo haeziñ ar c’hamera. Kit e Arventennoù Android, stokit war an aotreoù ha stokit war aotren.</string> <!-- Text for the positive action button to go to Android Settings to grant permissions. --> @@ -185,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Askouezhioù</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Askouezhioù</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Merañ an askouezhioù</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Dizoloit muioc’h a askouezhioù</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Titouroù ar gont</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -203,18 +220,26 @@ <string name="browser_menu_open_in_regular_tab">Digeriñ en un ivinell ordinal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Ouzhpennañ dʼar skramm degemer</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Ouzhpennañ d\'ar skramm degemer…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Staliañ</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Adgoubredañ</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Kavout er bajennad</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Kavout er bajennad…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Treiñ ar bajenn</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Enrollañ en dastumad…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Enrollañ en dastumad</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Rannañ</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Rannañ…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Digeriñ e %1$s</string> @@ -243,11 +268,46 @@ <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> <string name="browser_menu_sign_in">Kennaskañ</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Goubredit gerioù-tremen, ivinelloù ha muioc’h c’hoazh</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Kennaskañ en-dro evit goubredañ</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Ehanet eo ar goubredañ</string> <!-- Browser menu label that creates a private tab --> <string name="browser_menu_new_private_tab">Ivinell prevez nevez</string> <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Gerioù-tremen</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Nevez e %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Mont d\'ar stumm evit an urzhiataer</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Ostilhoù</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Enrollañ</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Lakaat ur sined war ar bajenn-mañ</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Kemmañ ar sined</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Enrollañ evel PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Enaouiñ ar mod lenn</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Kuitaat ar mod lenn</string> + + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Treiñ ar bajenn…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Troet e %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Moullañ…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Askouezh ebet da gaout amañ</string> @@ -262,6 +322,11 @@ <!-- Content description for the translate page toolbar button that opens the translations dialog when no translation has occurred. --> <string name="browser_toolbar_translate">Treiñ ar bajenn</string> + <!-- Content description (not visible, for screen readers etc.) for the translate page toolbar button that opens the translations dialog when the page is translated successfully. + The first parameter is the name of the language that is displayed in the original page. (For example: English) + The second parameter is the name of the language which the page was translated to. (For example: French) --> + <string name="browser_toolbar_translated_successfully">Pajenn troet eus %1$s betek %2$s.</string> + <!-- Locale Settings Fragment --> <!-- Content description for tick mark on selected language --> <string name="a11y_selected_locale_content_description">Yezh dibabet</string> @@ -334,8 +399,24 @@ <!-- Text for the button to not request notification permission on the device and dismiss the dialog --> <string name="onboarding_home_enable_notifications_negative_button" moz:removedIn="124" tools:ignore="UnusedResources">Ket bremañ</string> + <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> + <!-- Description for learning more about our privacy notice. --> + <string name="juno_onboarding_privacy_notice_text">Politikerezh prevezded Firefox</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Ho surentez a zo talvoudus deomp</string> + <!-- Title for set firefox as default browser screen used by Nimbus experiments. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_default_browser_title_nimbus_3" tools:ignore="UnusedResources">Dizoloit perak e plij Firefox da vilionoù a dud</string> + <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_title_nimbus_4" tools:ignore="UnusedResources">Merdeiñ diogel ha muioc\'h a zibaboù</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_3">Hor merdeer harpet gant un aozadur hep gounidoù a sikour da herzel an embregerezhioù d\'ho heuliañ pep lec\'h er web.</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_4" tools:ignore="UnusedResources">Ouzhpenn 100 milion a dud a warez o buhez prevez en ur zibab ur merdeer a zo harpet gant un aozadur hep gounidoù.</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_5" tools:ignore="UnusedResources">Heulierien anavezet? Stanket diouzhtu. Askouezhioù? Esaeit 700 anezho. PDFoù? Hol lenner enkorfet a lako anezho aes da verañ.</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_2" moz:RemovedIn="124" tools:ignore="UnusedResources">Hor merdeer harpet gant un aozadur hep gounidoù a sikour da herzel an embregerezhioù d\'ho heuliañ pep lec\'h er web.\n\nGouzout hiroc’h en hor reolennoù a-fet buhez prevez.</string> <!-- Text for the link to the privacy notice webpage for set as firefox default browser screen. This is part of the string with the key "juno_onboarding_default_browser_description". --> <string name="juno_onboarding_default_browser_description_link_text" moz:RemovedIn="124" tools:ignore="UnusedResources">evezhiadennoù a-fet buhez prevez</string> @@ -343,6 +424,11 @@ <string name="juno_onboarding_default_browser_positive_button" tools:ignore="UnusedResources">Lakaat da verdeer dre ziouer</string> <!-- Text for the button dismiss the screen and move on with the flow --> <string name="juno_onboarding_default_browser_negative_button" tools:ignore="UnusedResources">Ket bremañ</string> + <!-- Title for sign in to sync screen. --> + <string name="juno_onboarding_sign_in_title_2">Chomit enrineget pa tremenit eus un trevnad d\'egile</string> + <!-- Description for sign in to sync screen. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_sign_in_description_2">Pa kennaskit hag e weredekait ar goubredañ eo kreñvoc\'h ho surentez. Fiefox a enrineg ho kerioù-tremen, ho sinedoù hag muioc’h c’hoazh.</string> <!-- Text for the button to sign in to sync on the device --> <string name="juno_onboarding_sign_in_positive_button" tools:ignore="UnusedResources">Kennaskañ</string> <!-- Text for the button dismiss the screen and move on with the flow --> @@ -350,11 +436,23 @@ <!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. Note: The word "Firefox" should NOT be translated --> <string name="juno_onboarding_enable_notifications_title_nimbus_2">Gant ar rebuzadurioù e c’hallit chom suroc\'h gant Firefox</string> + <!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_enable_notifications_description_nimbus_2">Kas ivinelloù etre ho trevnadoù ha dizoloit keweriusterioù prevezded all Firefox.</string> <!-- Text for the button to request notification permission on the device --> <string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Gweredekaat ar rebuzadurioù</string> <!-- Text for the button dismiss the screen and move on with the flow --> <string name="juno_onboarding_enable_notifications_negative_button" tools:ignore="UnusedResources">Ket bremañ</string> + <!-- Title for add search widget screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_add_search_widget_title" tools:ignore="UnusedResources">Esaeit widjet klask Firefox</string> + <!-- Description for add search widget screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_add_search_widget_description" tools:ignore="UnusedResources">Gant Firefox war ho skramm degemer e c’halloc’h digeriñ ar merdeer a lak ho puhez prevez da gentañ hag a stank an heulierien etre al lec’hiennoù.</string> + <!-- Text for the button to add search widget on the device used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_add_search_widget_positive_button" tools:ignore="UnusedResources">Ouzhpennañ ur widjet FIrefox</string> <!-- Text for the button to dismiss the screen and move on with the flow --> <string name="juno_onboarding_add_search_widget_negative_button" tools:ignore="UnusedResources">Ket bremañ</string> @@ -391,6 +489,8 @@ <string name="preferences_search_engines">Luskerioù klask</string> <!-- Preference for settings related to Search engines suggestions--> <string name="preferences_search_engines_suggestions">Kinnigoù al luskerioù enklask</string> + <!-- Preference Category for settings related to Search address bar --> + <string name="preferences_settings_address_bar">Gwellvezioù ar varrenn chomlec’h</string> <!-- Preference Category for settings to Firefox Suggest --> <string name="preference_search_address_bar_fx_suggest">Barrenn chomlec\'hioù - Alioù Firefox</string> <!-- Preference link to Learn more about Firefox Suggest --> @@ -421,6 +521,10 @@ <!-- Preference for enabling "HTTPS-Only" mode --> <string name="preferences_https_only_title">Mod HTTPS-hepken</string> + <!-- Label for cookie banner section in quick settings panel. --> + <string name="cookie_banner_blocker">Stanker banniel an toupinoù</string> + <!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. --> + <string name="preferences_cookie_banner_reduction_private_mode">Stanker banniel an toupinoù er merdeiñ prevez</string> <!-- Text for indicating cookie banner handling is off this site, this is shown as part of the protections panel with the tracking protection toggle --> <string name="reduce_cookie_banner_off_for_site">Diweredekaet evit al lec’hienn-mañ</string> <!-- Text for cancel button indicating that cookie banner reduction is not supported for the current site, this is shown as part of the cookie banner details view. --> @@ -437,9 +541,22 @@ <string name="reduce_cookie_banner_unsupported_site_request_submitted_2">Goulenn skor kaset</string> <!-- Text for indicating cookie banner handling is currently not supported for this site, this is shown as part of the protections panel with the tracking protection toggle --> <string name="reduce_cookie_banner_unsupported_site">N’eo ket skoret al lec’hienn-mañ c’hoazh</string> + <!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> + <string name="reduce_cookie_banner_details_panel_title_on_for_site_1">Gweredekaat stanker banniel an toupinoù evit %1$s?</string> + <!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> + <string name="reduce_cookie_banner_details_panel_title_off_for_site_1">Diweredekaat stanker banniel an toupinoù evit %1$s?</string> <!-- Title text for a detail explanation indicating cookie banner reducer didn't work for the current site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name--> <string name="reduce_cookie_banner_details_panel_title_unsupported_site_request_2">%1$s n’hall ket nac’hañ ar goulennoù toupinoù war al lec’hienn-mañ. Gallout a rit goulenn e vefe skoret al lec’hienn-mañ en dazont.</string> + <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is off for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> + <string name="reduce_cookie_banner_details_panel_description_off_for_site_1">Diweredekaat ha skarzhet e vo an toupinoù hag adkarget al lec’hienn gant %1$s. Digennaskañ a raio ac’hanoc’h ha goullonderiñ a raio ho paner.</string> + <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is on for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> + <string name="reduce_cookie_banner_details_panel_description_on_for_site_3">Gweredekaat ha %1$s a glasko nac’hañ bannieloù an toupinoù ent emgefreek war al lec’hienn-mañ.</string> + <!--Title for the cookie banner re-engagement CFR, the placeholder is replaced with app name --> + <string name="cookie_banner_cfr_title">%1$s en deus nac’het toupinoù evidoc’h</string> + <!--Message for the cookie banner re-engagement CFR --> + <string name="cookie_banner_cfr_message">Nebeutoc’h a draoù diezhomm, nebeutoc’h a doupinoù ho’ch heuliañ ac’hanoc’h war al lec’hienn-mañ.</string> + <!-- Description of the preference to enable "HTTPS-Only" mode. --> <string name="preferences_https_only_summary">Klask kennaskañ ent emgefreek gant ar c’homenad HTTPS evit muioc’h a surentez.</string> <!-- Summary of https only preference if https only is set to off --> @@ -466,6 +583,8 @@ <string name="preferences_override_account_server">Dafariad kont Mozilla personelaet</string> <!-- Preference to override the Sync token server --> <string name="preferences_override_sync_tokenserver">Dafariad Sync personelaet</string> + <!-- Toast shown after updating the Mozilla account/Sync server override preferences --> + <string name="toast_override_account_sync_server_done">Kemmet eo bet an dafariad kontoù Mozilla/Sync. Serriñ a raio an arload evit kemer ar c\'hemmoù e kont…</string> <!-- Preference category for account information --> <string name="preferences_category_account">Kont</string> <!-- Preference for changing where the toolbar is positioned --> @@ -486,6 +605,10 @@ <string name="preferences_account_sync_error">Adkennaskit evit kendercʼhel gant ar goubredañ</string> <!-- Preference for language --> <string name="preferences_language">Yezh</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Troidigezh</string> + <!-- Preference for translations --> + <string name="preferences_translations">Troidigezhioù</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Dibaboù roadennoù</string> <!-- Preference for data collection --> @@ -512,9 +635,14 @@ <string name="preferences_enable_autocomplete_urls">Leuniañ an ereoù ent emgefreek</string> <!-- Preference title for switch preference to show sponsored Firefox Suggest search suggestions --> <string name="preferences_show_sponsored_suggestions">Kinnigoù paeroniet</string> + <!-- Summary for preference to show sponsored Firefox Suggest search suggestions. + The first parameter is the name of the application. --> + <string name="preferences_show_sponsored_suggestions_summary">Harpit %1$s gant kuzulioù kevelet diskouezet ur wech an amzer</string> <!-- Preference title for switch preference to show Firefox Suggest search suggestions for web content. The first parameter is the name of the application. --> <string name="preferences_show_nonsponsored_suggestions">Alioù %1$s</string> + <!-- Summary for preference to show Firefox Suggest search suggestions for web content --> + <string name="preferences_show_nonsponsored_suggestions_summary">Kaout alioù eus ar web hervez ho klaskoù</string> <!-- Preference for open links in third party apps --> <string name="preferences_open_links_in_apps">Digeriñ ereoù en arloadoù</string> <!-- Preference for open links in third party apps always open in apps option --> @@ -534,8 +662,12 @@ <!-- Preference for add_ons --> <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Askouezhioù</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Askouezhioù</string> <!-- Preference for installing a local add-on --> <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Staliañ un askouezh diouzh ar restr</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Staliañ an askouezh adalek ur restr</string> <!-- Preference for notifications --> <string name="preferences_notifications">Rebuzadurioù</string> @@ -549,8 +681,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Rediet</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Diret</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Dilemel al lec’hienn</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Aotren evit an holl lec’hiennoù</string> @@ -574,7 +704,9 @@ <string name="customize_toggle_jump_back_in">Distreiñ</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Ivinelloù nevez</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Ivinelloù nevez</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Sinedoù</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Gweladennet nevez ’zo</string> @@ -634,6 +766,8 @@ <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Diweredekaet eo an askouezhioù evit ar mare</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Klask adloc’hañ an askouezhioù</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Klaskit adloc’hañ an askouezhioù</string> <!-- The user will continue with all add-ons disabled --> <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Kenderc’hel gant an askouezhioù bet diweredekaet</string> @@ -650,8 +784,6 @@ <string name="preferences_sync_history">Roll istor</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Sinedoù</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Titouroù kennaskañ</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Gerioù-tremen</string> <!-- Preference for syncing tabs --> @@ -679,8 +811,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s war %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kartennoù kred</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Doareoù paeañ</string> <!-- Preference for syncing addresses --> @@ -696,6 +826,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Ivinell eus %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s ivinell serret: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Diskouez an ivinelloù bet serret nevez zo</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Nemedennoù</string> @@ -1611,12 +1749,8 @@ <string name="add_to_homescreen_description_2">Gallout a rit ouzhpennañ al lec’hienn-mañ da bennbajenn ho trevnad evit mont war-eeun ha merdeiñ primoc’h evel ma vefe un arload.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Titouroù kennaskañ</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Gerioù-tremen</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Enrollañ an titouroù kennaskañ</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Enrollañ ar gerioù-tremen</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Goulenn a-raok enrollañ</string> @@ -1632,36 +1766,18 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Leuniañ anvioù-implijer ha gerioù-tremen en arloadoù-all war ho trevnad.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ouzhpennañ titouroù kennaskañ</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Ouzhpennañ ur ger-tremen</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Goubredañ an titouroù kennaskañ</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Goubredañ ar gerioù-tremen</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Goubredañ an titouroù kennaskañ dre an trevnadoù</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Titouroù kennaskañ enrollet</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Gerioù-tremen enrollet</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">An titouroù kennaskañ a enrollit pe c’houbredit e %s a vo diskouezet amañ.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Gouzout hiroc’h diwar-benn Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Nemedennoù</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">An titouroù kennaskañ n’int ket enrollet a vo diskouezet amañ.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ne vo ket enrollet an titouroù kennaskañ evit al lec’hiennoù-mañ.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Dilemel an holl nemedennoù</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Klask titouroù kennaskañ</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Klask er gerioù-tremen</string> <!-- The header for the site that a login is for --> @@ -1691,14 +1807,8 @@ <string name="saved_login_reveal_password">Diskouez ar ger-tremen</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Kuzhat ar ger-tremen</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Dibrennit evit gwelet ho titouroù kennaskañ enrollet</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Diogelit ho titouroù kennaskañ</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Diogelit ho kerioù-tremen enrollet</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Arventennit ur patrom morailh, ur PIN pe ur ger-tremen evit gwareziñ ho titouroù kennaskañ enrollet da vezañ lennet gant unan bennak all.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Diwezhatoc’h</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1713,34 +1823,22 @@ <string name="saved_logins_sort_strategy_alphabetically">Anv (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Arver diwezhañ</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Lañser rummañ an titouroù kennaskañ</string> <!-- Autofill --> <!-- Preference and title for managing the autofill settings --> <string name="preferences_autofill">Leuniañ ent emgefreek</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Chomlec’hioù</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kartennoù kred</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Doareoù paeañ</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Enrollañ ha leuniañ ar c’hartennoù en un doare emgefreek</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Enrollañ ha leuniañ an doareoù paeañ</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Rineget eo ar roadennoù</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Goubredañ ar c’hartennoù kred etre ho trevnadoù</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Goubredañ ar c\'hartennoù</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Ouzhpennañ ur gartenn gred</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Ouzhpennañ ur gartenn</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Merañ ar c’hartennoù enrollet</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Merañ ar c’hartennoù</string> @@ -1749,12 +1847,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Merañ ar chomlec’hioù</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Enrollañ ha leuniañ ar chomlec’hioù en un doare emgefreek</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Enrollañ ha leuniañ ar chomlec’hioù</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Enkorfañ a ra titouroù evel niverennoù, posteloù ha chomlec’hioù</string> <!-- Title of the "Add card" screen --> <string name="credit_cards_add_card">Ouzhpennañ ur gartenn</string> @@ -1776,8 +1870,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Dilemel ar gartenn</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ha fellout a ra deocʼh dilemel ar gartenn gred-mañ?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Dilemel ar gartenn?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Dilemel</string> @@ -1790,24 +1882,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Kartennoù enrollet</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Biziatait un niverenn kartenn gred talvoudek mar plij.</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Enankit un niverenn gartenn reizh</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Mar plij, leugnit ar maez-mañ</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Ouzhpennañ un anv</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Dibrennit da welet ho kartennoù enrollet</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Diogelit ho kartennoù kred</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Diogelit ho toareoù paeañ enrollet</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Arventennit ur patrom prennañ, ur PIN pe ur ger-tremen evit gwareziñ ho kartennoù kred enrollet ma vez ho trevnad gant unan bennak all.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Arventennañ bremañ</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> @@ -1815,21 +1898,12 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Dibrennit ho trevnad</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Dibrennit evit implijout titouroù kartenn gred enrollet</string> - <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Ouzhpennañ ur chomlec’h</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Embann ur chomlec’h</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Merañ ar chomlec’hioù</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Añv bihan</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Anv kreiz</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Anv familh</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Anv</string> <!-- The header for the street address of an address --> @@ -1856,8 +1930,6 @@ <string name="addressess_delete_address_button">Dilemel ar chomlec’h</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ha sur oc’h e fell deoc’h dilemel ar chomlec’h-mañ?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Dilemel ar chomlec’h-mañ?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Dilemel</string> @@ -1954,41 +2026,21 @@ <string name="login_menu_delete_button">Dilemel</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Embann</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Sur oc’h e fell deoc’h dilemel an titour-kennaskañ-mañ?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Sur ocʼh e fell deocʼh dilemel ar ger-tremen-mañ?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Dilemel</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Nullañ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Dibarzhioù an titouroù kennaskañ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ar vaezienn destenn kemmus evit chomlec’h web an titour kennaskañ.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ar vaezienn destenn kemmus evit anv arveriad an titour kennaskañ.</string> - <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ar vaezienn destenn kemmus evit ger-tremen an titour kennaskañ.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Enrollañ ar c’hemmoù d’an titouroù kennaskañ.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Enrollañ ar cʼhemmoù.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Embann</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Aozañ ar ger-tremen</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ouzhpennañ titouroù kennaskañ nevez</string> <!-- The page title for adding new password. --> <string name="add_login_2">Ouzhpennañ ur ger-tremen</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Ger-tremen azgoulennet</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Enankit ur ger-tremen</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Anv-implijer rekis</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Enankit un anv-implijer</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Anv an ostiz rekis</string> @@ -2249,6 +2301,9 @@ <!-- Title for dialog displayed when trying to access links present in a text. --> <string name="a11y_links_title">Ereoù</string> + <!-- Additional content description for text bodies that contain urls. --> + <string name="a11y_links_available">Liammoù da gaout</string> + <!-- Translations feature--> <!-- Translation request dialog --> @@ -2262,6 +2317,8 @@ <string name="translations_bottom_sheet_translate_to">Treiñ e</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Diwezhatoc’h</string> + <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> + <string name="translations_bottom_sheet_negative_button_restore">Diskouez an destenn orin</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Graet</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2293,6 +2350,8 @@ <string name="translation_option_bottom_sheet_never_translate_in_language">Na dreiñ biken %1$s</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to never translate the site the user is currently visiting. --> <string name="translation_option_bottom_sheet_never_translate_site">Na dreiñ biken al lec’hienn-mañ</string> + <!-- Button text for the button that will take the user to the translation settings dialog. --> + <string name="translation_option_bottom_sheet_translation_settings">Arventennoù an droidigezh</string> <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">Diwar-benn an treiñ e-barzh %1$s</string> @@ -2390,7 +2449,9 @@ <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Niver a ivinelloù</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Oberiant</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Oberiant</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Oberiant</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Dizoberiant</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2398,4 +2459,16 @@ <!-- The total tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_total">Hollad</string> + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Kenderc’hel</string> + + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Serriñ</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Trugarez da vezañ roet hoc’h ali!</string> + + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Domani a-vremañ: %s</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-bs/strings.xml b/mobile/android/fenix/app/src/main/res/values-bs/strings.xml index d32edb20bf..fcd01b9df4 100644 --- a/mobile/android/fenix/app/src/main/res/values-bs/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-bs/strings.xml @@ -47,11 +47,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nedavno sačuvano</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nedavno sačuvano</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Prikaži sve sačuvane oznake</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Prikaži sve sačuvane oznake</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Ukloni</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Ukloni</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Oznake</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Prikaži sve oznake</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Ukloni</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s je razvila Mozilla.</string> @@ -185,6 +193,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-oni</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Ekstenzije</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Upravljanje ekstenzijama</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Otkrijte više ekstenzija</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Podaci o računu</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -203,18 +215,26 @@ <string name="browser_menu_open_in_regular_tab">Otvori u standardnom tabu </string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Dodaj na Početni ekran</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Dodaj na početni ekran…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instaliraj</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Ponovo sinhronizuj</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Pronađi na stranici</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Pronađi na stranici…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Prevedi stranicu</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Sačuvaj u kolekciju…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Spasi u kolekciju</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Podijeli</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Dijeli…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Otvori u %1$s</string> @@ -254,6 +274,34 @@ <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Lozinke</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Novo u %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Prebacite se na desktop stranicu</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Alati</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Sačuvaj</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Označi ovu stranicu</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Uredi oznaku</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Sačuvaj kao PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Uključite Prikaz za čitanje</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Isključite Prikaz za čitanje</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Prevedi stranicu…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Prevedeno na %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Štampaj…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ovdje nema ekstenzija</string> @@ -345,8 +393,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox obavijest o privatnosti</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Saznajte više u našoj obavijesti o privatnosti</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Volimo da vas čuvamo</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -553,6 +599,10 @@ <string name="preferences_account_sync_error">Ponovo se povežite za nastavak sinhronizacije</string> <!-- Preference for language --> <string name="preferences_language">Jezik</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Prijevod</string> + <!-- Preference for translations --> + <string name="preferences_translations">Prijevodi</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Izbori podataka</string> <!-- Preference for data collection --> @@ -625,10 +675,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obavezno</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcionalno</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Čitajte i mijenjajte podatke web stranice</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Izbriši web stranicu</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Dozvoli za sve stranice</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -657,7 +703,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Vrati se nazad</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Nedavne oznake</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Nedavne oznake</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Oznake</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nedavno posjećeno</string> @@ -750,8 +798,6 @@ <string name="preferences_sync_history">Historiju</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Zabilješke</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Lozinke</string> <!-- Preference for syncing tabs --> @@ -778,8 +824,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s na %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne kartice</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Načini plaćanja</string> <!-- Preference for syncing addresses --> @@ -795,6 +839,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab iz %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s zatvorenih tabova: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Pregledajte nedavno zatvorene tabove</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Izuzeci</string> @@ -1716,12 +1768,8 @@ <string name="add_to_homescreen_description_2">Ovu web stranicu možete lahko dodati na Početni ekran uređaja za brz pristup istoj i da surfate brže s iskustvom sličnom aplikaciji.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave i lozinke</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Lozinke</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Spašene prijave i lozinke</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Sačuvaj lozinke</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Pitaj za spašavanje</string> @@ -1736,47 +1784,29 @@ <string name="preferences_android_autofill">Automatski ispuni u drugim aplikacijama</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Unesite korisnička imena i lozinke u druge aplikacije na svom uređaju.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj prijavu</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Dodaj lozinku</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sinkroniziraj prijave</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sinhronizuj lozinke</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sinhronizirajte prijave na svim uređajima</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sinhronizuj lozinke na svim uređajima</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Spašene prijave</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Sačuvane lozinke</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave koje spasite ili sinhronizujete sa %s će se prikazati ovdje.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Lozinke koje sačuvate ili sinhronizujete sa %s će biti navedene ovdje. Sve lozinke koje sačuvate su šifrovane. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Saznajte više o Syncu.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Saznajte više o sinhronizaciji</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Izuzeci</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave i lozinke koje nisu spašene će biti prikazane ovdje.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s neće sačuvati lozinke za web stranice navedene ovdje.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave i lozinke neće biti spašene za ove web stranice.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s neće sačuvati lozinke za ove stranice.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Obriši sve izuzetke</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Pretraži prijave</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Traži lozinke</string> <!-- The header for the site that a login is for --> @@ -1806,17 +1836,11 @@ <string name="saved_login_reveal_password">Prikaži lozinku</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Sakrij lozinku</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Otključajte za pregled spašenih prijava</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Otključajte da vidite sačuvane lozinke</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Osigurajte svoje prijave i lozinke</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Osigurajte svoje sačuvane lozinke</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Podesite pattern za zaključavanje uređaja, PIN ili lozinku da zaštitite vaše spašene prijave i lozinke od pristupa druge osobe koja ima vaš uređaj.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Postavite obrazac za zaključavanje uređaja, PIN ili lozinku da zaštitite svoje sačuvane lozinke od pristupa ako neko drugi ima vaš uređaj.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Kasnije</string> @@ -1833,9 +1857,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Zadnja upotreba</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sortiraj meni prijava</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Meni za sortiranje lozinki</string> @@ -1844,16 +1865,10 @@ <string name="preferences_autofill">Automatsko popunjavanje</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adrese</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne kartice</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Načini plaćanja</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Sačuvajte i automatski popunjavajte kartice</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Sačuvaj i popuni načine plaćanja</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Podaci su šifrovani</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s šifruje sve načine plaćanja koje sačuvate</string> @@ -1861,24 +1876,16 @@ <string name="preferences_credit_cards_sync_cards_across_devices">Sinhronizujte kartice na svim uređajima</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sinhronizuj kartice</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj kreditnu karticu</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Dodaj karticu</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Upravljaj sačuvanim karticama</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Upravljajte karticama</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Dodaj adresu</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Upravljaj adresama</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Sačuvajte i automatski popunjavajte adrese</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Sačuvajte i popunite adrese</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Uključite informacije kao što su brojevi, e-mail i adrese za dostavu</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Uključuje brojeve telefona i email adrese</string> @@ -1902,8 +1909,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Izbriši karticu</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Jeste li sigurni da želite izbrisati ovu kreditnu karticu?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Izbrisati karticu?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Izbriši</string> @@ -1915,23 +1920,15 @@ <string name="credit_cards_cancel_button">Otkaži</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Sačuvane kartice</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Unesite važeći broj kreditne kartice</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Unesite važeći broj kartice</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Molimo popunite ovo polje</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Dodaj ime</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Otključajte da vidite svoje sačuvane kartice</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Osigurajte svoje kreditne kartice</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Osigurajte svoje sačuvane načine plaćanja</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Postavite obrazac za zaključavanje uređaja, PIN ili lozinku da zaštitite svoje sačuvane kreditne kartice od pristupa ako neko drugi ima vaš uređaj.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Postavite obrazac za zaključavanje uređaja, PIN ili lozinku da zaštitite sačuvane načine plaćanja od pristupa ako neko drugi ima vaš uređaj.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Podesi odmah</string> @@ -1939,8 +1936,6 @@ <string name="credit_cards_warning_dialog_later">Kasnije</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Otključajte svoj uređaj</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Otključajte za korištenje sačuvanih podataka o kreditnoj kartici</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Otključajte da koristite sačuvane načine plaćanja</string> @@ -1950,12 +1945,6 @@ <string name="addresses_edit_address">Uredi adresu</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Upravljaj adresama</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ime</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Srednje ime</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Prezime</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Ime</string> <!-- The header for the street address of an address --> @@ -1981,8 +1970,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Izbriši adresu</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Jeste li sigurni da želite izbrisati ovu adresu?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Izbrisati ovu adresu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Izbriši</string> @@ -2080,50 +2067,30 @@ <string name="login_menu_delete_button">Obriši</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Uredi</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Da li ste sigurni da želite obrisati ovu prijavu?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Jeste li sigurni da želite izbrisati ovu lozinku?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Obriši</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Otkaži</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opcije prijave</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opcije lozinke</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Izmjenjivo tekstualno polje za web adresu prijave.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Tekstualno polje koje se može uređivati za adresu web stranice.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Izmjenjivo tekstualno polje za korisničko ime prijave.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Tekstualno polje koje se može uređivati za korisničko ime.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Izmjenjivo tekstualno polje za lozinku prijave.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Tekstualno polje koje se može uređivati za lozinku.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Spasite izmjene za prijavu.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Sačuvaj promjene.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Uredi</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Uredi lozinku</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj novu prijavu</string> <!-- The page title for adding new password. --> <string name="add_login_2">Dodaj lozinku</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Potrebna lozinka</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Unesite lozinku</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Korisničko ime je obavezno</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Unesite korisničko ime</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Ime hosta je obavezno</string> @@ -2468,6 +2435,8 @@ <string name="translations_bottom_sheet_negative_button">Ne sada</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Prikaži original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Originalna neprevedena stranica je učitana</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Gotovo</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2525,6 +2494,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Zatvorite list Prijevodi</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Neke postavke su privremeno nedostupne.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Prijevodi</string> @@ -2548,6 +2520,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Odaberite jezik za upravljanje postavkama ”uvijek prevodi“ i ”nikad ne prevodi“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Učitavanje jezika nije uspjelo. Molimo provjerite kasnije.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ponudi prijevod (zadano)</string> @@ -2570,6 +2545,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Ukloni %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Nije moguće učitati web stranice. Molimo provjerite kasnije.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Obrisati %1$s?</string> @@ -2647,13 +2624,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Idite nazad</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Otvorite ladicu za otklanjanje grešaka</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tab alati</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Broj tabova</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktivno</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktivno</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktivno</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Neaktivno</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2664,6 +2646,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Alat za kreiranje tabova</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Količina tabova za kreiranje</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Polje za tekst je prazno</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Unesite samo pozitivne cijele brojeve</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Unesite broj veći od nule</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Premašen je maksimalan broj tabova (%1$s) koji se mogu generisati u jednoj operaciji</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Dodaj aktivnim tabovima</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2671,6 +2663,39 @@ <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Dodaj privatnim tabovima</string> + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Nastavi</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Popunite ovu anketu</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Napomena o privatnosti</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Pošalji</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Zatvori</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Hvala na povratnim informacijama!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Vrlo zadovoljan</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Zadovoljan</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neutralno</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Nezadovoljan</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Vrlo nezadovoljan</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Otvori anketu</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Zatvori anketu</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Zatvori</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Prijave</string> diff --git a/mobile/android/fenix/app/src/main/res/values-cak/strings.xml b/mobile/android/fenix/app/src/main/res/values-cak/strings.xml index 6fb48978ef..74c64172bf 100644 --- a/mobile/android/fenix/app/src/main/res/values-cak/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-cak/strings.xml @@ -53,11 +53,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">K\'a b\'a keyak</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">K\'a b\'a keyak</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Kek\'ut ronojel ri yakon taq yaketal</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Kek\'ut ronojel ri yakon taq yaketal</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Tiyuj</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Tiyuj</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Taq yaketal</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Kek\'ut konojel taq yaketal</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Tiyuj</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s b\'anon ruma Mozilla.</string> @@ -146,8 +154,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">K’ak’a’ ichinan ruwi’</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Choj okem pa ewan tzij</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Ewan taq tzij</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Choj okem pa ewan tzij</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -189,11 +199,13 @@ <string name="browser_menu_stop">Tiq\'at</string> <!-- Browser menu button that opens the addon manager --> - <string name="browser_menu_add_ons">Taq tz\'aqat</string> + <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Taq tz\'aqat</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_extensions">Taq k\'amal</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Rutzijol rub\'i\' taqoya\'l</string> <!-- Text displayed when there are no add-ons to be shown --> - <string name="no_add_ons">Majun tz\'aqat wakami</string> + <string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Majun tz\'aqat wakami</string> <!-- Browser menu button that sends a user to help articles --> <string name="browser_menu_help">To\'ïk</string> <!-- Browser menu button that sends a to a the what's new article --> @@ -210,11 +222,13 @@ <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Titz\'aqatisäx pa ri Rutikirib\'al ruwa</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> - <string name="browser_menu_install_on_homescreen">Tiyak</string> + <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Tiyak</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Tixim chik</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Tikanöx pa ruxaq</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Tikanöx pa ruxaq…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Titzalq\'omïx ruxaq</string> <!-- Browser menu button that saves the current tab to a collection --> @@ -249,6 +263,34 @@ <!-- Button shown on the home page that opens the Customize home settings --> <string name="browser_menu_customize_home_1">Tawichinaj ri ruxaq atikirib\'al</string> + <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> + <string name="browser_menu_sign_in">Titikirisäx molojri\'ïl</string> + + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Kexim ewan taq tzij, taq ruwi\', chuqa\' ch\'aqa\' chik</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Titikirisäx chik molojri\'ïl richin ximojri\'ïl</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Q\'aton ximojri\'ïl</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">K\'ak\'a\' ichinan ruwi\'</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Ewan taq tzij</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">K\'ak\'a\' pa %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Tik\'ex rik\'in ruxaq kematz\'ib\'</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Samajib\'äl</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Tiyak</string> + + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">Majun k\'amal k\'o wawe\'</string> + <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> <string name="browser_toolbar_home">Rutikirib\'al ruwäch</string> @@ -548,6 +590,8 @@ <string name="preferences_account_sync_error">Tokisäx chik richin nitikirisäx chik ri ximoj</string> <!-- Preference for language --> <string name="preferences_language">Ch\'ab\'äl</string> + <!-- Preference for translation --> + <string name="preferences_translation">Tzalq\'omanïk</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Rucha\'ik tzij</string> <!-- Preference for data collection --> @@ -598,10 +642,14 @@ <string name="quit_application">Tajin nel pa ri okisanel richin yejikib\'äx taq jaloj…</string> <!-- Preference for add_ons --> - <string name="preferences_addons">Taq tz’aqat</string> + <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Taq tz’aqat</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Taq k\'amal</string> <!-- Preference for installing a local add-on --> - <string name="preferences_install_local_addon">Tiyak ri tz\'aqat rik\'in ri yakb\'äl</string> + <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Tiyak ri tz\'aqat rik\'in ri yakb\'äl</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Tiyak k\'amal rik\'in yakb\'äl</string> <!-- Preference for notifications --> <string name="preferences_notifications">Taq rutzijol</string> @@ -610,9 +658,13 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Man ya\'on ta q\'ij chi re</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Rajowaxik</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> - <string name="preferences_customize_amo_collection">Kimolik ichinan taq Tz\'aqat</string> + <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Kimolik ichinan taq Tz\'aqat</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">ÜTZ</string> <!-- Button caption to abort the add-on collection configuration --> @@ -624,13 +676,13 @@ <!-- Hint displayed on input field for custom collection user ID--> <string name="customize_addon_collection_user_hint">Rajaw Mol (Winäq ID)</string> <!-- Toast shown after confirming the custom add-on collection configuration --> - <string name="toast_customize_addon_collection_done">Xjal kimolaj tz\'aqat. Nitz\'apïx chokoy richin yesamajïx ri taq jaloj…</string> + <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Xjal kimolaj tz\'aqat. Nitz\'apïx chokoy richin yesamajïx ri taq jaloj…</string> <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Titz\'et chik</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">K\'ak\'a\' taq yaketal</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">K\'ak\'a\' taq yaketal</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">K\'a b\'a ketz\'et</string> @@ -676,20 +728,20 @@ <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> - <string name="addon_ga_message_title" tools:ignore="UnusedResources">K\'ak\'a\' taq tz\'aqa ewachel wakami</string> + <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">K\'ak\'a\' taq tz\'aqa ewachel wakami</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Ke\'awila\' +100 k\'ak\'a\' taq k\'amal ri nikiya\' q\'ij chawe\' nawichinaj Firefox.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> - <string name="addon_ga_message_button" tools:ignore="UnusedResources">Kenik\'öx taq tz\'aqat</string> + <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Kenik\'öx taq tz\'aqat</string> - <!-- Add-on process crash dialog to user --> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> - <string name="addon_process_crash_dialog_title" tools:ignore="UnusedResources">Echupun jumej ri taq tz\'aqat</string> + <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Echupun jumej ri taq tz\'aqat</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> - <string name="addon_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Tatojtob\'ej ye\'atzïj chik ri taq tz\'aqat</string> + <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Tatojtob\'ej ye\'atzïj chik ri taq tz\'aqat</string> <!-- The user will continue with all add-ons disabled --> - <string name="addon_process_crash_dialog_disable_addons_button_text" tools:ignore="UnusedResources">Kesamajïx chik ri chupun taq tz\'aqat</string> + <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Kesamajïx chik ri chupun taq tz\'aqat</string> <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> @@ -1859,6 +1911,8 @@ <string name="credit_cards_name_on_card_validation_error_message_2">Titz\'aqatisäx jun b\'i\'aj</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Man tiq\'at chik richin ye\'atz\'ët ri tarjeta\' e\'ayakon</string> + <!-- Message of warning dialog if users have no device authentication set up --> + <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Tab\'ana\' runuk\'ulem jun retal ruq\'atoj okisab\'äl, jun PIN o jun ewan tzij richin nachajij ri kre\'ito\' tarjeta\' e\'ayakon we xa ta k\'o xtichapo ri awokisab\'al.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Tib\'an runuk\'ulem wakami</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> @@ -2201,4 +2255,6 @@ Achi\'el: \nhttps://www.google.com/search?q=%s</string> <!-- Translations feature--> + <!-- Micro survey --> + </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-co/strings.xml b/mobile/android/fenix/app/src/main/res/values-co/strings.xml index 01c3c63d1c..29d8291625 100644 --- a/mobile/android/fenix/app/src/main/res/values-co/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-co/strings.xml @@ -595,7 +595,9 @@ <!-- Preference for language --> <string name="preferences_language">Lingua</string> <!-- Preference for translation --> - <string name="preferences_translation">Traduzzione</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduzzione</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traduzzioni</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Scelta di dati</string> <!-- Preference for data collection --> @@ -2743,7 +2745,7 @@ <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Numeru d’unghjette</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Attive</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Attive</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inattive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> diff --git a/mobile/android/fenix/app/src/main/res/values-cs/strings.xml b/mobile/android/fenix/app/src/main/res/values-cs/strings.xml index 2f50ff055d..66fc6aa503 100644 --- a/mobile/android/fenix/app/src/main/res/values-cs/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-cs/strings.xml @@ -204,6 +204,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Doplňky</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Rozšíření</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Správa rozšíření</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Objevit další rozšíření</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informace o účtu</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -222,6 +226,8 @@ <string name="browser_menu_open_in_regular_tab">Otevřít v běžném panelu</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Přidat na plochu</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Přidat na domovskou obrazovku…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Nainstalovat</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -233,9 +239,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Přeložit stránku</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Uložit do sbírky…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Uložit do sbírky</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Sdílet</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Sdílet…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Otevřít v aplikaci %1$s</string> @@ -290,6 +300,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Uložit</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Přidat stránku do záložek</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Upravit záložku</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Uložit jako PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Zapnout zobrazení čtečky</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Vypnout zobrazení čtečky</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Přeložit stránku…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Přeloženo do jazyka %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Tisk…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nejsou tu žádná rozšíření</string> @@ -387,8 +415,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Zásady ochrany osobních údajů</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Další informace naleznete v našich oznámeních o ochraně osobních údajů</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Rádi vás udržujeme v bezpečí</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -594,7 +620,9 @@ <!-- Preference for language --> <string name="preferences_language">Jazyk</string> <!-- Preference for translation --> - <string name="preferences_translation">Překladač</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Překladač</string> + <!-- Preference for translations --> + <string name="preferences_translations">Překlady</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Možnosti hlášení</string> <!-- Preference for data collection --> @@ -668,10 +696,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Vyžadováno</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Volitelné</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Čtení a změna údajů webových stránek</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Smazat webovou stránku</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Povolit pro všechny stránky</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -796,8 +820,6 @@ <string name="preferences_sync_history">Historii</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Záložky</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Přihlašovací údaje</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Hesla</string> <!-- Preference for syncing tabs --> @@ -825,8 +847,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s na %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Platební karty</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Platební metody</string> <!-- Preference for syncing addresses --> @@ -842,6 +862,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Panel z %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">V aplikaci %1$s bylo zavřeno %2$d panelů</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Zobrazení nedávno zavřených panelů</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Výjimky</string> @@ -1783,12 +1811,8 @@ <string name="add_to_homescreen_description_2">Tuto stránku si můžete snadno přidat na domovskou obrazovku svého zařízení. Budete k ní mít okamžitý přístup a prohlížení bude rychlejší se zážitkem jako v aplikaci.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Přihlašovací údaje</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Hesla</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukládat přihlašovací údaje</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Ukládání hesel</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Před uložením se zeptat</string> @@ -1803,46 +1827,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Vyplňování a ukládání uživatelských jmen a hesel v dalších aplikacích na vašem zařízení.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Přidat přihlašovací údaje</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Přidat heslo</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronizovat přihlašovací údaje</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synchronizovat hesla</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronizovat přihlašovací údaje mezi zařízeními</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synchronizovat hesla napříč zařízeními</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložené přihlašovací údaje</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Uložená hesla</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložené nebo synchronizované údaje aplikace %s se zobrazí tady.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Hesla, která uložíte nebo synchronizujete s aplikací %s, budou uvedena zde. Všechna uložená hesla jsou šifrována.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Zjistit více o službě Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Další informace o synchronizaci</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Výjimky</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Tady se zobrazí přihlašovací údaje, které se nebudou ukládat.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">Aplikace %s nebude nikdy ukládat hesla pro stránky uvedené v tomto seznamu.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Pro následující servery se nebudou přihlašovací údaje ukládat.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">Aplikace %s nebude nikdy ukládat hesla pro tyto stránky.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Odebrat všechny výjimky</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Hledat přihlašovací údaje</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Hledat v heslech</string> <!-- The header for the site that a login is for --> @@ -1871,17 +1876,11 @@ <string name="saved_login_reveal_password">Zobrazit heslo</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Skrýt heslo</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Odemknout pro zobrazení přihlašovacích údajů</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Pro zobrazení uložených hesel odemkněte</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zabezpečte své přihlašovací údaje a hesla</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Zabezpečte svá uložená hesla</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavte si gesto, PIN nebo heslo zámku obrazovky, který ochrání vaše uložené přihlašovací údaje, pokud by se vaše zařízení dostalo do ruky někomu jinému.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Nastavte si gesto, PIN nebo heslo zámku obrazovky, který ochrání vaše uložená hesla, pokud by se vaše zařízení dostalo do ruky někomu jinému.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Později</string> @@ -1900,9 +1899,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Naposledy použito</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Seřadit podle</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Nabídka pro řazení hesel</string> @@ -1911,41 +1907,27 @@ <string name="preferences_autofill">Automatické vyplňování</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresy</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Platební karty</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Platební metody</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukládat a automaticky vyplňovat karty</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Uložení a vyplnění platebních metod</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data jsou šifrována</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s šifruje všechny vaše uložené platební metody</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synchronizovat karty napříč zařízeními</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synchronizovat platební karty</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Přidat platební kartu</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Přidat kartu</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Správa uložených karet</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Spravovat karty</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Přidat adresu</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Správa adres</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukládat a automaticky vyplňovat adresy</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Ukládat a vyplňovat adresy</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Zahrnuje informace jako čísla a e-mailové a doručovací adresy</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Zahrnuje telefonní čísla a e-mailové adresy</string> @@ -1969,8 +1951,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Odstranit kartu</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Opravdu chcete tuto platební kartu smazat?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Odstranit kartu?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Smazat</string> @@ -1984,24 +1964,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Uložené karty</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Zadejte prosím platné číslo platební karty</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Zadejte platné číslo karty</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vyplňte prosím toto pole</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Zadejte jméno</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Odemknout pro zobrazení uložených karet</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zabezpečte své platební karty</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Zabezpečte vaše uložené platební metody</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavte si gesto, PIN nebo heslo zámku obrazovky, který ochrání vaše uložené platební karty, pokud by se vaše zařízení dostalo do ruky někomu jinému.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Nastavením vzoru zámku zařízení, kódu PIN nebo hesla ochráníte uložené platební metody před přístupem, pokud má vaše zařízení někdo jiný.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Nastavit</string> @@ -2010,9 +1981,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Odemkněte zařízení</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Odemkněte pro použití informací o platební kartě</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Odemknout pro použití uložených způsobů platby</string> <!-- Title of the "Add address" screen --> @@ -2021,12 +1989,6 @@ <string name="addresses_edit_address">Upravit adresu</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Správa adres</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Křestní jméno</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Prostřední jméno</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Příjmení</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Název</string> <!-- The header for the street address of an address --> @@ -2053,8 +2015,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Smazat adresu</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Opravdu chcete tuto adresu smazat?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Smazat tuto adresu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Smazat</string> @@ -2154,49 +2114,29 @@ <string name="login_menu_delete_button">Odstranit</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Upravit</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Opravdu chcete tyto přihlašovací údaje odstranit?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Opravdu chcete smazat toto heslo?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Odstranit</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Zrušit</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Možnosti přihlášení</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Možnosti hesel</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Textové pole pro webovou adresu pro přihlašovací údaje.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Upravitelné textové pole pro adresu webové stránky.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Textové pole pro uživatelské jméno z přihlašovacích údajů.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Upravitelné textové pole pro uživatelské jméno.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Textové pole pro heslo z přihlašovacích údajů.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Upravitelné textové pole pro heslo.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložit změny přihlašovacích údajů.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Uložit změny.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Upravit</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Upravit heslo</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Přidat nové přihlašovací údaje</string> <!-- The page title for adding new password. --> <string name="add_login_2">Přidat heslo</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Je vyžadováno heslo</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Zadejte heslo</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Uživatelské je povinné</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Zadejte uživatelské jméno</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Adresa serveru je povinná</string> @@ -2603,6 +2543,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Zavřít Překlady</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Některá nastavení jsou dočasně nedostupná.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Překlady</string> @@ -2626,6 +2569,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Vyberte jazyk, u kterého chcete spravovat předvolby „vždy překládat“ a „nikdy nepřekládat“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Nelze načíst jazyky. Zkuste to prosím později.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Nabídnout překlad (výchozí)</string> @@ -2649,6 +2595,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Odebrat %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Nelze načíst stránky. Zkuste to prosím později.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Smazat %1$s?</string> @@ -2727,13 +2675,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Návrat zpět</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Otevřít ladicí panel</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Nástroje pro panely</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Počet panelů</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktivní</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktivní</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktivní</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Neaktivní</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2744,6 +2697,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Nástroj na vytváření panelů</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Počet panelů, které chcete vytvořit</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Textové pole je prázdné</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Zadejte prosím pouze kladná celá čísla</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Zadejte prosím číslo větší než nula</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Byl překročen maximální počet panelů (%1$s), které mohou být vygenerovány v jedné operaci</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Přidat mezi aktivní panely</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2760,11 +2723,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Zásady ochrany osobních údajů</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Odeslat</string> + <string name="micro_survey_submit_button_label">Odeslat</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Zavřít</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Zavřít</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Děkujeme za vaši zpětnou vazbu!</string> + <string name="micro_survey_feedback_confirmation">Děkujeme za vaši zpětnou vazbu!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Velmi spokojený</string> <!-- Option for likert scale --> @@ -2776,6 +2739,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Velmi nespokojený</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Otevře průzkum</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Zavře průzkum</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Zavřít</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Přihlašovací údaje</string> diff --git a/mobile/android/fenix/app/src/main/res/values-cy/strings.xml b/mobile/android/fenix/app/src/main/res/values-cy/strings.xml index dda3ca243d..0aac4e2556 100644 --- a/mobile/android/fenix/app/src/main/res/values-cy/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-cy/strings.xml @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ychwanegion</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Estyniadau</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Rheoli estyniadau</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Darganfod rhagor o estyniadau</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Manylion cyfrif</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Agorwch mewn tab arferol</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Ychwanegu i’r sgrin Cartref</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Ychwanegu i\'r sgrin Cartref…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Gosod</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Cyfieithu\'r dudalen</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Cadw i gasgliad…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Cadw i Gasgliad</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Rhannu</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Rhannu…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Agor yn %1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Cadw</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Gosod nod tudalen i\'r dudalen hon</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Golygu nod tudalen</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Cadw fel PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Trowch y Golwg Darllen ymlaen</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Diffodd y Golwg Darllen</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Cyfieithu tudalen…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Wedi\'i gyfieithu i %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Argraffu…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Dim estyniadau yma</string> @@ -378,8 +406,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Hysbysiad preifatrwydd Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Darllenwch ein hysbysiad preifatrwydd</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Rydyn ni wrth ein bodd yn eich cadw chi’n ddiogel</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -589,7 +615,9 @@ <!-- Preference for language --> <string name="preferences_language">Iaith</string> <!-- Preference for translation --> - <string name="preferences_translation">Cyfieithu</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Cyfieithu</string> + <!-- Preference for translations --> + <string name="preferences_translations">Cyfieithu</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Dewisiadau data</string> <!-- Preference for data collection --> @@ -663,10 +691,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Angenrheidiol</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Dewisol</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Darllen a newid data gwefan</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Dileu gwefan</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Caniatáu ar gyfer pob gwefan</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -792,8 +816,6 @@ <string name="preferences_sync_history">Hanes</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Nodau Tudalen</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Mewngofnodion</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Cyfrineiriau</string> <!-- Preference for syncing tabs --> @@ -820,8 +842,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s o %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cardiau credyd</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Dulliau talu</string> <!-- Preference for syncing addresses --> @@ -837,6 +857,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab o %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tabiau wedi cau: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Gweld tabiau a gaewyd yn ddiweddar</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Eithriadau</string> @@ -1761,12 +1789,8 @@ <string name="add_to_homescreen_description_2">Gallwch ychwanegu’r wefan hon yn hawdd i sgrin Cartref eich ffôn i gael mynediad ar unwaith a phori’n gyflymach gyda phrofiad tebyg i ap.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Mewngofnodion a chyfrineiriau</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Cyfrineiriau</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Cadw mewngofnodion a chyfrineiriau</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Cadw cyfrineiriau</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Gofyn i gadw</string> @@ -1781,47 +1805,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Llenwi enwau defnyddwyr a chyfrineiriau mewn apiau eraill ar eich dyfais.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ychwanegu mewngofnod</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Ychwanegu cyfrinair</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Cydweddu mewngofnodion</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Cydweddu cyfrineiriau</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Cydweddu mewngofnodion ar draws dyfeisiau</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Cydweddu cyfrineiriau ar draws dyfeisiau</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Mewngofnodion wedi’u cadw</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Cyfrineiriau wedi\'u cadw</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Bydd y mewngofnodi rydych yn eu cadw neu’n cydweddu i %s i’w gweld yma.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Bydd y cyfrineiriau rydych yn eu cadw neu eu cydweddu i %s yn cael eu rhestru yma. Mae\'r holl gyfrineiriau rydych chi\'n eu cadw wedi\'u hamgryptio. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Dysgu rhagor am Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Dysgwch fwy am gydweddu</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Eithriadau</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Bydd mewngofnodion a chyfrineiriau sydd heb eu cadw i’w gweld yma.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">Fydd %s ddim yn cadw cyfrineiriau ar gyfer gwefannau sy\'n cael eu rhestru yma.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ni fydd mewngofnodion a chyfrineiriau’n cael eu cadw ar gyfer y gwefannau hyn.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">Fydd %s ddim yn cadw cyfrineiriau ar gyfer y gwefannau hyn.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Dileu pob eithriad</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Chwilio mewngofnodion</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Chwilio cyfrineiriau</string> <!-- The header for the site that a login is for --> @@ -1851,17 +1856,11 @@ <string name="saved_login_reveal_password">Dangos cyfrinair</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Cuddio cyfrinair</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Datgloi i weld eich mewngofnodi wedi’u cadw</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Datgloi i weld eich cyfrineiriau wedi\'u cadw</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Diogelu mewngofnodion a chyfrineiriau</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Diogelwch eich cyfrineiriau wedi\'u cadw</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Creu patrwm cloi dyfais, PIN, neu gyfrinair i ddiogelu eich mewngofnodion a’ch cyfrineiriau sydd wedi’u cadw rhag i rhywun arall sydd â mynediad i’ch dyfais.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Gosodwch batrwm clo dyfais, PIN, neu gyfrinair i ddiogelu eich cyfrineiriau sydd wedi\'u cadw rhag i rywun arall sydd â\'ch dyfais gael mynediad iddyn nhw.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Yn hwyrach</string> @@ -1878,8 +1877,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Enw (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Defnyddiwyd Diwethaf</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Trefnu dewislen mewngofnodi</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Didoli dewislen cyfrineiriau</string> @@ -1889,41 +1886,27 @@ <string name="preferences_autofill">Awtolanw</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Cyfeiriadau</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cardiau credyd</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Dulliau talu</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cadw ac awtolanw cardiau</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Cadw a llanw dulliau talu</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Mae data wedi’i amgryptio</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">Mae %s yn amgryptio pob dull talu rydych yn ei gadw</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Cydweddu cardiau ar draws dyfeisiau</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Cydweddu cardiau</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Ychwanegu cerdyn credyd</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Ychwanegu cerdyn</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Rheoli cardiau wedi’u cadw</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Rheoli cardiau</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Ychwanegu cyfeiriad</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Rheoli cyfeiriadau</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Cadw ac awtolanw cyfeiriadau</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Cadw a llanw cyfeiriadau</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Cynhwyswch fanylion fel rhifau, cyfeiriadau e-bost a chludo</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Yn cynnwys rhifau ffôn a chyfeiriadau e-bost</string> @@ -1947,8 +1930,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Dileu cerdyn</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ydych chi’n siŵr eich bod am ddileu’r cerdyn credyd yma?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Dileu cerdyn?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Dileu</string> @@ -1962,24 +1943,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cardiau wedi’u cadw</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Rhowch rif cerdyn credyd dilys</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Rhoi rif cerdyn dilys</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Llanwch y maes yma.</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Ychwanegu enw</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Datgloi i weld y cardiau rydych wedi’u cadw</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Diogelwch eich cerdyn credyd</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Diogelu eich dulliau talu sydd wedi\'u cadw</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Gosodwch batrwm cloi dyfais, PIN, neu gyfrinair i ddiogelu eich mewngofnodion a’ch cyfrineiriau sydd wedi’u cadw rhag i rhywun arall sydd â mynediad i’ch dyfais.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Gosodwch batrwm clo dyfais, PIN, neu gyfrinair i ddiogelu eich dulliau talu rhag i rywun arall sydd â\'ch dyfais gael mynediad iddyn nhw.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Gosod nawr</string> @@ -1988,9 +1960,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Datgloi’ch dyfais</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Datglowch i ddefnyddio manylion cerdyn credyd wedi’i storio</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Datgloi i ddefnyddio dulliau talu wedi\'u cadw</string> <!-- Title of the "Add address" screen --> @@ -1999,12 +1968,6 @@ <string name="addresses_edit_address">Golygu cyfeiriad</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Rheoli cyfeiriadau</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Enw Cyntaf</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Enw Canol</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Enw Olaf</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Enw</string> <!-- The header for the street address of an address --> @@ -2031,8 +1994,6 @@ <string name="addressess_delete_address_button">Dileu cyfeiriad</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ydych chi’n siŵr eich bod am ddileu’r cyfeiriad hwn?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Dileu\'r cyfeiriad hwn?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Dileu</string> @@ -2130,49 +2091,29 @@ <string name="login_menu_delete_button">Dileu</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Golygu</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ydych chi’n siŵr eich bod eisiau dileu’r mewngofnod?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Ydych chi\'n siŵr eich bod am ddileu\'r cyfrinair hwn?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Dileu</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Diddymu</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Dewisiadau mewngofnodi</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Dewisiadau cyfrineiriau</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Maes testun golygadwy cyfeiriad gwe’r mewngofnodi.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Maes testun golygadwy y wefan.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Maes testun golygadwy enw defnyddiwr y mewngofnodi.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Maes testun golygadwy yr enw defnyddiwr.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Maes testun golygadwy cyfrinair y mewngofnodi.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Maes testun golygadwy y cyfrinair.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Cadw newidiadau i’r mewngofnodi.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Cadw newidiadau.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Golygu</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Golygu cyfrinair</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ychwanegu mewngofnod newydd</string> <!-- The page title for adding new password. --> <string name="add_login_2">Ychwanegu cyfrinair</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Mae angen cyfrinair</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Rhowch gyfrinair</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Mae angen enw defnyddiwr</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Rhoi enw defnyddiwr</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Mae angen enw gwesteiwr</string> @@ -2580,6 +2521,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Cau\'r ddalen Cyfieithiadau</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Nid yw rhai gosodiadau ar gael dros dro.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Cyfieithu</string> @@ -2602,6 +2546,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Dewiswch iaith i reoli dewisiadau ”cyfieithu bob tro“ a ”peidio â chyfieithu“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Methu llwytho ieithoedd. Gwiriwch yn ôl yn nes ymlaen.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Cynnig i gyfieithu (rhagosodedig)</string> @@ -2624,6 +2571,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Tynnu %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Methu llwytho gwefannau. Gwiriwch yn ôl yn nes ymlaen.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Dileu %1$s?</string> @@ -2701,13 +2650,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Symud nôl</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Agor drôr dadfygio</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Offer Tab</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Cyfrif tab</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Gweithredol</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Gweithredol</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Gweithredol</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Anweithredol</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2718,6 +2672,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Teclyn creu tabiau</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Nifer y tabiau i\'w creu</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Mae maes testun yn wag</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Rhowch gyfanrifau positif yn unig</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Rhowch rif sy\'n fwy na sero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Wedi mynd y tu hwnt i uchafswm nifer y tabiau (%1$s) y gellir eu cynhyrchu mewn un gweithrediad</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Ychwanegu at y tabiau gweithredol</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2734,11 +2698,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Hysbysiad Preifatrwydd</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Cyflwyno</string> + <string name="micro_survey_submit_button_label">Cyflwyno</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Cau</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Cau</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Diolch am eich adborth!</string> + <string name="micro_survey_feedback_confirmation">Diolch am eich adborth!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Bodlon Iawn</string> <!-- Option for likert scale --> @@ -2750,6 +2714,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Anfodlon Iawn</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Agor arolwg</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Cau\'r arolwg</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Cau</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Mewngofnodion</string> diff --git a/mobile/android/fenix/app/src/main/res/values-da/strings.xml b/mobile/android/fenix/app/src/main/res/values-da/strings.xml index 98609735d8..5759e3a0a6 100644 --- a/mobile/android/fenix/app/src/main/res/values-da/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-da/strings.xml @@ -49,12 +49,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Gemt for nylig</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Gemt for nylig</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Vis alle gemte bogmærker</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Vis alle gemte bogmærker</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Fjern</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Fjern</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Bogmærker</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Vis alle bogmærker</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Fjern</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s er lavet af Mozilla.</string> @@ -192,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tilføjelser</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Udvidelser</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Håndter udvidelser</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Opdag flere udvidelser</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontooplysninger</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -210,6 +222,8 @@ <string name="browser_menu_open_in_regular_tab">Åbn i almindeligt faneblad</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Føj til startskærm</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Føj til startskærm…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installer</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -221,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Oversæt side</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Gem til samling…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Gem til samling</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Del</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Del…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Åbn i %1$s</string> @@ -276,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Gem</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bogmærk denne side</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Rediger bogmærke</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Gem som PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Slå læsevisning til</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Slå læsevisning fra</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Oversæt side…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Oversat til %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Udskriv…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ingen udvidelser her</string> @@ -372,8 +408,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Privatlivserklæring for Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Læs mere i vores privatlivserklæring</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Vi elsker at holde dig sikker</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -582,7 +616,9 @@ <!-- Preference for language --> <string name="preferences_language">Sprog</string> <!-- Preference for translation --> - <string name="preferences_translation">Oversættelse</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Oversættelse</string> + <!-- Preference for translations --> + <string name="preferences_translations">Oversættelser</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Valg for data</string> <!-- Preference for data collection --> @@ -654,10 +690,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Påkrævede</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valgfrie</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Læse og ændre webstedsdata</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Slet websted</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tillad for alle websteder</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -686,7 +718,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Hop tilbage til</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Seneste bogmærker</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Seneste bogmærker</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Bogmærker</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Besøgt for nylig</string> @@ -780,8 +814,6 @@ <string name="preferences_sync_history">Historik</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bogmærker</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Adgangskoder</string> <!-- Preference for syncing tabs --> @@ -808,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s på %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betalingsmetoder</string> <!-- Preference for syncing addresses --> @@ -825,6 +855,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Faneblad fra %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-faneblade lukket: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Vis nyligt lukkede faneblade</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Undtagelser</string> @@ -1746,12 +1784,8 @@ <string name="add_to_homescreen_description_2">Du kan nemt føje dette websted til din enheds startskærm for at have hurtig adgang til det og browse hurtigere med en app-lignende oplevelse.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins og adgangskoder</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Adgangskoder</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Gem logins og adgangskoder</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Gem adgangskoder</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Bed om at gemme</string> @@ -1766,47 +1800,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Udfyld brugernavne og adgangskoder i andre apps på din enhed.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Tilføj login</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Tilføj adgangskode</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser logins</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synkroniser adgangskoder</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser logins på tværs af enheder</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synkroniser adgangskoder på tværs af enheder</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Gemte logins</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Gemte adgangskoder</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">De logins, du gemmer eller synkroniserer til %s, vises her.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Adgangskoderne, du gemmer i eller synkroniserer med %s vil blive vist her. Alle dine gemte adgangskoder bliver krypteret. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Læs mere om Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Læs mere om synkronisering</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Undtagelser</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins og adgangskoder, der ikke er gemt, vises her.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s gemmer ikke adgangskoder til websteder vist her.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins og adgangskoder vil ikke blive gemt for disse websteder.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s gemmer ikke adgangskoder til disse websteder.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Slet alle undtagelser</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Søg efter logins</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Søg efter adgangskoder</string> <!-- The header for the site that a login is for --> @@ -1835,17 +1850,11 @@ <string name="saved_login_reveal_password">Vis adgangskode</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Skjul adgangskode</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås op for at se dine gemte logins</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Lås op for at se dine gemte adgangskoder</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Gør dine logins og adgangskoder sikre</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Gør dine gemte adgangskoder sikre</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Indstil en pinkode, en adgangskode eller et låsemønster på din enhed for at forhindre, at andre mennesker får adgang til dine gemte logins og adgangskoder, hvis de har adgang til din enhed.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Indstil en pinkode, en adgangskode eller et låsemønster på din enhed for at forhindre, at andre mennesker får adgang til dine gemte adgangskoder, hvis de har adgang til din enhed.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Senere</string> @@ -1863,9 +1872,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Senest brugt</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sortér menuen logins</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menuen sorter adgangskoder</string> @@ -1874,40 +1880,26 @@ <string name="preferences_autofill">Autofyld</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresser</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betalingsmetoder</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gem og autofyld betalingskort</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Gem og udfyld betalingsmetoder</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data er krypteret</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s krypterer alle betalingsmetoder, du gemmer</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synkroniser kort på tværs af enheder</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synkroniser kort</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Tilføj betalingskort</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Tilføj kort</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Håndter gemte kort</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Håndter kort</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Tilføj adresse</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Håndter adresser</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Gem og autofyld adresser</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Gem og udfyld adresser</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inkluderer oplysninger såsom telefonnumre, mail- og forsendelsesadresser</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inkluderer telefonnumre og mailadresser</string> @@ -1931,8 +1923,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Slet kort</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på, at du vil slette dette betalingskort?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Slet kort?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Slet</string> @@ -1946,24 +1936,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Gemte kort</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Indtast et gyldigt betalingskortnummer</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Indtast et gyldigt kortnummer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Udfyld dette felt</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Tilføj navn</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Lås op for at se dine gemte betalingskort</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Beskyt dine betalingskort</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Gør dine gemte betalingsmetoder sikre</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Indstil en pinkode, en adgangskode eller et låsemønster på din enhed for at forhindre, at andre mennesker får adgang til dine gemte betalingskort, hvis de har adgang til din enhed.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Indstil en pinkode, en adgangskode eller et låsemønster på din enhed for at forhindre, at andre mennesker får adgang til dine gemte betalingsmetoder, hvis de har adgang til din enhed.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Indstil nu</string> @@ -1971,8 +1952,6 @@ <string name="credit_cards_warning_dialog_later">Senere</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Lås din enhed op</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås op for at anvende gemte informationer om betalingskort</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Lås op for at bruge gemte betalingsmetoder</string> @@ -1982,12 +1961,6 @@ <string name="addresses_edit_address">Rediger adresse</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Håndter adresser</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Fornavn</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Mellemnavn</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Efternavn</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Navn</string> <!-- The header for the street address of an address --> @@ -2013,8 +1986,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Slet adresse</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på, at du vil slette denne adresse?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Slet denne adresse?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Slet</string> @@ -2113,49 +2084,29 @@ <string name="login_menu_delete_button">Slet</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Rediger</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på, at du vil slette dette login?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Er du sikker på, at du vil slette denne adgangskode?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Slet</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annuller</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Login-indstillinger</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Adgangskode-indstillinger</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfelt for login’ets webadresse.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Det redigerbare tekstfelt for webadressen.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfelt for login’ets brugernavn.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Det redigerbare tekstfelt for brugernavnet.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfelt for login’ets adgangskode.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Det redigerbare tekstfelt for adgangskoden.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Gem ændringer til login.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Gem ændringer.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Rediger</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Rediger adgangskode</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Tilføj nyt login</string> <!-- The page title for adding new password. --> <string name="add_login_2">Tilføj adgangskode</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Adgangskode påkrævet</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Indtast en adgangskode</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Brugernavn påkrævet</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Indtast et brugernavn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Værtsnavn påkrævet</string> @@ -2505,6 +2456,8 @@ <string name="translations_bottom_sheet_negative_button">Ikke nu</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Vis oprindelig</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Original uoversat side indlæst</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Færdig</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2562,6 +2515,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Luk oversættelsesoversigten</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Nogle indstillinger er midlertidigt utilgængelige.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Oversættelser</string> @@ -2584,6 +2540,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Vælg et sprog for at håndtere indstillingerne ”oversæt altid“ og ”oversæt aldrig“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Kunne ikke indlæse sprog. Prøv igen senere.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Tilbyd at oversætte (standard)</string> @@ -2607,6 +2566,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Fjern %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Kunne ikke indlæse websteder. Prøv igen senere.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Slet %1$s?</string> @@ -2692,7 +2653,9 @@ <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Antal faneblade</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktive</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktive</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktive</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2703,6 +2666,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Værktøj til oprettelse af faneblade</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Antal faneblade, der skal oprettes</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstfeltet er tomt</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Indtast kun positive heltal</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Indtast et tal større end nul</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Overskredet det maksimale antal faneblade (%1$s), der kan oprettes i én operation</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Føj til aktive faneblade</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2719,11 +2692,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Privatlivserklæring</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Indsend</string> + <string name="micro_survey_submit_button_label">Indsend</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Luk</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Luk</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Tak for tilbagemeldingen!</string> + <string name="micro_survey_feedback_confirmation">Tak for tilbagemeldingen!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Meget tilfreds</string> <!-- Option for likert scale --> @@ -2735,6 +2708,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Meget utilfreds</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Åbn undersøgelse</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Luk undersøgelse</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Luk</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Logins</string> diff --git a/mobile/android/fenix/app/src/main/res/values-de/strings.xml b/mobile/android/fenix/app/src/main/res/values-de/strings.xml index ae6645a6fe..c78b9aa5fa 100644 --- a/mobile/android/fenix/app/src/main/res/values-de/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-de/strings.xml @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Erweiterungen</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Erweiterungen verwalten</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Weitere Erweiterungen entdecken</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontoinformationen</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">In normalem Tab öffnen</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Zum Startbildschirm hinzufügen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Zum Startbildschirm hinzufügen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installieren</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -231,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Seite übersetzen</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">In Sammlung speichern…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">In Sammlung speichern</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Teilen</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Teilen…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">In %1$s öffnen</string> @@ -288,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Speichern</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Lesezeichen für diese Seite hinzufügen</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Lesezeichen bearbeiten</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Als PDF speichern…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Leseansicht aktivieren</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Leseansicht deaktivieren</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Seite übersetzen…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Übersetzt in %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Drucken…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Keine Erweiterungen vorhanden</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox-Datenschutzhinweis</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Weitere Informationen finden Sie in unserem Datenschutzhinweis</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Wir schützen Sie gerne</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -595,7 +621,9 @@ <!-- Preference for language --> <string name="preferences_language">Sprache</string> <!-- Preference for translation --> - <string name="preferences_translation">Übersetzung</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Übersetzung</string> + <!-- Preference for translations --> + <string name="preferences_translations">Übersetzungen</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Datenübermittlung</string> <!-- Preference for data collection --> @@ -669,10 +697,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Erforderlich</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Website-Daten lesen und ändern</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Website löschen</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Für alle Websites erlauben</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -798,8 +822,6 @@ <string name="preferences_sync_history">Chronik</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Lesezeichen</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passwörter</string> <!-- Preference for syncing tabs --> @@ -826,8 +848,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s auf %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditkarten</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Zahlungsmethoden</string> <!-- Preference for syncing addresses --> @@ -844,6 +864,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab von %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-Tabs geschlossen: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Kürzlich geschlossene Tabs anzeigen</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Ausnahmen</string> @@ -1797,12 +1825,8 @@ <string name="add_to_homescreen_description_2">Sie können diese Website einfach zum Startbildschirm Ihres Geräts hinzufügen, um unmittelbaren Zugriff darauf zu haben und sie wie eine App zu nutzen.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten und Passwörter</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passwörter</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten und Passwörter speichern</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Passwörter speichern</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Zum Speichern nachfragen</string> @@ -1818,46 +1842,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Benutzernamen und Passwörter auf Webseite bei Nutzung von anderen Apps auf Ihrem Gerät automatisch ausfüllen.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten hinzufügen</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Passwort hinzufügen</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten synchronisieren</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Passwörter synchronisieren</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten zwischen Geräten synchronisieren</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Passwörter geräteübergreifend synchronisieren</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Gespeicherte Zugangsdaten</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Gespeicherte Passwörter</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Die Zugangsdaten, die Sie speichern oder mit %s synchronisieren, werden hier angezeigt.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Die Passwörter, die Sie speichern oder mit %s synchronisieren, werden hier aufgelistet. Alle gespeicherten Passwörter werden verschlüsselt.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Erfahren Sie mehr über Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Weitere Informationen über Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Ausnahmen</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten und Passwörter, die nicht gespeichert werden, werden hier angezeigt.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s speichert keine Passwörter für die hier aufgeführten Websites.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten und Passwörter werden für diese Websites nicht gespeichert.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s speichert keine Passwörter für diese Websites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Alle Ausnahmen löschen</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Zugangsdaten durchsuchen</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Passwörter durchsuchen</string> <!-- The header for the site that a login is for --> @@ -1886,17 +1891,11 @@ <string name="saved_login_reveal_password">Passwort anzeigen</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Passwort verbergen</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Zum Anzeigen Ihrer gespeicherten Zugangsdaten entsperren</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Zum Anzeigen Ihrer gespeicherten Passwörter entsperren</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Sichern Sie Ihre Zugangsdaten und Passwörter</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Sichern Sie Ihre gespeicherten Passwörter</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Richten Sie ein Gerätesperrmuster, eine PIN oder ein Passwort ein, um zu verhindern, dass auf Ihre gespeicherten Zugangsdaten und Passwörter zugegriffen wird, wenn jemand anderes über Ihr Gerät verfügt.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Richten Sie ein Gerätesperrmuster, eine PIN oder ein Passwort ein, um zu verhindern, dass auf Ihre gespeicherten Passwörter zugegriffen wird, wenn jemand anderes über Ihr Gerät verfügt.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Später</string> @@ -1914,9 +1913,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Zuletzt verwendet</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menü mit Zugangsdaten sortieren</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menü „Passwörter sortieren“</string> @@ -1925,41 +1921,27 @@ <string name="preferences_autofill">Automatisch ausfüllen</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adressen</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditkarten</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Zahlungsmethoden</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Autovervollständigung für Kreditkartendaten</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Zahlungsmethoden speichern und ausfüllen</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Daten sind verschlüsselt</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s verschlüsselt alle von Ihnen gespeicherten Zahlungsmethoden</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Karten zwischen Geräten synchronisieren</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Kreditkarten synchronisieren</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditkarte hinzufügen</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Karte hinzufügen</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gespeicherte Karten verwalten</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Karten verwalten</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adresse hinzufügen</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adressen verwalten</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Autovervollständigung für Adressen</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adressen speichern und ausfüllen</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Dies beinhaltetet Nummern, E-Mail- und Lieferadressen</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Enthält Telefonnummern und E-Mail-Adressen</string> @@ -1983,8 +1965,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Karte löschen</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Soll diese Kreditkarte wirklich gelöscht werden?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Karte löschen?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Löschen</string> @@ -1998,24 +1978,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Gespeicherte Karten</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Bitte geben Sie eine gültige Kreditkartennummer ein</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Geben Sie eine gültige Kartennummer ein</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Bitte füllen Sie dieses Feld aus</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Fügen Sie einen Namen hinzu</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Zum Anzeigen Ihrer gespeicherten Karten entsperren</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Sichern Sie Ihre Kreditkarten</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Sichern Sie Ihre gespeicherten Zahlungsmethoden</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Richten Sie ein Gerätesperrmuster, eine PIN oder ein Passwort ein, um zu verhindern, dass auf Ihre gespeicherten Karten zugegriffen wird, wenn jemand anderes über Ihr Gerät verfügt.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Richten Sie ein Gerätesperrmuster, eine PIN oder ein Passwort ein, um zu verhindern, dass auf Ihre gespeicherten Zahlungsmethoden zugegriffen wird, wenn jemand anderes über Ihr Gerät verfügt.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Jetzt einrichten</string> @@ -2024,9 +1995,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Entsperren Sie Ihr Gerät</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Entsperren, um gespeicherte Kreditkartendaten zu verwenden</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Zum Verwenden Ihrer gespeicherten Zahlungsmethoden entsperren</string> <!-- Title of the "Add address" screen --> @@ -2035,12 +2003,6 @@ <string name="addresses_edit_address">Adresse bearbeiten</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adressen verwalten</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Vorname</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Zweiter Vorname</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Nachname</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Name</string> <!-- The header for the street address of an address --> @@ -2067,8 +2029,6 @@ <string name="addressess_delete_address_button">Adresse löschen</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Soll diese Adresse wirklich gelöscht werden?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Diese Adresse löschen?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Löschen</string> @@ -2166,49 +2126,29 @@ <string name="login_menu_delete_button">Entfernen</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Bearbeiten</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Sollen diese Zugangsdaten wirklich gelöscht werden?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Soll dieses Passwort wirklich gelöscht werden?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Löschen</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Abbrechen</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Optionen für Zugangsdaten</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Passwort-Optionen</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Das bearbeitbare Textfeld für die Internetadresse der Zugangsdaten.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Das bearbeitbare Textfeld für die Adresse der Website.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Das bearbeitbare Textfeld für den Benutzernamen der Zugangsdaten.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Das bearbeitbare Textfeld für den Benutzernamen.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Das bearbeitbare Textfeld für das Passwort der Zugangsdaten.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Das bearbeitbare Textfeld für das Passwort.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Änderungen an Zugangsdaten speichern.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Änderungen speichern.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Bearbeiten</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Passwort bearbeiten</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Neue Zugangsdaten hinzufügen</string> <!-- The page title for adding new password. --> <string name="add_login_2">Passwort hinzufügen</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Passwort erforderlich</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Passwort eingeben</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Benutzername erforderlich</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Benutzername eingeben</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostname erforderlich</string> @@ -2614,6 +2554,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Seite „Übersetzungen“ schließen</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Einige Einstellungen sind vorübergehend nicht verfügbar.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Übersetzungen</string> @@ -2636,6 +2579,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Wählen Sie eine Sprache aus, um die Einstellungen für „Immer übersetzen“ und „Nie übersetzen“ zu verwalten.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Sprachen konnten nicht geladen werden. Bitte versuchen Sie es später erneut.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Übersetzung anbieten (Standard)</string> @@ -2658,6 +2604,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s entfernen</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Websites konnten nicht geladen werden. Bitte versuchen Sie es später erneut.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s löschen?</string> @@ -2735,13 +2683,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Rückwärts navigieren</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Debug-Schublade öffnen</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tab-Werkzeuge</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Tab-Anzahl</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiv</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiv</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiv</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktiv</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2752,6 +2705,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Werkzeug zur Tab-Erstellung</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Zu erstellende Tab-Anzahl</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Textfeld ist leer</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Bitte geben Sie nur positive ganze Zahlen ein</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Bitte geben Sie eine Zahl größer als 0 ein</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Die maximale Anzahl an Tabs (%1$s) wurde überschritten, die in einem Arbeitsschritt erzeugt werden kann</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Zu aktiven Tabs hinzufügen</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2768,11 +2731,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Datenschutzhinweis</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Absenden</string> + <string name="micro_survey_submit_button_label">Absenden</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Schließen</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Schließen</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Danke für Ihr Feedback!</string> + <string name="micro_survey_feedback_confirmation">Danke für Ihr Feedback!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Sehr zufrieden</string> <!-- Option for likert scale --> @@ -2784,6 +2747,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Sehr unzufrieden</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Umfrage öffnen</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Umfrage schließen</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Schließen</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Zugangsdaten</string> diff --git a/mobile/android/fenix/app/src/main/res/values-dsb/strings.xml b/mobile/android/fenix/app/src/main/res/values-dsb/strings.xml index 45de14681f..de2fba4cb7 100644 --- a/mobile/android/fenix/app/src/main/res/values-dsb/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-dsb/strings.xml @@ -200,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Dodanki</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Rozšyrjenja</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Rozšyrjenja zastojaś</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Dalšne rozšyrjenja namakaś</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontowe informacije</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -218,6 +222,8 @@ <string name="browser_menu_open_in_regular_tab">W normalnem rejtariku wócyniś</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Startowej wobrazowce pśidaś</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Startowej wobrazowce pśidaś…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalěrowaś</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -229,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Bok pśełožyś</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Do zběrki składowaś…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Do zběrki składowaś</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Źěliś</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Źěliś…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">W %1$s wócyniś</string> @@ -284,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Składowaś</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Toś ten bok ako cytańske znamje składowaś</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Cytańske znamje wobźěłaś</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Ako PDF składowaś…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Cytański naglěd zmóžniś</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Cytański naglěd znjemóžniś</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Bok pśełožyś…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Pśełožony do rěcy %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Śišćaś…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Žedne rozšyrjenja how</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Powěźeńka priwatnosći Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Zgóńśo wěcej w našej powěźeńce priwatnosći</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Šćitamy was rad</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -588,7 +614,9 @@ <!-- Preference for language --> <string name="preferences_language">Rěc</string> <!-- Preference for translation --> - <string name="preferences_translation">Pśełožk</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Pśełožk</string> + <!-- Preference for translations --> + <string name="preferences_translations">Pśełožki</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Datowy wuběrki</string> <!-- Preference for data collection --> @@ -661,10 +689,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Trjebny</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Na žycenje</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Websedłowe daty cytaś a změniś</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Websedło wulašowaś</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Za wšykne sedła dowóliś</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -790,8 +814,6 @@ <string name="preferences_sync_history">Historija</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Cytańske znamjenja</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Gronidła</string> <!-- Preference for syncing tabs --> @@ -818,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s wót %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditowe kórty</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Płaśeńske metody</string> <!-- Preference for syncing addresses --> @@ -835,6 +855,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Rajtark z %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Rejtariki %1$s zacynjone: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Rowno zacynjone rejtariki pokazaś</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Wuwześa</string> @@ -1763,12 +1791,8 @@ <string name="add_to_homescreen_description_2">Móžośo startowej wobrazowce swójogo rěda toś to websedło lažko pśidaś, aby direktny pśistup měł a malsnjej z dožywjenim nałoženja pśeglědował.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja a gronidła</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Gronidła</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja a gronidła składowaś</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Gronidła składowaś</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Pśed składowanim se pšašaś</string> @@ -1783,46 +1807,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Wužywaŕske mjenja a gronidła w drugich nałoženjach na wašom rěźe zasajźiś.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenje pśidaś</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Gronidło pśidaś</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja synchronizěrowaś</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Gronidła synchronizěrowaś</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja mjazy rědami synchronizěrowaś</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Gronidła pśez rědy synchronizěrowaś</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Skłaźone pśizjawjenja</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Skłaźone gronidła</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja, kótarež składujośo abo z %s synchronizěrujośo, se how pokažu.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Gronidła, kótarež składujośo abo z %s synchronizěrujośo, se how nalicyju. Wšykne gronidła, kótarež składujośo, se koděruju.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Zgóńśo wěcej wó Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Zgóńśo wěcej wó sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Wuwześa</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja a gronidła, kótarež se njeskładuju, se how pokažu.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s gronidła za sedła njeskładujo, kótarež su how nalicone.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja a gronidła se za toś te sedła njeskładuju.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s gronidła za toś te sedła njeskładujo.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Wšykne wuwześa wulašowaś</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjenja pytaś</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Gronidła pśepytaś</string> <!-- The header for the site that a login is for --> @@ -1852,17 +1857,11 @@ <string name="saved_login_reveal_password">Gronidło pokazaś</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Gronidła schowaś</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Za zwobraznjowanje wašych skłaźonych pśizjawjenjow wótwóriś</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Za zwobraznjowanje wašych skłaźonych kreditowych gronidłow wótwóriś</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zawěsććo swóje pśizjawjenja a gronidła</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Zawěsććo swóje skłaźone gronidła</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastajśo rědowy zastajeński muster, PIN abo gronidło, aby pśistupoju k swójim skłaźonym pśizjawjenjam a gronidłam zajźował, jolic něchten drugi ma waš rěd.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Nastajśo rědowy zastajeński muster, PIN abo gronidło, aby pśistupoju k swójim skłaźonym gronidłam zajźował, jolic něchten drugi ma waš rěd.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Pózdźej</string> @@ -1880,8 +1879,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Mjenju (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Slědnem wužyśu</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Meni pśizjawjeńskich datow sortěrowaś</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Meni „Gronidła sortěrowaś“</string> @@ -1891,41 +1888,27 @@ <string name="preferences_autofill">Awtomatiski wupołniś</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adrese</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditowe kórty</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Płaśeńske metody</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kórty składowaś a awtomatiski wupołniś</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Płaśeńske metody składowaś a wupołniś</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Daty su skoděrowane</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s wšykne płaśeńske metody koděrujo, kótarež składujośo</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Kórty pśez rědy synchronizěrowaś</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Kórty synchronizěrowaś</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditowu kórtu pśidaś</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Kórtu pśidaś</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Skłaźone kórty zastojaś</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Kórty zastojaś</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adresu pśidaś</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adrese zastojaś</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Adrese składowaś a awtomatiski wupołniś</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adrese składowaś a wupołniś</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Informacije ako licby, e-mailowe a rozpósłańske adrese zapśimjeś</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Wopśimujo telefonowe numery a e-mailowe adrese</string> @@ -1949,8 +1932,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kórtu wulašowaś</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Cośo napšawdu toś tu kreditowu kórtu lašowaś?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kórtu wulašowaś?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Lašowaś</string> @@ -1964,24 +1945,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Skłaźone kórty</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Pšosym zapódajśo płaśiwy numer kreditoweje kórty</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Zapódajśo płaśiwy kórtowy numer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Pšosym wupołńśo toś to pólo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Pśidajśo mě</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Za zwobraznjowanje wašych skłaźonych kreditowych kórtow wótwóriś</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditowe kórty zawěsćiś</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Zawěsććo swóje skłaźone płaśeńske metody</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastajśo rědowy zastajeński muster, PIN abo gronidło, aby pśistupoju k swójim skłaźonym kreditowym kórtam zajźował, jolic něchten drugi ma waš rěd.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Nastajśo rědowy zastajeński muster, PIN abo gronidło, aby pśistupoju k swójim skłaźonym płaśeńskim metodam zajźował, jolic něchten drugi ma waš rěd.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Něnto konfigurěrowaś</string> @@ -1990,9 +1962,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Wótwóŕśo swój rěd</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Blokěrowanje wótpóraś, aby se skłaźone informacije kreditoweje kórty wužywali</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Wótwóriś, aby wy skłaźone płaśeńske metody wužywał</string> <!-- Title of the "Add address" screen --> @@ -2001,12 +1970,6 @@ <string name="addresses_edit_address">Adresu wobźěłaś</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adrese zastojaś</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Pśedmě</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Druge pśedmě</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Familijowe mě</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Mě</string> <!-- The header for the street address of an address --> @@ -2033,8 +1996,6 @@ <string name="addressess_delete_address_button">Adresu lašowaś</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Cośo napšawdu toś tu adresu wulašowaś?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Toś tu adresu lašowaś?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Lašowaś</string> @@ -2132,49 +2093,29 @@ <string name="login_menu_delete_button">Lašowaś</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Wobźěłaś</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Cośo napšawdu toś to pśizjawjenje lašowaś?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Cośo napšawdu toś to gronidło lašowaś?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Lašowaś</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Pśetergnuś</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Pśizjawjeńske nastajenja</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Gronidłowe nastajenja</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobźěłujobne tekstowe pólo za webadresu pśizjawjenja.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Wobźěłujobne tekstowe pólo za adresu websedła.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobźěłujobne tekstowe pólo za wužywaŕske mě pśizjawjenja.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Wobźěłujobne tekstowe pólo za wužywaŕske mě.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobźěłujobne tekstowe pólo za gronidło pśizjawjenja.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Wobźěłujobne tekstowe pólo za gronidło.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Změny pśizjawjenja składowaś</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Změny składowaś.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobźěłaś</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Gronidło wobźěłaś</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Nowe pśizjawjenje pśidaś</string> <!-- The page title for adding new password. --> <string name="add_login_2">Gronidło pśidaś</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Gronidło trěbne</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Gronidło zapódaś</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Wužywaŕske mě trěbne.</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Wužywaŕske mě zapódaś</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostmě trěbne.</string> @@ -2583,6 +2524,9 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Bok Pśełožki zacyniś</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Někotare nastajenja njejsu nachylu k dispoziciji.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Pśełožki</string> @@ -2605,6 +2549,9 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Wubjeŕśo rěc, aby nastajeni „pśecej pśełožyś“ a „nigda njepśełožyś“ zastojał.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Rěcy njejsu se dali zacytaś. Pšosym wopytajśo pózdźej hyšći raz.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Pśełožk póbitowaś (standard)</string> @@ -2628,6 +2575,8 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s wótwónoźeś</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Sedła njejsu se dali zacytaś. Pšosym wopytajśo pózdźej hyšći raz.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s lašowaś?</string> @@ -2705,13 +2654,18 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Slědk nawigěrowaś</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Debug drawer wócyniś</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Rejtarikowe rědy</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Licba rejtarikow</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiwny</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiwny</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiwny</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Njeaktiwny</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2722,6 +2676,16 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <string name="debug_drawer_tab_tools_tab_creation_tool_title">Rěd za napóranje rejtarikow</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Licba rejtarikow, kótarež se maju napóraś</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstowe pólo jo prozne</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Pšosym zapódajśo jano pozitiwne cełe licby</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Pšosym zapódajśo licbu, kótaraž jo wětša ako nula</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Maksimalna licba rejtarikow (%1$s), kótarež daju se w jadnej operaciji generěrowaś, jo pśekšocona</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Aktiwnym rejtarikam pśidaś</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2738,11 +2702,11 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Powěźeńka priwatnosći</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Wótpósłaś</string> + <string name="micro_survey_submit_button_label">Wótpósłaś</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Zacyniś</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Zacyniś</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Źěkujomy se za waš komentar!</string> + <string name="micro_survey_feedback_confirmation">Źěkujomy se za waš komentar!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Wjelgin spokojom</string> <!-- Option for likert scale --> @@ -2754,6 +2718,14 @@ To buźo jano pomagaś, kwalitu pógódnośenjow pósuźiś, nic kwalitu produkt <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Wjelgin njespokojom</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Napšašowanje wócyniś</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Napšašowanje zacyniś</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Zacyniś</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Pśizjawjenja</string> diff --git a/mobile/android/fenix/app/src/main/res/values-el/strings.xml b/mobile/android/fenix/app/src/main/res/values-el/strings.xml index ede381ca29..cf34620a47 100644 --- a/mobile/android/fenix/app/src/main/res/values-el/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-el/strings.xml @@ -205,6 +205,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Πρόσθετα</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Επεκτάσεις</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Διαχείριση επεκτάσεων</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Ανακαλύψτε περισσότερες επεκτάσεις</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Πληροφορίες λογαριασμού</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -223,6 +227,8 @@ <string name="browser_menu_open_in_regular_tab">Άνοιγμα σε κανονική καρτέλα</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Προσθήκη στην αρχική οθόνη</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Προσθήκη στην αρχική οθόνη…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Εγκατάσταση</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -235,9 +241,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Μετάφραση σελίδας</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Αποθήκευση σε συλλογή…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Αποθήκευση στη συλλογή</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Κοινή χρήση</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Κοινή χρήση…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Άνοιγμα σε %1$s</string> @@ -291,6 +301,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Αποθήκευση</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Προσθήκη στους σελιδοδείκτες</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Επεξεργασία σελιδοδείκτη</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Αποθήκευση ως PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Ενεργοποίηση προβολής ανάγνωσης</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Απενεργοποίηση προβολής ανάγνωσης</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Μετάφραση σελίδας…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Μεταφράστηκε σε %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Εκτύπωση…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Δεν υπάρχουν επεκτάσεις</string> @@ -388,8 +416,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Σημείωση απορρήτου του Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Μάθετε περισσότερα στη σημείωση απορρήτου μας</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Μας αρέσει να σας προστατεύουμε</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -600,7 +626,9 @@ <!-- Preference for language --> <string name="preferences_language">Γλώσσα</string> <!-- Preference for translation --> - <string name="preferences_translation">Μετάφραση</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Μετάφραση</string> + <!-- Preference for translations --> + <string name="preferences_translations">Μεταφράσεις</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Επιλογές δεδομένων</string> <!-- Preference for data collection --> @@ -672,10 +700,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Απαιτείται</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Προαιρετικό</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Ανάγνωση και αλλαγή δεδομένων ιστοτόπων</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Διαγραφή ιστοτόπου</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Αποδοχή για όλους τους ιστοτόπους</string> @@ -804,8 +828,6 @@ <string name="preferences_sync_history">Ιστορικό</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Σελιδοδείκτες</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Συνδέσεις</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Κωδικοί πρόσβασης</string> <!-- Preference for syncing tabs --> @@ -832,8 +854,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s στο %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Πιστωτικές κάρτες</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Μέθοδοι πληρωμής</string> <!-- Preference for syncing addresses --> @@ -849,6 +869,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Καρτέλα από %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Έκλεισαν %2$d καρτέλες του %1$s</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Προβολή πρόσφατα κλεισμένων καρτελών</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Εξαιρέσεις</string> @@ -1785,12 +1813,8 @@ <string name="add_to_homescreen_description_2">Μπορείτε εύκολα να προσθέσετε αυτόν τον ιστότοπο στην αρχική οθόνη για άμεση πρόσβαση και ταχύτερη περιήγηση, σαν να ήταν εφαρμογή.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Συνδέσεις και κωδικοί πρόσβασης</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Κωδικοί πρόσβασης</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Αποθήκευση συνδέσεων και κωδικών πρόσβασης</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Αποθήκευση κωδικών πρόσβασης</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Ερώτηση για αποθήκευση</string> @@ -1806,46 +1830,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Συμπλήρωση στοιχείων σύνδεσης σε άλλες εφαρμογές της συσκευής σας.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Προσθήκη σύνδεσης</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Προσθήκη κωδικού πρόσβασης</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Συγχρονισμός συνδέσεων</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Συγχρονισμός κωδικών πρόσβασης</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Συγχρονισμός συνδέσεων μεταξύ συσκευών</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Συγχρονισμός κωδικών πρόσβασης μεταξύ των συσκευών σας</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Αποθηκευμένες συνδέσεις</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Αποθηκευμένοι κωδικοί πρόσβασης</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Οι συνδέσεις που αποθηκεύετε ή συγχρονίζετε στο %s θα εμφανίζονται εδώ.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Οι κωδικοί πρόσβασης που αποθηκεύετε ή συγχρονίζετε στο %s θα εμφανίζονται εδώ. Όλοι οι κωδικοί πρόσβασης που αποθηκεύετε κρυπτογραφούνται.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Μάθετε περισσότερα σχετικά με το Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Μάθετε περισσότερα σχετικά με τον συγχρονισμό</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Εξαιρέσεις</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Εδώ εμφανίζονται οι συνδέσεις και οι κωδικοί πρόσβασης που δεν αποθηκεύονται.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">Το %s δεν θα αποθηκεύει κωδικούς πρόσβασης για τους ιστοτόπους που αναφέρονται εδώ.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Δεν θα αποθηκεύονται στοιχεία σύνδεσης για τους εξής ιστοτόπους.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">Το %s δεν θα αποθηκεύει κωδικούς πρόσβασης για αυτούς τους ιστοτόπους.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Διαγραφή όλων των εξαιρέσεων</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Αναζήτηση συνδέσεων</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Αναζήτηση κωδικών πρόσβασης</string> <!-- The header for the site that a login is for --> @@ -1874,17 +1879,11 @@ <string name="saved_login_reveal_password">Εμφάνιση κωδικού πρόσβασης</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Απόκρυψη κωδικού πρόσβασης</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ξεκλειδώστε για να δείτε τις αποθηκευμένες συνδέσεις σας</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Ξεκλειδώστε για να δείτε τους αποθηκευμένους κωδικούς πρόσβασής σας</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Προστασία στοιχείων σύνδεσης</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Προστασία των αποθηκευμένων κωδικών πρόσβασής σας</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ορίστε ένα μοτίβο κλειδώματος συσκευής, ένα ΡΙΝ ή έναν κωδικό πρόσβασης για προστασία των αποθηκευμένων στοιχείων σύνδεσης, σε περίπτωση που κάποιος τρίτος αποκτήσει πρόσβαση στη συσκευή σας.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Ορίστε ένα μοτίβο κλειδώματος συσκευής, ένα ΡΙΝ ή έναν κωδικό πρόσβασης για την προστασία των αποθηκευμένων κωδικών πρόσβασής σας, σε περίπτωση που κάποιος τρίτος αποκτήσει πρόσβαση στη συσκευή σας.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Αργότερα</string> @@ -1901,9 +1900,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Τελευταία χρήση</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ταξινόμηση μενού σύνδεσης</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Μενού ταξινόμησης κωδικών πρόσβασης</string> @@ -1912,42 +1908,28 @@ <string name="preferences_autofill">Αυτόματη συμπλήρωση</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Διευθύνσεις</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Πιστωτικές κάρτες</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Μέθοδοι πληρωμής</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Αποθήκευση και αυτόματη συμπλήρωση στοιχείων καρτών</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Αποθήκευση και συμπλήρωση μεθόδων πληρωμής</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Τα δεδομένα κρυπτογραφούνται</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">Το %s κρυπτογραφεί όλες τις μεθόδους πληρωμής που αποθηκεύετε</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Συγχρονισμός καρτών μεταξύ συσκευών</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Συγχρονισμός καρτών</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Προσθήκη πιστωτικής κάρτας</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Προσθήκη κάρτας</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Διαχείριση αποθηκευμένων καρτών</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Διαχείριση καρτών</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Προσθήκη διεύθυνσης</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Διαχείριση διευθύνσεων</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Αποθήκευση και αυτόματη συμπλήρωση διευθύνσεων</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Αποθήκευση και συμπλήρωση διευθύνσεων</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Συμπεριλάβετε πληροφορίες, όπως αριθμούς, email και διευθύνσεις αποστολής</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Περιλαμβάνει αριθμούς τηλεφώνου και διευθύνσεις email</string> @@ -1971,8 +1953,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Διαγραφή κάρτας</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Θέλετε σίγουρα να διαγράψετε αυτήν την πιστωτική κάρτα;</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Διαγραφή κάρτας;</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Διαγραφή</string> @@ -1986,24 +1966,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Αποθηκευμένες κάρτες</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Παρακαλώ εισαγάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Εισαγάγετε έγκυρο αριθμό κάρτας</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Παρακαλώ συμπληρώστε αυτό το πεδίο</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Προσθήκη ονόματος</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Ξεκλειδώστε για να δείτε τις αποθηκευμένες κάρτες σας</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Ασφαλίστε τις πιστωτικές κάρτες σας</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Προστασία των αποθηκευμένων μεθόδων πληρωμής σας</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ορίστε ένα μοτίβο κλειδώματος συσκευής, ένα ΡΙΝ ή έναν κωδικό πρόσβασης για την προστασία των αποθηκευμένων πιστωτικών καρτών σας, σε περίπτωση που κάποιος τρίτος αποκτήσει πρόσβαση στη συσκευή σας.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Ορίστε ένα μοτίβο κλειδώματος της συσκευής, ένα ΡΙΝ ή έναν κωδικό πρόσβασης για την προστασία των αποθηκευμένων καρτών σας, σε περίπτωση που κάποιος τρίτος αποκτήσει πρόσβαση στη συσκευή σας.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Ρύθμιση τώρα</string> @@ -2012,8 +1983,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Ξεκλειδώστε τη συσκευή σας</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ξεκλειδώστε για χρήση των στοιχείων πιστωτικής κάρτας</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Ξεκλειδώστε για χρήση των αποθηκευμένων μεθόδων πληρωμής</string> @@ -2023,12 +1992,6 @@ <string name="addresses_edit_address">Επεξεργασία διεύθυνσης</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Διαχείριση διευθύνσεων</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Όνομα</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Μεσαίο όνομα</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Επώνυμο</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Όνομα</string> <!-- The header for the street address of an address --> @@ -2055,8 +2018,6 @@ <string name="addressess_delete_address_button">Διαγραφή διεύθυνσης</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Θέλετε σίγουρα να διαγράψετε αυτήν τη διεύθυνση;</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Διαγραφή διεύθυνσης;</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Διαγραφή</string> @@ -2157,49 +2118,29 @@ <string name="login_menu_delete_button">Διαγραφή</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Επεξεργασία</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Θέλετε σίγουρα να διαγράψετε αυτή τη σύνδεση;</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Θέλετε σίγουρα να διαγράψετε αυτόν τον κωδικό πρόσβασης;</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Διαγραφή</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Ακύρωση</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Επιλογές σύνδεσης</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Επιλογές κωδικών πρόσβασης</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Το επεξεργάσιμο πεδίο κειμένου της διεύθυνσης ιστού της σύνδεσης.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Το επεξεργάσιμο πεδίο κειμένου της διεύθυνσης ιστοτόπου.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Το επεξεργάσιμο πεδίο κειμένου για το όνομα χρήστη της σύνδεσης.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Το επεξεργάσιμο πεδίο κειμένου για το όνομα χρήστη.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Το επεξεργάσιμο πεδίο κειμένου για τον κωδικό πρόσβασης της σύνδεσης.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Το επεξεργάσιμο πεδίο κειμένου για τον κωδικό πρόσβασης.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Αποθήκευση αλλαγών στη σύνδεση.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Αποθήκευση αλλαγών.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Επεξεργασία</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Επεξεργασία κωδικού πρόσβασης</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Προσθήκη νέας σύνδεσης</string> <!-- The page title for adding new password. --> <string name="add_login_2">Προσθήκη κωδικού πρόσβασης</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Απαιτείται κωδικός πρόσβασης</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Εισαγάγετε έναν κωδικό πρόσβασης</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Απαιτείται όνομα χρήστη</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Εισαγάγετε ένα όνομα χρήστη</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Απαιτείται όνομα κεντρικού υπολογιστή</string> @@ -2548,6 +2489,8 @@ <string name="translations_bottom_sheet_negative_button">Όχι τώρα</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Εμφάνιση πρωτότυπου</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Φορτώθηκε η αρχική, αμετάφραστη σελίδα</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Τέλος</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2605,6 +2548,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Κλείσιμο σελίδας μεταφράσεων</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Ορισμένες ρυθμίσεις δεν είναι προσωρινά διαθέσιμες.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Μεταφράσεις</string> @@ -2628,6 +2574,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Επιλέξτε μια γλώσσα για να διαχειριστείτε τις προτιμήσεις «πάντα μετάφραση» και «ποτέ μετάφραση».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Δεν ήταν δυνατή η φόρτωση των γλωσσών. Ελέγξτε ξανά αργότερα.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Πρόταση για μετάφραση (προεπιλογή)</string> @@ -2651,6 +2600,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Αφαίρεση %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Δεν ήταν δυνατή η φόρτωση των ιστοτόπων. Ελέγξτε ξανά αργότερα.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Διαγραφή του %1$s;</string> @@ -2728,13 +2679,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Πλοήγηση προς τα πίσω</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Άνοιγμα μενού εντοπισμού σφαλμάτων</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Εργαλεία καρτελών</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Αριθμός καρτελών</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Ενεργές</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Ενεργές</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Ενεργές</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Ανενεργές</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2745,6 +2701,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Εργαλείο δημιουργίας καρτελών</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Πλήθος καρτελών προς δημιουργία</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Το πεδίο κειμένου είναι κενό</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Παρακαλώ εισαγάγετε μόνο θετικούς ακέραιους αριθμούς</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Παρακαλώ εισαγάγετε έναν αριθμό μεγαλύτερο του μηδέν</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Υπέρβαση του μέγιστου αριθμού καρτελών (%1$s) που μπορούν να δημιουργηθούν με μία ενέργεια</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Προσθήκη στις ενεργές καρτέλες</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2761,11 +2727,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Σημείωση απορρήτου</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Υποβολή</string> + <string name="micro_survey_submit_button_label">Υποβολή</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Κλείσιμο</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Κλείσιμο</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Ευχαριστούμε για τα σχόλιά σας!</string> + <string name="micro_survey_feedback_confirmation">Ευχαριστούμε για τα σχόλιά σας!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Πολύ ικανοποιημένος/-η</string> @@ -2778,6 +2744,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Πολύ δυσαρεστημένος/-η</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Άνοιγμα έρευνας</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Κλείσιμο έρευνας</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Κλείσιμο</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Συνδέσεις</string> diff --git a/mobile/android/fenix/app/src/main/res/values-en-rCA/strings.xml b/mobile/android/fenix/app/src/main/res/values-en-rCA/strings.xml index 5ec62ac882..dac62c0821 100644 --- a/mobile/android/fenix/app/src/main/res/values-en-rCA/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-en-rCA/strings.xml @@ -200,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Manage extensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Discover more extensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Account info</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -218,6 +222,8 @@ <string name="browser_menu_open_in_regular_tab">Open in regular tab</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Add to Home screen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Add to Home screen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Install</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -229,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Translate page</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Save to collection…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Save to collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Share</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Share…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Open in %1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Save</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bookmark this page</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Edit bookmark</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Save as PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Turn on Reader View</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Turn off Reader View</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Translate page…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Translated to %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Print…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No extensions here</string> @@ -377,8 +405,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox privacy notice</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Learn more in our privacy notice</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">We love keeping you safe</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -585,7 +611,9 @@ <!-- Preference for language --> <string name="preferences_language">Language</string> <!-- Preference for translation --> - <string name="preferences_translation">Translation</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Translation</string> + <!-- Preference for translations --> + <string name="preferences_translations">Translations</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Data choices</string> <!-- Preference for data collection --> @@ -658,10 +686,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Required</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Read and change website data</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Delete website</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Allow for all sites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -787,8 +811,6 @@ <string name="preferences_sync_history">History</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bookmarks</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passwords</string> <!-- Preference for syncing tabs --> @@ -815,8 +837,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s on %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Credit cards</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Payment methods</string> <!-- Preference for syncing addresses --> @@ -832,6 +852,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab from %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tabs closed: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">View recently closed tabs</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceptions</string> @@ -1751,12 +1779,8 @@ <string name="add_to_homescreen_description_2">You can easily add this website to your device’s Home screen to have instant access and browse faster with an app-like experience.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passwords</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Save logins and passwords</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Save passwords</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Ask to save</string> @@ -1771,46 +1795,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fill usernames and passwords in other apps on your device.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Add login</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Add password</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync logins</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sync passwords</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync logins across devices</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sync passwords across devices</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Saved logins</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Saved passwords</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">The logins you save or sync to %s will show up here.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">The passwords you save or sync to %s will be listed here. All passwords you save are encrypted.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Learn more about Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Learn more about sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceptions</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords that are not saved will be shown here.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s won’t save passwords for sites listed here.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords will not be saved for these sites.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s won’t save passwords for these sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Delete all exceptions</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Search logins</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Search passwords</string> <!-- The header for the site that a login is for --> @@ -1839,17 +1844,11 @@ <string name="saved_login_reveal_password">Show password</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Hide password</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Unlock to view your saved logins</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Unlock to view your saved passwords</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Secure your logins and passwords</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Secure your saved passwords</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Set up a device lock pattern, PIN, or password to protect your saved logins and passwords from being accessed if someone else has your device.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Set up a device lock pattern, PIN, or password to protect your saved passwords from being accessed if someone else has your device.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Later</string> @@ -1866,8 +1865,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Name (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Last used</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sort logins menu</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Sort passwords menu</string> @@ -1877,29 +1874,19 @@ <string name="preferences_autofill">Autofill</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Addresses</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Credit cards</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Payment methods</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Save and autofill cards</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Save and fill payment methods</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data is encrypted</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s encrypts all payment methods you save</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sync cards across devices</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sync cards</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Add credit card</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Add card</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Manage saved cards</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Manage cards</string> <!-- Preference option for adding an address --> @@ -1907,12 +1894,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Manage addresses</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Save and autofill addresses</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Save and fill addresses</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Include information like numbers, email and shipping addresses</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Includes phone numbers and email addresses</string> @@ -1936,8 +1919,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Delete card</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this credit card?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Delete card?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Delete</string> @@ -1951,24 +1932,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Saved cards</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Please enter a valid credit card number</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Enter a valid card number</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Please fill out this field</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Add a name</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Unlock to view your saved cards</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Secure your credit cards</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Secure your saved payment methods</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Set up a device lock pattern, PIN, or password to protect your saved credit cards from being accessed if someone else has your device.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Set up a device lock pattern, PIN, or password to protect your saved payment methods from being accessed if someone else has your device.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Set up now</string> @@ -1976,8 +1948,6 @@ <string name="credit_cards_warning_dialog_later">Later</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Unlock your device</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Unlock to use stored credit card information</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Unlock to use saved payment methods</string> @@ -1987,12 +1957,6 @@ <string name="addresses_edit_address">Edit address</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Manage addresses</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">First Name</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Middle Name</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Last Name</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Name</string> <!-- The header for the street address of an address --> @@ -2019,8 +1983,6 @@ <string name="addressess_delete_address_button">Delete address</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this address?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Delete this address?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Delete</string> @@ -2118,49 +2080,29 @@ <string name="login_menu_delete_button">Delete</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Edit</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this login?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Are you sure you want to delete this password?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Delete</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancel</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Login options</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Password options</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the web address of the login.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">The editable text field for the website address.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the username of the login.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">The editable text field for the username.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the password of the login.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">The editable text field for the password.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Save changes to login.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Save changes.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Edit</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Edit password</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Add new login</string> <!-- The page title for adding new password. --> <string name="add_login_2">Add password</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Password required</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Enter a password</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Username required</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Enter a username</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostname required</string> @@ -2566,6 +2508,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Close Translations sheet</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Some settings are temporarily unavailable.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Translations</string> @@ -2588,6 +2533,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Select a language to manage ”always translate“ and ”never translate“ preferences.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Couldn’t load languages. Please check back later.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Offer to translate (default)</string> @@ -2610,6 +2558,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Remove %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Couldn’t load sites. Please check back later.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Delete %1$s?</string> @@ -2687,13 +2637,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navigate back</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Open debug drawer</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tab Tools</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Tab count</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Active</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Active</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Active</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2704,6 +2659,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Tab creation tool</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Tab quantity to create</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Text field is empty</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Please enter positive integers only</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Please enter a number greater than zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Exceeded the maximum number of tabs (%1$s) that can be generated in one operation</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Add to active tabs</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2720,11 +2685,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Privacy Notice</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Submit</string> + <string name="micro_survey_submit_button_label">Submit</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Close</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Close</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Thanks for your feedback!</string> + <string name="micro_survey_feedback_confirmation">Thanks for your feedback!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Very Satisfied</string> <!-- Option for likert scale --> @@ -2736,6 +2701,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Very Dissatisfied</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Open survey</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Close survey</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Close</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Logins</string> diff --git a/mobile/android/fenix/app/src/main/res/values-en-rGB/strings.xml b/mobile/android/fenix/app/src/main/res/values-en-rGB/strings.xml index b04058b493..8b41ad2e50 100644 --- a/mobile/android/fenix/app/src/main/res/values-en-rGB/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-en-rGB/strings.xml @@ -198,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Manage extensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Discover more extensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Account info</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -216,6 +220,8 @@ <string name="browser_menu_open_in_regular_tab">Open in regular tab</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Add to Home screen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Add to Home screen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Install</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -227,9 +233,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Translate page</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Save to collection…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Save to collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Share</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Share…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Open in %1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Save</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bookmark this page</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Edit bookmark</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Save as PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Turn on Reader View</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Turn off Reader View</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Translate page…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Translated to %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Print…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No extensions here</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox privacy notice</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Learn more in our privacy notice</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">We love keeping you safe</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -589,7 +615,9 @@ <!-- Preference for language --> <string name="preferences_language">Language</string> <!-- Preference for translation --> - <string name="preferences_translation">Translation</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Translation</string> + <!-- Preference for translations --> + <string name="preferences_translations">Translations</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Data choices</string> <!-- Preference for data collection --> @@ -662,10 +690,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Required</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Read and change web site data</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Delete web site</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Allow for all sites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -790,8 +814,6 @@ <string name="preferences_sync_history">History</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bookmarks</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passwords</string> <!-- Preference for syncing tabs --> @@ -818,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s on %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Credit cards</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Payment methods</string> <!-- Preference for syncing addresses --> @@ -835,6 +855,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab from %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tabs closed: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">View recently closed tabs</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceptions</string> @@ -1756,12 +1784,8 @@ <string name="add_to_homescreen_description_2">You can easily add this web site to your device’s Home screen to have instant access and browse faster with an app-like experience.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passwords</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Save logins and passwords</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Save passwords</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Ask to save</string> @@ -1777,47 +1801,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fill usernames and passwords in other apps on your device.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Add login</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Add password</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronise logins</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synchronise passwords</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronise logins across devices</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synchronise passwords across devices</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Saved logins</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Saved passwords</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">The logins you save or synchronise to %s will show up here.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">The passwords you save or synchronise to %s will be listed here. All passwords you save are encrypted. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Learn more about Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Learn more about Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceptions</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords that are not saved will be shown here.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s won’t save passwords for sites listed here.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Logins and passwords will not be saved for these sites.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s won’t save passwords for these sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Delete all exceptions</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Search logins</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Search passwords</string> <!-- The header for the site that a login is for --> @@ -1846,17 +1851,11 @@ <string name="saved_login_reveal_password">Show password</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Hide password</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Unlock to view your saved logins</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Unlock to view your saved passwords</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Secure your logins and passwords</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Secure your saved passwords</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Set up a device lock pattern, PIN, or password to protect your saved logins and passwords from being accessed if someone else has your device.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Set up a device lock pattern, PIN, or password to protect your saved passwords from being accessed if someone else has your device.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Later</string> @@ -1873,8 +1872,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Name (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Last used</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sort logins menu</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Sort passwords menu</string> @@ -1884,41 +1881,27 @@ <string name="preferences_autofill">Autofill</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Addresses</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Credit cards</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Payment methods</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Save and autofill cards</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Save and fill payment methods</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data is encrypted</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s encrypts all payment methods you save</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synchronise cards across devices</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synchronise cards</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Add credit card</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Add card</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Manage saved cards</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Manage cards</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Add address</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Manage addresses</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Save and autofill addresses</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Save and fill addresses</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Include information like numbers, email and shipping addresses</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Includes phone numbers and email addresses</string> @@ -1942,8 +1925,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Delete card</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this credit card?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Delete card?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Delete</string> @@ -1957,24 +1938,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Saved cards</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Please enter a valid credit card number</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Enter a valid card number</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Please fill out this field</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Add a name</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Unlock to view your saved cards</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Secure your credit cards</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Secure your saved payment methods</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Set up a device lock pattern, PIN, or password to protect your saved credit cards from being accessed if someone else has your device.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Set up a device lock pattern, PIN, or password to protect your saved payment methods from being accessed if someone else has your device.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Set up now</string> @@ -1982,8 +1954,6 @@ <string name="credit_cards_warning_dialog_later">Later</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Unlock your device</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Unlock to use stored credit card information</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Unlock to use saved payment methods</string> @@ -1993,12 +1963,6 @@ <string name="addresses_edit_address">Edit address</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Manage addresses</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">First Name</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Middle Name</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Last Name</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Name</string> <!-- The header for the street address of an address --> @@ -2025,8 +1989,6 @@ <string name="addressess_delete_address_button">Delete address</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this address?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Delete this address?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Delete</string> @@ -2124,49 +2086,29 @@ <string name="login_menu_delete_button">Delete</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Edit</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Are you sure you want to delete this login?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Are you sure you want to delete this password?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Delete</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancel</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Login options</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Password options</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the web address of the login.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">The editable text field for the web site address.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the username of the login.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">The editable text field for the username.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">The editable text field for the password of the login.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">The editable text field for the password.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Save changes to login.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Save changes.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Edit</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Edit password</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Add new login</string> <!-- The page title for adding new password. --> <string name="add_login_2">Add password</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Password required</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Enter a password</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Username required</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Enter a username</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostname required</string> @@ -2513,6 +2455,8 @@ <string name="translations_bottom_sheet_negative_button">Not now</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Show original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Original untranslated page loaded</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Done</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2570,6 +2514,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Close Translations sheet</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Some settings are temporarily unavailable.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Translations</string> @@ -2592,6 +2539,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Select a language to manage ”always translate“ and ”never translate“ preferences.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Couldn’t load languages. Please check back later.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Offer to translate (default)</string> @@ -2614,6 +2564,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Remove %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Couldn’t load sites. Please check back later.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Delete %1$s?</string> @@ -2691,13 +2643,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navigate backwards</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Open debug drawer</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tab Tools</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Tab count</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Active</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Active</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Active</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2708,6 +2665,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Tab creation tool</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Tab quantity to create</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Text field is empty</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Please enter positive integers only</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Please enter a number greater than zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Exceeded the maximum number of tabs (%1$s) that can be generated in one operation</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Add to active tabs</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2724,11 +2691,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Privacy Notice</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Submit</string> + <string name="micro_survey_submit_button_label">Submit</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Close</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Close</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Thanks for your feedback!</string> + <string name="micro_survey_feedback_confirmation">Thanks for your feedback!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Very Satisfied</string> <!-- Option for likert scale --> @@ -2740,6 +2707,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Very Dissatisfied</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Open survey</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Close survey</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Close</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Logins</string> diff --git a/mobile/android/fenix/app/src/main/res/values-eo/strings.xml b/mobile/android/fenix/app/src/main/res/values-eo/strings.xml index 0b365e2616..962dc6a81c 100644 --- a/mobile/android/fenix/app/src/main/res/values-eo/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-eo/strings.xml @@ -48,11 +48,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Ĵuse konservitaj</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Ĵuse konservitaj</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Montri ĉiujn konservitajn legosignojn</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Montri ĉiujn konservitajn legosignojn</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Forigi</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Forigi</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Legosignoj</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Montri ĉiujn legosignojn</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Forigi</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s estas kreita de Mozilla.</string> @@ -140,8 +148,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Nova privata langeto</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Ŝparvojo por la pasvortoj</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Pasvortoj</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Ŝparvojo por la pasvortoj</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -182,11 +192,13 @@ <!-- Content description (not visible, for screen readers etc.): Stop loading current website --> <string name="browser_menu_stop">Haltigi</string> <!-- Browser menu button that opens the addon manager --> - <string name="browser_menu_add_ons">Aldonaĵoj</string> + <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Aldonaĵoj</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_extensions">Etendaĵoj</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informoj pri konto</string> <!-- Text displayed when there are no add-ons to be shown --> - <string name="no_add_ons">Neniu aldonaĵo estas ĉi tie</string> + <string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Neniu aldonaĵo estas ĉi tie</string> <!-- Browser menu button that sends a user to help articles --> <string name="browser_menu_help">Helpo</string> <!-- Browser menu button that sends a to a the what's new article --> @@ -202,12 +214,14 @@ <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Aldoni al hejmekrano</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> - <string name="browser_menu_install_on_homescreen">Instali</string> + <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instali</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Respeguli</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Serĉi en paĝo</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Serĉi en paĝo…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduki paĝon</string> <!-- Browser menu button that saves the current tab to a collection --> @@ -240,6 +254,33 @@ <!-- Button shown on the home page that opens the Customize home settings --> <string name="browser_menu_customize_home_1">Personecigi ekan paĝon</string> + <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> + <string name="browser_menu_sign_in">Komenci seancon</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Speguli pasvortojn, langetojn, kaj pli</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Rekomencu seancon por speguli</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Spegulado paŭzinta</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Nova privata langeto</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Pasvortoj</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Novaĵoj en %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Iri al versio por komputiloj</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Iloj</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Konservi</string> + + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">Ne estas etendaĵoj ĉi tie</string> + <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> <string name="browser_toolbar_home">Hejmekrano</string> @@ -543,6 +584,8 @@ <string name="preferences_account_sync_error">Rekonektiĝu por daŭrigi la speguladon</string> <!-- Preference for language --> <string name="preferences_language">Lingvo</string> + <!-- Preference for translation --> + <string name="preferences_translation">Traduko</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Elekto de datumoj</string> <!-- Preference for data collection --> @@ -594,10 +637,14 @@ <string name="quit_application">Fino de programo pro apliko de ŝanĝoj…</string> <!-- Preference for add_ons --> - <string name="preferences_addons">Aldonaĵoj</string> + <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Aldonaĵoj</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Etendaĵoj</string> <!-- Preference for installing a local add-on --> - <string name="preferences_install_local_addon">Instali aldonaĵon el dosiero</string> + <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Instali aldonaĵon el dosiero</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Instali etendaĵon el dosiero</string> <!-- Preference for notifications --> <string name="preferences_notifications">Sciigoj</string> @@ -606,9 +653,25 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Ne permesita</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Postulata</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Elektebla</string> + <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> + <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Legi kaj ŝanĝi retejajn datumojn</string> + <!-- The description of the icon that can delete one of the websites displayed --> + <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Forigi retejon</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permesi por ĉiuj retejoj</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Se vi fidas tiun ĉi etendaĵon vi povas doni al ĝi tiun permeson por ĉiuj retejoj.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> - <string name="preferences_customize_amo_collection">Personecigita kolekto de aldonaĵoj</string> + <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Personecigita kolekto de aldonaĵoj</string> + <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> + <string name="preferences_customize_extension_collection">Personecigita kolekto de etendaĵoj</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">Akcepti</string> <!-- Button caption to abort the add-on collection configuration --> @@ -618,13 +681,18 @@ <!-- Hint displayed on input field for custom collection user ID--> <string name="customize_addon_collection_user_hint">Posedanto de kolekto (identigilo de uzanto)</string> <!-- Toast shown after confirming the custom add-on collection configuration --> - <string name="toast_customize_addon_collection_done">La kolekto de aldonaĵoj estis ŝanĝita. La programo nun finiĝos por apliki la ŝanĝojn…</string> + <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">La kolekto de aldonaĵoj estis ŝanĝita. La programo nun finiĝos por apliki la ŝanĝojn…</string> + + <!-- Toast shown after confirming the custom extension collection configuration --> + <string name="toast_customize_extension_collection_done">La kolekto de etendaĵoj estis ŝanĝita. La programo nun finiĝos por apliki la ŝanĝojn…</string> <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Reiri</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Ĵusaj legosignoj</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Ĵusaj legosignoj</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Legosignoj</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Ĵusaj retpaĝoj</string> @@ -674,21 +742,37 @@ <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> - <string name="addon_ga_message_title" tools:ignore="UnusedResources">Novaj aldonaĵoj disponeblaj</string> + <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Novaj aldonaĵoj disponeblaj</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Novaj etendaĵoj disponeblaj</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Konu pli ol 100+ novajn etendaĵojn, kiuj permesas al vi personecigi Firefox.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> - <string name="addon_ga_message_button" tools:ignore="UnusedResources">Esplori aldonaĵojn</string> + <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Esplori aldonaĵojn</string> - <!-- Add-on process crash dialog to user --> + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Esplori etendaĵoj</string> + + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> - <string name="addon_process_crash_dialog_title" tools:ignore="UnusedResources">La aldonaĵoj estas provizore malaktivigitaj</string> + <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">La aldonaĵoj estas provizore malaktivigitaj</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">La etendaĵoj estas provizore malaktivigitaj</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> - <string name="addon_process_crash_dialog_message" tools:ignore="UnusedResources">Unu aŭ pli da aldonaĴoj ĉesis funkcii, kaj tio igas vian sistemon nestabila. %1$s malsukcese klopodis restartigi la aldonaĵo(j)n.\n\nAldonaĵoj ne estos restartigitaj dum via nuna seanco.\n\nForigo aŭ malaktivigo de aldonaĵo(j) povus solvi tiun ĉi problemo.</string> + <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Unu aŭ pli da aldonaĴoj ĉesis funkcii, kaj tio igas vian sistemon nestabila. %1$s malsukcese klopodis restartigi la aldonaĵo(j)n.\n\nAldonaĵoj ne estos restartigitaj dum via nuna seanco.\n\nForigo aŭ malaktivigo de aldonaĵo(j) povus solvi tiun ĉi problemo.</string> + <!-- This is a message shown to the user when too many errors have occurred with the extensions process and they have been disabled. + The user can decide if they would like to continue trying to start extensions or if they'd rather continue without them. + The first parameter is the application name. --> + <string name="extension_process_crash_dialog_message">Unu aŭ pli da etendaĵoj ĉesis funkcii, kaj tio igas vian sistemon nestabila. %1$s malsukcese klopodis restartigi la etendaĵo(j)n.\n\nEtendaĵoj ne estos restartigitaj dum via nuna seanco.\n\nForigo aŭ malaktivigo de aldonaĵo(j) povus solvi tiun ĉi problemo.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> - <string name="addon_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Provi restartigi aldonaĵojn</string> + <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Provi restartigi aldonaĵojn</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Provi restartigi etendaĵojn</string> <!-- The user will continue with all add-ons disabled --> - <string name="addon_process_crash_dialog_disable_addons_button_text" tools:ignore="UnusedResources">Daŭrigi kun aldonaĵoj malaktivigitaj</string> + <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Daŭrigi kun aldonaĵoj malaktivigitaj</string> + + <!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. --> + <string name="extension_process_crash_dialog_disable_extensions_button_text">Daŭrigi kun etendaĵoj malaktivigitaj</string> <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> @@ -2441,10 +2525,14 @@ <string name="translations_bottom_sheet_translate_from">Traduki el</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Traduki en</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Provi alian originan lingvon</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Ne nun</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Montri originalon</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Originala netradukita paĝo ŝargita</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Farita</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2464,7 +2552,7 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">Bedaŭrinde ni ankoraŭ ne subtenas %1$s.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Pli da informo</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Pli da informo</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> @@ -2478,7 +2566,9 @@ <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Tradukaj elektebloj</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Tradukaj elektebloj</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Tradukaj elektebloj</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Ĉiam proponi tradukon</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2496,6 +2586,9 @@ <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">Pri tradukoj en %1$s</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Fermi panelon de tradukoj</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Tradukoj</string> @@ -2603,6 +2696,8 @@ <string name="download_language_file_dialog_title">Ĉu elŝuti dum datumŝpara reĝimo (%1$s)?</string> <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation. --> <string name="download_language_file_dialog_message_all_languages">Ni elŝutas partojn de lingvoj al via staplo por gardi viajn tradukojn privataj.</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation without mentioning the cache. --> + <string name="download_language_file_dialog_message_all_languages_no_cache">Ni elŝutas partojn de lingvoj por gardi viajn tradukojn privataj.</string> <!-- Checkbox label text on the data saving mode warning dialog used by the translations feature. This checkbox allows users to ignore the data usage warnings. --> <string name="download_language_file_dialog_checkbox_text">Ĉiam elŝuti en datumŝpara regïmo</string> <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file. --> @@ -2617,6 +2712,8 @@ <string name="debug_drawer_title">Erarserĉilaj iloj</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Iri reen</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Langetaj iloj</string> <!-- The title of the tab count section in Tab Tools. --> @@ -2639,4 +2736,39 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Aldoni al malaktivaj langetoj</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Aldoni al privataj langetoj</string> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Daŭrigi</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Respondi tiun ĉi demandaron</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Rimarko pri privateco</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Sendi</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label">Fermi</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Dankon pro via opinio!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Tre kontentiga</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Kontentiga</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neŭtra</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Nekontentiga</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Tute nekontentiga</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Legitimiloj</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Nuna nomregno: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Aldoni neveran konton al tiu ĉi nomregno</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Forigi legitimilon kun la nomo de uzanto %s</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-es-rAR/strings.xml b/mobile/android/fenix/app/src/main/res/values-es-rAR/strings.xml index 785d99207d..ad85fcab17 100644 --- a/mobile/android/fenix/app/src/main/res/values-es-rAR/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-es-rAR/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Complementos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Administrar extensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubrir más extensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Información de la cuenta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir en una pestaña normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Agregar a pantalla de inicio</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Agregar a la pantalla de inicio…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,9 +236,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Guardar en la colección…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Guardar en la colección</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir en %1$s</string> @@ -287,6 +297,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Guardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Marcar esta página</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Guardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activar vista de lectura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desactivar vista de lectura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducido al %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No hay extensiones aquí</string> @@ -387,8 +415,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de privacidad de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Conocé más en nuestra nota de privacidad</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos encanta mantenerte seguro</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Traducción</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traducción</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traducciones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Elección de datos</string> <!-- Preference for data collection --> @@ -670,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Necesarios</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leer y cambiar los datos de sitios web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar sitio web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos los sitios</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -798,8 +822,6 @@ <string name="preferences_sync_history">Historial</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contraseñas</string> <!-- Preference for syncing tabs --> @@ -828,8 +850,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s en %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pago</string> <!-- Preference for syncing addresses --> @@ -845,6 +865,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Pestaña de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Pestañas cerradas en %1$s: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver pestañas cerradas recientemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepciones</string> @@ -1787,12 +1815,8 @@ <string name="add_to_homescreen_description_2">Podés agregar este sitio a la pantalla de inicio del dispositivo fácilmente para tener acceso instantáneo y navegar más rápido con una experiencia similar a la de una aplicación.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión y contraseñas</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contraseñas</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar inicios de sesión y contraseñas</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Guardar contraseñas</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Solicitar guardar</string> @@ -1807,46 +1831,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Completar nombres de usuario y contraseñas en otras aplicaciones de tu dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Agregar inicio de sesión</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Agregar contraseña</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar inicios de sesión</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar contraseñas</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar inicios de sesión entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar contraseñas entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión guardados</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contraseñas guardadas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Aquí se van a ver los inicios de sesión que guardes o sincronices con %s.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Las contraseñas que guardés o sincronicés con %s aparecerán acá. Todas las contraseñas que guardés están encriptadas.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Conocé más acerca de Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Conocé más acerca de la sincronización</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepciones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión y las contraseñas que no se guardan se mostrarán aquí.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s no guardará las contraseñas de los sitios listados acá.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión y las contraseñas no se van a guardar para estos sitios.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s no guardará las contraseñas de estos sitios.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas las excepciones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Buscar inicios de sesión</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Buscar contraseñas</string> <!-- The header for the site that a login is for --> @@ -1875,17 +1880,11 @@ <string name="saved_login_reveal_password">Mostrar contraseña</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar contraseña</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloqueá para ver tus inicios de sesión guardados</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloqueá para ver las contraseñas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurá inicios de sesión y contraseñas</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Asegurá tus contraseñas guardadas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configurá un patrón de bloqueo del dispositivo, un PIN o una contraseña para proteger el acceso a tus inicios de sesión y contraseñas guardadas por si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configurá un patrón de bloqueo del dispositivo, PIN o contraseña para proteger el acceso a tus contraseñas guardadas si alguien más tiene tu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Más tarde</string> @@ -1902,8 +1901,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nombre (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Usado por última vez</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordenar menú de inicio de sesión</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú ordenar contraseñas</string> @@ -1913,41 +1910,27 @@ <string name="preferences_autofill">Autocompletar</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Direcciones</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pago</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar tarjetas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Guardar y completar métodos de pago</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Los datos están cifrados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s cifra todos los métodos de pago guardados</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar tarjetas entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar tarjetas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Agregar tarjeta de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Agregar tarjeta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Administrar tarjetas guardadas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Administrar tarjetas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Agregar dirección</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Administrar direcciones</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar direcciones</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Guardar y completar direcciones</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluir información como números, correos electrónicos y direcciones de envíos</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluye números de teléfono y direcciones de correo electrónico</string> @@ -1971,8 +1954,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Borrar tarjeta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Estás seguro de querer borrar esta tarjeta de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">¿Borrar tarjeta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Borrar</string> @@ -1986,25 +1967,16 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tarjetas guardadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ingresá un número de tarjeta de crédito válido</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Ingresá un número de tarjeta válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Se debe completar este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Agregar un nombre</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloqueá para ver las tarjetas guardadas</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurá tus tarjetas de crédito</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Asegurá tus métodos de pago guardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configurá un patrón de bloqueo del dispositivo, PIN o contraseña para proteger el acceso a tus tarjetas de crédito guardadas si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configurá un patrón de bloqueo del dispositivo, un PIN o una contraseña para proteger el acceso a tus métodos de pago guardados por si otra persona accede a tu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar ahora</string> @@ -2013,9 +1985,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloqueá tu dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para usar la información almacenada de la tarjeta de crédito</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquear para usar los métodos de pago guardados</string> <!-- Title of the "Add address" screen --> @@ -2024,12 +1993,6 @@ <string name="addresses_edit_address">Editar dirección</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Administrar direcciones</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Primer Nombre</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segundo nombre</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Apellido</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nombre</string> <!-- The header for the street address of an address --> @@ -2056,8 +2019,6 @@ <string name="addressess_delete_address_button">Borrar dirección</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Estás seguro de querer borrar esta dirección?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">¿Borrar esta dirección?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Borrar</string> @@ -2157,49 +2118,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Estás seguro de que querés eliminar este inicio de sesión?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">¿Estás seguro de que querés eliminar esta contraseña?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opciones de inicio de sesión</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opciones de contraseña</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la dirección web del inicio de sesión.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">El campo de texto editable para la dirección del sitio web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para el nombre de usuario del inicio de sesión.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">El campo de texto editable para el nombre de usuario.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la contraseña del inicio de sesión.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">El campo de texto editable para la contraseña.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar cambios para el inicio de sesión.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Guardar cambios.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar contraseña</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Agregar nuevo inicio de sesión</string> <!-- The page title for adding new password. --> <string name="add_login_2">Agregar contraseña</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se necesita contraseña</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Ingresar una contraseña</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se requiere nombre de usuario</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Ingresar un nombre de usuario</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Se requiere nombre de host</string> @@ -2608,6 +2549,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Cerrar la hoja de traducciones</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algunas configuraciones no están disponibles temporariamente.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traducciones</string> @@ -2630,6 +2574,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Seleccioná un idioma para administrar las preferencias de ”traducir siempre“ y ”nunca traducir“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">No se pudieron cargar los idiomas. Intentalo de nuevo más tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ofrecer traducción (predeterminado)</string> @@ -2653,6 +2600,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Eliminar %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">No se pudieron cargar los sitios. Intentalo de nuevo más tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">¿Eliminar %1$s?</string> @@ -2730,13 +2679,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navegar hacia atrás</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir cajón de depuración</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Herramientas de pestañas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Cantidad de pestañas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Activa</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Activa</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Activo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactiva</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2747,6 +2701,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Herramienta de creación de pestañas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Cantidad de pestañas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">El campo de texto está vacío</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Ingresar solamente enteros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Ingresar un número mayor que cero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Se superó el número máximo de pestañas (%1$s) que se pueden generar en una operación</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Agregar a pestañas activas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2763,11 +2727,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Nota de privacidad</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Cerrar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Cerrar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">¡Gracias por tus comentarios!</string> + <string name="micro_survey_feedback_confirmation">¡Gracias por tus comentarios!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muy satisfecho</string> <!-- Option for likert scale --> @@ -2779,6 +2743,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muy insatisfecho</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir encuesta</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Cerrar encuesta</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Cerrar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Inicios de sesión</string> diff --git a/mobile/android/fenix/app/src/main/res/values-es-rCL/strings.xml b/mobile/android/fenix/app/src/main/res/values-es-rCL/strings.xml index 099a7d1850..32f5170529 100644 --- a/mobile/android/fenix/app/src/main/res/values-es-rCL/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-es-rCL/strings.xml @@ -47,12 +47,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Guardados recientemente</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Guardados recientemente</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Mostrar todos los marcadores guardados</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Mostrar todos los marcadores guardados</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Eliminar</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Eliminar</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Marcadores</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Mostrar todos los marcadores</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Eliminar</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s es producido por Mozilla.</string> @@ -191,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Complementos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gestionar extensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubrir más extensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Información de la cuenta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -209,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir en pestaña normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Añadir a pantalla de inicio</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Añadir a la pantalla de inicio…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -220,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Guardar en la colección…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Guardar en la colección</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir en %1$s</string> @@ -275,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Guardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Guardar esta página en marcadores</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Guardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activar la vista de lector</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desactivar la vista de lector</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducido al %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No hay extensiones aquí</string> @@ -371,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de privacidad de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Aprende más en nuestra política de privacidad</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos encanta mantenerte a salvo</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -581,7 +615,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Traducción</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traducción</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traducciones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Elección de datos</string> <!-- Preference for data collection --> @@ -654,10 +690,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Requerido</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leer y cambiar datos del sitio web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar sitio web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos los sitios</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -686,7 +718,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Regresar a</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Marcadores recientes</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Marcadores recientes</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Marcadores</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Visitados recientemente</string> @@ -781,8 +815,6 @@ <string name="preferences_sync_history">Historial</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciales</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contraseñas</string> <!-- Preference for syncing tabs --> @@ -809,8 +841,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s en %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pago</string> <!-- Preference for syncing addresses --> @@ -826,6 +856,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Pestaña de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s pestañas cerradas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver pestañas cerradas recientemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepciones</string> @@ -1750,12 +1788,8 @@ <string name="add_to_homescreen_description_2">Puedes añadir fácilmente este sitio web a tu pantalla de inicio de tu dispositivo para tener acceso instantáneo y navegar rápidamente, consiguiendo una experiencia similar a la de una aplicación real.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciales y contraseñas</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contraseñas</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar credenciales y contraseñas</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Guardar contraseñas</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Preguntar si guardar</string> @@ -1770,47 +1804,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Completa los nombres de usuario y contraseñas en otras aplicaciones de tu dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir conexión</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Añadir contraseña</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar credenciales</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar contraseñas</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar credenciales en todos los dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar contraseñas entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciales guardadas</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contraseñas guardadas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Las credenciales que guardas o sincronizas con %s serán mostradas aquí.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Las contraseñas que guardes o sincronices con %s aparecerán aquí. Todas las contraseñas que guardes quedan cifradas.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Aprender más acerca de Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Aprende más acerca de la sincronización</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepciones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Las credenciales y contraseñas que no son guardadas serán mostradas aquí.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s no guardará las contraseñas de los sitios listados aquí.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Las credenciales y contraseñas no serán guardadas para estos sitios.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s no guardará las contraseñas para estos sitios.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas las excepciones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Buscar credenciales</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Buscar contraseñas</string> <!-- The header for the site that a login is for --> @@ -1839,17 +1854,11 @@ <string name="saved_login_reveal_password">Mostrar contraseña</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar contraseña</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquea para ver tus credenciales guardadas</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloquea para ver tus contraseñas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegura tus credenciales y contraseñas</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Asegura tus contraseñas guardadas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus credenciales y contraseñas guardadas, y así no sean accedidas si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configura un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus contraseñas guardadas, y así no sean accedidas si alguien más tiene tu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Más tarde</string> @@ -1867,8 +1876,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nombre (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Último uso</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menú para ordenar credenciales</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú ordenar contraseñas</string> @@ -1878,41 +1885,27 @@ <string name="preferences_autofill">Autollenado</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Direcciones</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pago</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar tarjetas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Guardar y completar métodos de pago</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Los datos están encriptados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s cifra todos los métodos de pago que guardas</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar tarjetas entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar tarjetas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir tarjeta de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Añadir tarjeta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gestionar tarjetas guardadas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gestionar tarjetas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Añadir dirección</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Administrar direcciones</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar direcciones</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Guardar y completar direcciones</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluye información como números, correos electrónicos y direcciones</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluye números de teléfono y direcciones de correo electrónico</string> @@ -1936,8 +1929,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eliminar tarjeta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿De verdad quieres eliminar esta tarjeta de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">¿Eliminar tarjeta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Eliminar</string> @@ -1951,24 +1942,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tarjetas guardadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, ingresa un número de tarjeta de crédito válido</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Ingresa un número de tarjeta válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Complete este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Añadir un nombre</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloquea para ver tus tarjetas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegura tus tarjetas de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Asegura tus métodos de pago guardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus tarjetas de crédito guardadas, y así no sean accedidas si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configura un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus métodos de pago guardados, y así no sean accedidos si alguien más tiene tu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar ahora</string> @@ -1976,8 +1958,6 @@ <string name="credit_cards_warning_dialog_later">Más tarde</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquea tu dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquea para usar información de la tarjeta de crédito almacenada</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquea para usar métodos de pago guardados</string> @@ -1987,12 +1967,6 @@ <string name="addresses_edit_address">Editar dirección</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Administrar direcciones</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Primer nombre</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segundo nombre</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Apellidos</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nombre</string> <!-- The header for the street address of an address --> @@ -2019,8 +1993,6 @@ <string name="addressess_delete_address_button">Eliminar dirección</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">¿De verdad quieres eliminar esta dirección?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">¿Eliminar esta dirección?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Eliminar</string> @@ -2118,49 +2090,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿De verdad quieres eliminar esta conexión?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">¿Estas seguro de eliminar esta contraseña?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opciones de credenciales</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opciones de contraseña</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la dirección web de la credencial.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">El campo de texto editable para la dirección del sitio web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para el nombre de usuario de la credencial.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">El campo de texto editable para el nombre de usuario.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la contraseña de la credencial.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">El campo de texto editable para la contraseña.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar cambios a la credencial.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Guardar cambios.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar contraseña</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir nueva credencial</string> <!-- The page title for adding new password. --> <string name="add_login_2">Añadir contraseña</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Contraseña requerida</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Ingresar una contraseña</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Nombre de usuario requerido</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Ingresar un nombre de usuario</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Nombre de servidor requerido</string> @@ -2508,6 +2460,8 @@ <string name="translations_bottom_sheet_negative_button">Ahora no</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Mostrar original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Página original sin traducir cargada</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Hecho</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2565,6 +2519,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Cerrar hoja de traducciones</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algunos ajustes no están disponibles temporalmente.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traducciones</string> @@ -2587,6 +2544,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”nunca traducir“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">No se pudieron cargar idiomas. Por favor, vuelve más tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ofrecer traducción (predeterminado)</string> @@ -2609,6 +2569,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Eliminar %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">No se pudieron cargar sitios. Por favor, vuelve más tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">¿Eliminar %1$s?</string> @@ -2686,13 +2648,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navegar hacia atrás</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir cajón de depuración</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Herramientas de pestaña</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Recuento de pestañas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Activa</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Activa</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Activo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactiva</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2703,6 +2670,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Herramienta de creación de pestañas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Cantidad de pestañas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">El campo de texto está vacío</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Por favor, ingresa solo números enteros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Por favor, introduce un número mayor que cero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Se superó el número máximo de pestañas (%1$s) que se pueden generar en una operación</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Añadir a pestañas activas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2719,11 +2696,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Política de privacidad</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Cerrar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Cerrar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">¡Gracias por tus comentarios!</string> + <string name="micro_survey_feedback_confirmation">¡Gracias por tus comentarios!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muy satisfecho</string> <!-- Option for likert scale --> @@ -2735,6 +2712,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muy insatisfecho</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir encuesta</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Cerrar encuesta</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Cerrar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Conexiones</string> diff --git a/mobile/android/fenix/app/src/main/res/values-es-rES/strings.xml b/mobile/android/fenix/app/src/main/res/values-es-rES/strings.xml index 5896187516..42ee948d2a 100644 --- a/mobile/android/fenix/app/src/main/res/values-es-rES/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-es-rES/strings.xml @@ -51,12 +51,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Guardado recientemente</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Guardado recientemente</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Mostrar todos los marcadores guardados</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Mostrar todos los marcadores guardados</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Eliminar</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Eliminar</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Marcadores</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Mostrar todos los marcadores</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Eliminar</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s es producido por Mozilla.</string> @@ -194,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Complementos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gestionar extensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubrir más extensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Información de la cuenta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -212,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir en una pestaña normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Agregar a la pantalla de Inicio</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Añadir a la pantalla de inicio…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -223,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Guardar en colección…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Guardar en la colección</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir en %1$s</string> @@ -280,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Guardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Añadir esta página a marcadores</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Guardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activar vista de lectura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desactivar vista de lectura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducido al %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No hay extensiones aquí</string> @@ -377,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de privacidad de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Saber más en nuestro aviso de privacidad</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos encanta mantenerte a salvo</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -588,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Traducción</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traducción</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traducciones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Elección de datos</string> <!-- Preference for data collection --> @@ -662,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Requerido</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leer y cambiar los datos de sitios web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar sitio web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos los sitios</string> @@ -695,7 +727,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Volver a esta pestaña</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Marcadores recientes</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Marcadores recientes</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Marcadores</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Visitados recientemente</string> @@ -789,8 +823,6 @@ <string name="preferences_sync_history">Historial</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contraseñas</string> <!-- Preference for syncing tabs --> @@ -817,8 +849,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s en %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pago</string> <!-- Preference for syncing addresses --> @@ -836,6 +866,14 @@ <string name="fxa_tab_received_from_notification_name">Pestaña de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s pestañas cerradas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver pestañas cerradas recientemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepciones</string> @@ -1787,12 +1825,8 @@ <string name="add_to_homescreen_description_2">Puedes añadir fácilmente este sitio web a la pantalla de inicio de tu dispositivo para tener acceso instantáneo y navegar rápidamente, consiguiendo una experiencia similar a la de una aplicación real.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión y contraseñas</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contraseñas</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar inicios de sesión y contraseñas</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Guardar contraseñas</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Preguntar antes de guardar</string> @@ -1809,46 +1843,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Completar nombres de usuarios y contraseñas en otras aplicaciones de tu dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir cuenta</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Añadir contraseña</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión sincronizados</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar contraseñas</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar inicios de sesión entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar contraseñas entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión guardados</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contraseñas guardadas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión que guardes o sincronices con %s se mostrarán aquí.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Las contraseñas que guardes o sincronices con %s aparecerán aquí. Todas las contraseñas que guardes quedan cifradas.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Saber más sobre Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Descubre más sobre Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepciones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión y contraseñas no guardados aparecerán aquí.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s no guardará contraseñas para los sitios que se listen aquí.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">No se guardarán los inicios de sesión y contraseñas para estos sitios.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s no guardará las contraseñas para estos sitios.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas las excepciones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Buscar inicios de sesión</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Buscar contraseñas</string> <!-- The header for the site that a login is for --> @@ -1877,17 +1892,11 @@ <string name="saved_login_reveal_password">Mostrar contraseña</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar contraseña</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para ver tus inicios de sesión guardados</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloquea para ver tus contraseñas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurar tus usuarios y contraseñas</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Asegura tus contraseñas guardadas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo del dispositivo, un PIN o una contraseña para proteger el acceso a tus usuarios y contraseñas guardados si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Establece un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus contraseñas guardadas y evitar que sean accedidas por otras personas en caso de que alguien más tenga tu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Más tarde</string> @@ -1906,9 +1915,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Usado por última vez</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordenar menú de inicio de sesión</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú ordenar contraseñas</string> @@ -1917,16 +1923,10 @@ <string name="preferences_autofill">Autocompletado</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Direcciones</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pago</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar tarjetas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Guardar y completar métodos de pago</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Los datos están cifrados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s cifra todos los métodos de pago que guardes</string> @@ -1934,25 +1934,17 @@ <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar tarjetas entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar tarjetas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir tarjeta de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Añadir tarjeta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Administrar tarjetas guardadas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Administrar tarjetas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Añadir dirección</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Administrar direcciones</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar direcciones</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Guardar y completar direcciones</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluir información como números, correos electrónicos y direcciones de envío</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluye números de teléfono y direcciones de correo electrónico</string> @@ -1976,8 +1968,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eliminar tarjeta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar esta tarjeta de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">¿Eliminar tarjeta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Eliminar</string> @@ -1991,24 +1981,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tarjetas guardadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, escriba un número válido de tarjeta de crédito</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Introduce un número de tarjeta válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, rellena este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Añadir un nombre</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloquear para ver tus tarjetas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurar tus tarjetas de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Protege tus métodos de pago guardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo, PIN o contraseña para proteger el acceso a tus tarjetas guardadas si alguien más accede a tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Establece un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus métodos de pago guardados y evitar que sean accedidos por otras personas en caso de que alguien más tenga tu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar ahora</string> @@ -2016,8 +1997,6 @@ <string name="credit_cards_warning_dialog_later">Más tarde</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquear tu dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para usar la información de la tarjeta de crédito almacenada</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquea para utilizar métodos de pago guardados</string> @@ -2027,12 +2006,6 @@ <string name="addresses_edit_address">Editar dirección</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Administrar direcciones</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Nombre</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segundo nombre</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Apellidos</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nombre</string> <!-- The header for the street address of an address --> @@ -2059,8 +2032,6 @@ <string name="addressess_delete_address_button">Eliminar dirección</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar esta dirección?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">¿Eliminar esta dirección?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Eliminar</string> @@ -2159,49 +2130,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar este inicio de sesión?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">¿Estás seguro de que quieres eliminar esta contraseña?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opciones de inicio de sesión</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opciones de contraseña</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la dirección web del inicio de sesión.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">El campo de texto editable para la dirección del sitio web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para el nombre de usuario del inicio de sesión.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">El campo de texto editable para el nombre de usuario.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la contraseña del inicio de sesión.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">El campo de texto editable para la contraseña.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar cambios para el inicio de sesión.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Guardar cambios.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar contraseña</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir nueva cuenta</string> <!-- The page title for adding new password. --> <string name="add_login_2">Añadir contraseña</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se necesita contraseña</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Introduce una contraseña</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se requiere nombre de usuario</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Introduce un nombre de usuario</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Se requiere nombre de servidor</string> @@ -2549,6 +2500,8 @@ <string name="translations_bottom_sheet_negative_button">Ahora no</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Mostrar original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Se ha cargado la página original sin traducir</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Hecho</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2606,6 +2559,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Cerrar hoja de traducciones</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algunos ajustes no están disponibles temporalmente.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traducciones</string> @@ -2628,6 +2584,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”no traducir nunca“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">No se han podido cargar los idiomas. Inténtalo de nuevo más tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ofrecer traducción (predeterminado)</string> @@ -2651,6 +2610,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Eliminar %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">No se han podido cargar los sitios. Inténtalo de nuevo más tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">¿Eliminar %1$s?</string> @@ -2728,13 +2689,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Ir a la página anterior</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir panel de depuración</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Herramientas de pestañas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Número de pestañas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Activa</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Activa</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Activo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactiva</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2745,6 +2711,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Herramienta de creación de pestañas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Cantidad de pestañas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">El campo de texto está vacío</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Introduce solo números enteros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Introduce un número mayor que cero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Se ha superado el número máximo de pestañas (%1$s) que se pueden generar en una operación</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Añadir a pestañas activas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2761,11 +2737,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Aviso de privacidad</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Cerrar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Cerrar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">¡Gracias por tu opinión!</string> + <string name="micro_survey_feedback_confirmation">¡Gracias por tu opinión!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muy satisfecho</string> <!-- Option for likert scale --> @@ -2777,6 +2753,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muy insatisfecho</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir la encuesta</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Cerrar la encuesta</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Cerrar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Inicios de sesión</string> diff --git a/mobile/android/fenix/app/src/main/res/values-es/strings.xml b/mobile/android/fenix/app/src/main/res/values-es/strings.xml index 5896187516..42ee948d2a 100644 --- a/mobile/android/fenix/app/src/main/res/values-es/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-es/strings.xml @@ -51,12 +51,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Guardado recientemente</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Guardado recientemente</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Mostrar todos los marcadores guardados</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Mostrar todos los marcadores guardados</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Eliminar</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Eliminar</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Marcadores</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Mostrar todos los marcadores</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Eliminar</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s es producido por Mozilla.</string> @@ -194,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Complementos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gestionar extensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubrir más extensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Información de la cuenta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -212,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir en una pestaña normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Agregar a la pantalla de Inicio</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Añadir a la pantalla de inicio…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -223,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Guardar en colección…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Guardar en la colección</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir en %1$s</string> @@ -280,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Guardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Añadir esta página a marcadores</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Guardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activar vista de lectura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desactivar vista de lectura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducido al %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">No hay extensiones aquí</string> @@ -377,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de privacidad de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Saber más en nuestro aviso de privacidad</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos encanta mantenerte a salvo</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -588,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Traducción</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traducción</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traducciones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Elección de datos</string> <!-- Preference for data collection --> @@ -662,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Requerido</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leer y cambiar los datos de sitios web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar sitio web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos los sitios</string> @@ -695,7 +727,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Volver a esta pestaña</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Marcadores recientes</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Marcadores recientes</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Marcadores</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Visitados recientemente</string> @@ -789,8 +823,6 @@ <string name="preferences_sync_history">Historial</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contraseñas</string> <!-- Preference for syncing tabs --> @@ -817,8 +849,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s en %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pago</string> <!-- Preference for syncing addresses --> @@ -836,6 +866,14 @@ <string name="fxa_tab_received_from_notification_name">Pestaña de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s pestañas cerradas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver pestañas cerradas recientemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepciones</string> @@ -1787,12 +1825,8 @@ <string name="add_to_homescreen_description_2">Puedes añadir fácilmente este sitio web a la pantalla de inicio de tu dispositivo para tener acceso instantáneo y navegar rápidamente, consiguiendo una experiencia similar a la de una aplicación real.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión y contraseñas</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contraseñas</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar inicios de sesión y contraseñas</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Guardar contraseñas</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Preguntar antes de guardar</string> @@ -1809,46 +1843,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Completar nombres de usuarios y contraseñas en otras aplicaciones de tu dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir cuenta</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Añadir contraseña</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión sincronizados</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar contraseñas</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar inicios de sesión entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar contraseñas entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inicios de sesión guardados</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contraseñas guardadas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión que guardes o sincronices con %s se mostrarán aquí.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Las contraseñas que guardes o sincronices con %s aparecerán aquí. Todas las contraseñas que guardes quedan cifradas.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Saber más sobre Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Descubre más sobre Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepciones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Los inicios de sesión y contraseñas no guardados aparecerán aquí.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s no guardará contraseñas para los sitios que se listen aquí.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">No se guardarán los inicios de sesión y contraseñas para estos sitios.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s no guardará las contraseñas para estos sitios.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas las excepciones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Buscar inicios de sesión</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Buscar contraseñas</string> <!-- The header for the site that a login is for --> @@ -1877,17 +1892,11 @@ <string name="saved_login_reveal_password">Mostrar contraseña</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar contraseña</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para ver tus inicios de sesión guardados</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloquea para ver tus contraseñas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurar tus usuarios y contraseñas</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Asegura tus contraseñas guardadas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo del dispositivo, un PIN o una contraseña para proteger el acceso a tus usuarios y contraseñas guardados si alguien más tiene tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Establece un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus contraseñas guardadas y evitar que sean accedidas por otras personas en caso de que alguien más tenga tu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Más tarde</string> @@ -1906,9 +1915,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Usado por última vez</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordenar menú de inicio de sesión</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú ordenar contraseñas</string> @@ -1917,16 +1923,10 @@ <string name="preferences_autofill">Autocompletado</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Direcciones</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarjetas de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pago</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar tarjetas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Guardar y completar métodos de pago</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Los datos están cifrados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s cifra todos los métodos de pago que guardes</string> @@ -1934,25 +1934,17 @@ <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar tarjetas entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar tarjetas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir tarjeta de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Añadir tarjeta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Administrar tarjetas guardadas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Administrar tarjetas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Añadir dirección</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Administrar direcciones</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar y autocompletar direcciones</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Guardar y completar direcciones</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluir información como números, correos electrónicos y direcciones de envío</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluye números de teléfono y direcciones de correo electrónico</string> @@ -1976,8 +1968,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eliminar tarjeta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar esta tarjeta de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">¿Eliminar tarjeta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Eliminar</string> @@ -1991,24 +1981,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tarjetas guardadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, escriba un número válido de tarjeta de crédito</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Introduce un número de tarjeta válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, rellena este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Añadir un nombre</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloquear para ver tus tarjetas guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegurar tus tarjetas de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Protege tus métodos de pago guardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configura un patrón de bloqueo, PIN o contraseña para proteger el acceso a tus tarjetas guardadas si alguien más accede a tu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Establece un patrón de bloqueo de dispositivo, PIN o contraseña para proteger tus métodos de pago guardados y evitar que sean accedidos por otras personas en caso de que alguien más tenga tu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar ahora</string> @@ -2016,8 +1997,6 @@ <string name="credit_cards_warning_dialog_later">Más tarde</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquear tu dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para usar la información de la tarjeta de crédito almacenada</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquea para utilizar métodos de pago guardados</string> @@ -2027,12 +2006,6 @@ <string name="addresses_edit_address">Editar dirección</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Administrar direcciones</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Nombre</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segundo nombre</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Apellidos</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nombre</string> <!-- The header for the street address of an address --> @@ -2059,8 +2032,6 @@ <string name="addressess_delete_address_button">Eliminar dirección</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar esta dirección?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">¿Eliminar esta dirección?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Eliminar</string> @@ -2159,49 +2130,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Seguro que quieres eliminar este inicio de sesión?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">¿Estás seguro de que quieres eliminar esta contraseña?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opciones de inicio de sesión</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opciones de contraseña</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la dirección web del inicio de sesión.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">El campo de texto editable para la dirección del sitio web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para el nombre de usuario del inicio de sesión.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">El campo de texto editable para el nombre de usuario.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">El campo de texto editable para la contraseña del inicio de sesión.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">El campo de texto editable para la contraseña.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar cambios para el inicio de sesión.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Guardar cambios.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar contraseña</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Añadir nueva cuenta</string> <!-- The page title for adding new password. --> <string name="add_login_2">Añadir contraseña</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se necesita contraseña</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Introduce una contraseña</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Se requiere nombre de usuario</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Introduce un nombre de usuario</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Se requiere nombre de servidor</string> @@ -2549,6 +2500,8 @@ <string name="translations_bottom_sheet_negative_button">Ahora no</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Mostrar original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Se ha cargado la página original sin traducir</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Hecho</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2606,6 +2559,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Cerrar hoja de traducciones</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algunos ajustes no están disponibles temporalmente.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traducciones</string> @@ -2628,6 +2584,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecciona un idioma para administrar las preferencias de ”traducir siempre“ y ”no traducir nunca“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">No se han podido cargar los idiomas. Inténtalo de nuevo más tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ofrecer traducción (predeterminado)</string> @@ -2651,6 +2610,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Eliminar %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">No se han podido cargar los sitios. Inténtalo de nuevo más tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">¿Eliminar %1$s?</string> @@ -2728,13 +2689,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Ir a la página anterior</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir panel de depuración</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Herramientas de pestañas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Número de pestañas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Activa</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Activa</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Activo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactiva</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2745,6 +2711,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Herramienta de creación de pestañas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Cantidad de pestañas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">El campo de texto está vacío</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Introduce solo números enteros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Introduce un número mayor que cero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Se ha superado el número máximo de pestañas (%1$s) que se pueden generar en una operación</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Añadir a pestañas activas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2761,11 +2737,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Aviso de privacidad</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Cerrar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Cerrar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">¡Gracias por tu opinión!</string> + <string name="micro_survey_feedback_confirmation">¡Gracias por tu opinión!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muy satisfecho</string> <!-- Option for likert scale --> @@ -2777,6 +2753,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muy insatisfecho</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir la encuesta</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Cerrar la encuesta</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Cerrar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Inicios de sesión</string> diff --git a/mobile/android/fenix/app/src/main/res/values-eu/strings.xml b/mobile/android/fenix/app/src/main/res/values-eu/strings.xml index cd905135c3..80955bc9b8 100644 --- a/mobile/android/fenix/app/src/main/res/values-eu/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-eu/strings.xml @@ -49,12 +49,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Gordetako azkenak</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Gordetako azkenak</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Erakutsi gordetako laster-marka guztiak</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Erakutsi gordetako laster-marka guztiak</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Kendu</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Kendu</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Laster-markak</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Erakutsi laster-marka guztiak</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Kendu</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s Mozillak egina da.</string> @@ -144,8 +152,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Fitxa pribatu berria</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Pasahitzen lasterbidea</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Pasahitzak</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Pasahitzen lasterbidea</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -186,11 +196,17 @@ <!-- Content description (not visible, for screen readers etc.): Stop loading current website --> <string name="browser_menu_stop">Gelditu</string> <!-- Browser menu button that opens the addon manager --> - <string name="browser_menu_add_ons">Gehigarriak</string> + <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_extensions">Hedapenak</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Kudeatu hedapenak</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Deskubritu hedapen gehiago</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontuaren informazioa</string> <!-- Text displayed when there are no add-ons to be shown --> - <string name="no_add_ons">Gehigarririk ez hemen</string> + <string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarririk ez hemen</string> <!-- Browser menu button that sends a user to help articles --> <string name="browser_menu_help">Laguntza</string> <!-- Browser menu button that sends a to a the what's new article --> @@ -205,19 +221,27 @@ <string name="browser_menu_open_in_regular_tab">Ireki fitxa arruntean</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Gehitu hasierako pantailan</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Gehitu hasierako pantailan…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> - <string name="browser_menu_install_on_homescreen">Instalatu</string> + <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalatu</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Sinkronizatu berriro</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Bilatu orrian</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Bilatu orrian…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Itzuli orria</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Gorde bilduman…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Gorde bilduman</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Partekatu</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Partekatu…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Ireki %1$s nabigatzailean</string> @@ -246,6 +270,51 @@ <!-- Button shown on the home page that opens the Customize home settings --> <string name="browser_menu_customize_home_1">Pertsonalizatu hasiera-orria</string> + <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> + <string name="browser_menu_sign_in">Hasi saioa</string> + + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Sinkronizatu pasahitzak, fitxak eta gehiago</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Hasi berriro saioa sinkronizatzeko</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Sinkronizazioa pausatuta</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Fitxa pribatu berria</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Pasahitzak</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Berria %1$s(e)n</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Aldatu mahaigaineko gunera</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Tresnak</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Gorde</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Egin orriaren laster-marka</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editatu laster-marka</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Gorde PDF gisa…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Aktibatu irakurtzeko ikuspegia</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desaktibatu irakurtzeko ikuspegia</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Itzuli orria…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s hizkuntzara itzulita</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Inprimatu…</string> + + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">Hedapenik ez hemen</string> + <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> <string name="browser_toolbar_home">Hasiera-pantaila</string> @@ -551,6 +620,10 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="preferences_account_sync_error">Birkonektatu sinkronizatzeari berrekiteko</string> <!-- Preference for language --> <string name="preferences_language">Hizkuntza</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Itzulpena</string> + <!-- Preference for translations --> + <string name="preferences_translations">Itzulpenak</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Datu-aukerak</string> <!-- Preference for data collection --> @@ -603,10 +676,14 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="quit_application">Aplikaziotik irteten aldaketak aplikatzeko…</string> <!-- Preference for add_ons --> - <string name="preferences_addons">Gehigarriak</string> + <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Hedapenak</string> <!-- Preference for installing a local add-on --> - <string name="preferences_install_local_addon">Instalatu gehigarria fitxategitik</string> + <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Instalatu gehigarria fitxategitik</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Instalatu hedapena fitxategitik</string> <!-- Preference for notifications --> <string name="preferences_notifications">Jakinarazpenak</string> @@ -615,9 +692,25 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Ez dago baimenduta</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Beharrezkoa</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Aukerakoa</string> + <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> + <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Webguneetako datuak irakurri eta aldatzea</string> + <!-- The description of the icon that can delete one of the websites displayed --> + <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Ezabatu webgunea</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Baimendu gune guztietarako</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Hedapena fidagarritzat baduzu, webgune guztietarako baimena eman diezaiokezu.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> - <string name="preferences_customize_amo_collection">Gehigarrien bilduma pertsonalizatua</string> + <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarrien bilduma pertsonalizatua</string> + <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> + <string name="preferences_customize_extension_collection">Hedapenen bilduma pertsonalizatua</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">Ados</string> <!-- Button caption to abort the add-on collection configuration --> @@ -627,13 +720,18 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- Hint displayed on input field for custom collection user ID--> <string name="customize_addon_collection_user_hint">Bildumaren jabea (erabiltzaile-IDa)</string> <!-- Toast shown after confirming the custom add-on collection configuration --> - <string name="toast_customize_addon_collection_done">Gehigarrien bilduma aldatu egin da. Aplikaziotik irteten aldaketak aplikatzeko…</string> + <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarrien bilduma aldatu egin da. Aplikaziotik irteten aldaketak aplikatzeko…</string> + + <!-- Toast shown after confirming the custom extension collection configuration --> + <string name="toast_customize_extension_collection_done">Hedapenen bilduma aldatu egin da. Aplikaziotik irteten aldaketak aplikatzeko…</string> <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Itzuli zeudenera</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Azken laster-markak</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Azken laster-markak</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Laster-markak</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Bisitatutako azkenak</string> @@ -682,21 +780,37 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> - <string name="addon_ga_message_title" tools:ignore="UnusedResources">Gehigarri berriak erabilgarri orain</string> + <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarri berriak erabilgarri orain</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Hedapen berriak erabilgarri orain</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Eman begiratua Firefox zure egiten lagunduko dizuten 100 gehigarri berri baino gehiagori.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> - <string name="addon_ga_message_button" tools:ignore="UnusedResources">Esploratu gehigarriak</string> + <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Esploratu gehigarriak</string> - <!-- Add-on process crash dialog to user --> + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Arakatu hedapenak</string> + + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> - <string name="addon_process_crash_dialog_title" tools:ignore="UnusedResources">Gehigarriak aldi baterako desgaitu dira</string> + <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarriak aldi baterako desgaitu dira</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">Hedapenak aldi baterako desgaitu dira</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> - <string name="addon_process_crash_dialog_message" tools:ignore="UnusedResources">Gehigarri bat edo gehiago ez dabil eta zure sistema desegonkortzen ari da. %1$s saiatu da gehigarriak berrabiarazten, arrakastarik gabe.\n\nEz da gehigarririk berrabiaraziko zure uneko saioan.\n\nGeghiarriak kendu edo desgaitzeak arazoa konpon lezake.</string> + <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Gehigarri bat edo gehiago ez dabil eta zure sistema desegonkortzen ari da. %1$s saiatu da gehigarriak berrabiarazten, arrakastarik gabe.\n\nEz da gehigarririk berrabiaraziko zure uneko saioan.\n\nGeghiarriak kendu edo desgaitzeak arazoa konpon lezake.</string> + <!-- This is a message shown to the user when too many errors have occurred with the extensions process and they have been disabled. + The user can decide if they would like to continue trying to start extensions or if they'd rather continue without them. + The first parameter is the application name. --> + <string name="extension_process_crash_dialog_message">Hedapen bat edo gehiago ez dabil eta zure sistema desegonkortzen ari da. %1$s saiatu da hedapena(k) berrabiarazten, arrakastarik gabe.\n\nEz da hedapenik berrabiaraziko zure uneko saioan.\n\nHedapenak kendu edo desgaitzeak arazoa konpon lezake.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> - <string name="addon_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Probatu gehigarriak berrabiarazten</string> + <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Probatu gehigarriak berrabiarazten</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Saiatu hedapenak berrabiarazten</string> <!-- The user will continue with all add-ons disabled --> - <string name="addon_process_crash_dialog_disable_addons_button_text" tools:ignore="UnusedResources">Jarraitu gehigarriak desgaituta</string> + <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Jarraitu gehigarriak desgaituta</string> + + <!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. --> + <string name="extension_process_crash_dialog_disable_extensions_button_text">Jarraitu hedapenak desgaituta</string> <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> @@ -757,6 +871,14 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s gailuko fitxa</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s fitxa itxita: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ikusi itxitako azken fitxak</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Salbuespenak</string> @@ -2443,10 +2565,14 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="translations_bottom_sheet_translate_from">Itzuli hemendik</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Itzuli hona</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Probatu beste iturburu-hizkuntza bat</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Une honetan ez</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Erakutsi jatorrizkoa</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Jatorrizko itzuli gabeko orria kargatuta</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Eginda</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2467,7 +2593,7 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">Barkatu, %1$s ez dugu onartzen oraindik.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Argibide gehiago</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Argibide gehiago</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> <string name="translation_in_progress_snackbar">Itzultzen…</string> @@ -2481,7 +2607,9 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Itzulpenen aukerak</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Itzulpenen aukerak</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Itzulpenen aukerak</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Eskaini beti itzultzea</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2500,6 +2628,9 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">%1$s(e)ko itzulpenei buruz</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Itxi itzulpenen orria</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Itzulpenak</string> @@ -2604,6 +2735,8 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="download_language_file_dialog_title">Deskargatu datuak aurrezteko moduan egotean (%1$s)?</string> <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation. --> <string name="download_language_file_dialog_message_all_languages">Hizkuntzak erdizka deskargatzen ditugu zure cachera itzulpenak pribatu manten daitezen.</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation without mentioning the cache. --> + <string name="download_language_file_dialog_message_all_languages_no_cache">Hizkuntzak erdizka deskargatzen ditugu itzulpenak pribatu manten daitezen.</string> <!-- Checkbox label text on the data saving mode warning dialog used by the translations feature. This checkbox allows users to ignore the data usage warnings. --> <string name="download_language_file_dialog_checkbox_text">Deskargatu beti datuak aurrezteko moduan</string> <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file. --> @@ -2618,12 +2751,19 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="debug_drawer_title">Arazketa-tresnak</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Nabigatu atzera</string> + + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Ireki arazketarako menu lerrakorra</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Fitxen tresnak</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Fitxa kopurua</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktibo</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktibo</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktibo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktibo</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2640,4 +2780,39 @@ zure pasahitzak, laster-markak eta gehiago zifratzen du.</string> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Gehitu fitxa inaktiboetara</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Gehitu fitxa pribatuetara</string> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Jarraitu</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Burutu inkesta</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Pribatutasun-oharra</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Bidali</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label">Itxi</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Eskerrik asko zure iritziagatik!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Oso kontent</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Kontent</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neutrala</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Kontentagaitz</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Oso kontentagaitz</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Saio-hasierak</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Uneko domeinua: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Gehitu saio-hasiera faltsua domeinu honetarako</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Ezabatu %s erabiltzaile-izena duen saio-hasiera</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-fi/strings.xml b/mobile/android/fenix/app/src/main/res/values-fi/strings.xml index aa7be14543..004d8494cd 100644 --- a/mobile/android/fenix/app/src/main/res/values-fi/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-fi/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Lisäosat</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Laajennukset</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Hallitse laajennuksia</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Löydä lisää laajennuksia</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Tilin tiedot</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Avaa tavallisessa välilehdessä</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Lisää aloitusnäytölle</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Lisää aloitusnäytölle…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Asenna</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,10 +236,14 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Käännä sivu</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Tallenna kokoelmaan…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Tallenna kokoelmaan</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Jaa</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Jaa…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Avaa sovelluksessa %1$s</string> @@ -288,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Tallenna</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Lisää tämä sivu kirjanmerkkeihin</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Muokkaa kirjanmerkkiä</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Tallenna PDF-muodossa…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Avaa lukunäkymä</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Sulje lukunäkymä</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Käännä sivu…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Käännetty kielelle %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Tulosta…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Täällä ei ole laajennuksia</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefoxin tietosuojakäytäntö</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Lue lisää tietosuojakäytännöstämme</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Turvaamisesi on tärkeää meille</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Kieli</string> <!-- Preference for translation --> - <string name="preferences_translation">Käännös</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Käännös</string> + <!-- Preference for translations --> + <string name="preferences_translations">Käännökset</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Tietovalinnat</string> <!-- Preference for data collection --> @@ -670,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Pakollinen</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valinnainen</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Lue ja muuta verkkosivuston dataa</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Poista verkkosivusto</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Salli kaikille sivustoille</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -799,8 +823,6 @@ <string name="preferences_sync_history">Historia</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Kirjanmerkit</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Kirjautumistiedot</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Salasanat</string> <!-- Preference for syncing tabs --> @@ -827,8 +849,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s laitteella %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Luottokortit</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Maksutavat</string> <!-- Preference for syncing addresses --> @@ -844,6 +864,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Välilehti laitteesta %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-välilehtiä suljettu: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Näytä viimeksi suljetut välilehdet</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Poikkeukset</string> @@ -1783,12 +1811,8 @@ <string name="add_to_homescreen_description_2">Voit lisätä tämän sivuston laitteesi aloitusnäytölle, jolloin sivuston käyttö onnistuu nopeasti ja tarjoaa sovelluksen kaltaisen kokemuksen.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Käyttäjätunnukset ja salasanat</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Salasanat</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Tallenna käyttäjätunnukset ja salasanat</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Tallenna salasanat</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Kysy tallennusta</string> @@ -1804,46 +1828,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Täytä käyttäjätunnukset ja salasanat muissa laitteesi sovelluksissa.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lisää kirjautumistieto</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Lisää salasana</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkronoi kirjautumistiedot</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synkronoi salasanat</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkronoi kirjautumistiedot laitteiden välillä</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synkronoi salasanat eri laitteiden välillä</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Tallennetut kirjautumistiedot</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Tallennetut salasanat</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">%siin tallentamasi tai synkronoimasi kirjautumistiedot näkyvät täällä.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">%siin tallentamasi tai synkronoimasi salasanat näkyvät tässä. Kaikki tallentamasi salasanat ovat salattuja.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Lue lisää Syncista.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Lisätietoja synkronoinnista</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Poikkeukset</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Käyttäjätunnukset ja salanat, joita ei tallenneta, näytetään täällä.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s ei tallenna tässä lueteltujen sivustojen salasanoja.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Käyttäjätunnuksia ja salasanoja ei tallenneta näille sivustoille.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s ei tallenna näiden sivustojen salasanoja.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Poista kaikki poikkeukset</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Etsi kirjautumistiedoista</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Etsi salasanoja</string> <!-- The header for the site that a login is for --> @@ -1872,17 +1877,11 @@ <string name="saved_login_reveal_password">Näytä salasana</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Piilota salasana</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Avaa lukitus nähdäksesi tallennetut kirjautumistiedot</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Avaa lukitus nähdäksesi tallennetut salasanat</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Suojaa käyttäjätunnuksesi ja salasanasi</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Suojaa tallennetut salasanat</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Aseta laitteen avaukseen tarkoitettu kuvio, PIN-koodi tai salasana suojataksesi tallennetut kirjautumistiedot ja salasanat siltä varalta, että joku saa laitteesi haltuunsa.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Määritä laitteen lukituskuvio, PIN-koodi tai salasana suojataksesi tallennettuja salasanojasi, jos laitteesi on jollain toisella.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Myöhemmin</string> @@ -1900,8 +1899,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nimi (A-Ö)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Viimeksi käytetty</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Järjestä kirjautumistietojen valikko</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Salasanojen järjestysvalikko</string> @@ -1911,41 +1908,27 @@ <string name="preferences_autofill">Automaattinen täyttö</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Osoitteet</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Luottokortit</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Maksutavat</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tallenna ja täytä kortit automaattisesti</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Tallenna ja täytä maksutavat</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Tiedot on salattu</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s salaa kaikki tallentamasi maksutavat</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synkronoi kortit laitteiden välillä</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synkronoi kortit</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Lisää luottokortti</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Lisää kortti</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Hallinnoi tallennettuja kortteja</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Hallitse kortteja</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Lisää osoite</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Hallitse osoitteita</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Tallenna ja täytä osoitteet automaattisesti</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Tallenna ja täytä osoitteet</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Sisällytä tiedot kuten numerot, sähköpostiosoitteet ja toimitusosoitteet</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Sisältää puhelinnumerot ja sähköpostiosoitteet</string> @@ -1969,8 +1952,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Poista kortti</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Haluatko varmasti poistaa tämän luottokortin?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Poistetaanko kortti?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Poista</string> @@ -1984,24 +1965,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tallennetut kortit</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Kirjoita kelvollinen luottokortin numero</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Anna kelvollinen kortin numero</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Täytä tämä kenttä</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Lisää nimi</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Avaa lukitus nähdäksesi tallennetut kortit</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Suojaa luottokorttisi</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Suojaa tallennetut maksutavat</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Aseta laitteen avaukseen tarkoitettu kuvio, PIN-koodi tai salasana suojataksesi tallennetut luottokorttitiedot siltä varalta, että joku saa laitteesi haltuunsa.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Määritä laitteen lukituskuvio, PIN-koodi tai salasana suojataksesi tallennettuja maksutapojasi, jos laitteesi on jollain toisella.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Aseta nyt</string> @@ -2010,9 +1982,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Avaa laitteen lukitus</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Avaa lukitus käyttääksesi tallennettuja luottokorttitietoja</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Avaa lukitus käyttääksesi tallennettuja maksutapoja</string> <!-- Title of the "Add address" screen --> @@ -2021,12 +1990,6 @@ <string name="addresses_edit_address">Muokkaa osoitetta</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Hallitse osoitteita</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Etunimi</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Toinen nimi</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Sukunimi</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nimi</string> <!-- The header for the street address of an address --> @@ -2053,8 +2016,6 @@ <string name="addressess_delete_address_button">Poista osoite</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Haluatko varmasti poistaa tämän osoitteen?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Poistetaanko tämä osoite?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Poista</string> @@ -2153,49 +2114,29 @@ <string name="login_menu_delete_button">Poista</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Muokkaa</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Haluatko varmasti poistaa tämän kirjautumistiedon?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Haluatko varmasti poistaa tämän salasanan?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Poista</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Peruuta</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Kirjautumistietojen valinnat</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Salasanojen asetukset</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Muokattava tekstikenttä kirjautumisen verkkosivua varten.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Verkkosivuston muokattava tekstikenttä.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Muokattava tekstikenttä kirjautumisen käyttäjätunnusta varten.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Käyttäjätunnuksen muokattava tekstikenttä.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Muokattava tekstikenttä kirjautumisen salasanaa varten.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Salasanan muokattava tekstikenttä.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Tallenna muutokset kirjautumistietoihin.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Tallenna muutokset.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Muokkaa</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Muokkaa salasanaa</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lisää uusi kirjautumistieto</string> <!-- The page title for adding new password. --> <string name="add_login_2">Lisää salasana</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Salasana vaaditaan</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Kirjoita salasana</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Käyttäjätunnus vaaditaan</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Kirjoita käyttäjätunnus</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Isäntänimi vaaditaan</string> @@ -2582,6 +2523,11 @@ <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">Tietoja käännöksistä %1$sissa</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Sulje käännössivu</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Jotkut asetukset eivät ole tilapäisesti käytettävissä.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Käännökset</string> @@ -2606,6 +2552,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Valitse kieli hallitaksesi "käännä aina"- ja "älä käännä koskaan"-asetuksia.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Kieliä ei voitu ladata. Tarkista myöhemmin uudelleen.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Tarjoa käännöstä (oletus)</string> @@ -2629,6 +2578,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Poista %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Sivustoja ei voitu ladata. Tarkista myöhemmin uudelleen.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Poistetaanko %1$s?</string> @@ -2706,13 +2657,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Siirry taaksepäin</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Avaa vianjäljitysvalikko</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Välilehtityökalut</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Välilehtien määrä</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiivinen</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiivinen</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiivinen</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Passiivinen</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2723,6 +2679,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Välilehtien luontityökalu</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Luotavien välilehtien määrä</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstikenttä on tyhjä</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Anna vain positiivisia kokonaislukuja</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Anna numero, joka on suurempi kuin nolla</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Yhdellä toiminnolla luotavien välilehtien enimmäismäärä (%1$s) täynnä</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Lisää aktiivisiin välilehtiin</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2739,11 +2705,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Tietosuojakäytäntö</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Lähetä</string> + <string name="micro_survey_submit_button_label">Lähetä</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Sulje</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Sulje</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Kiitos palautteestasi!</string> + <string name="micro_survey_feedback_confirmation">Kiitos palautteestasi!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Hyvin tyytyväinen</string> <!-- Option for likert scale --> @@ -2755,6 +2721,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Hyvin tyytymätön</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Avaa kysely</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Sulje kysely</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Sulje</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Kirjautumistiedot</string> diff --git a/mobile/android/fenix/app/src/main/res/values-fr/strings.xml b/mobile/android/fenix/app/src/main/res/values-fr/strings.xml index 59aafe7a2d..d39900ddce 100644 --- a/mobile/android/fenix/app/src/main/res/values-fr/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-fr/strings.xml @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Modules complémentaires</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gérer les extensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Découvrir d’autres extensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informations du compte</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">Ouvrir dans un onglet classique</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Ajouter à l’écran d’accueil</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Ajouter à l’écran d’accueil…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installer</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -231,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduire la page</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Enregistrer dans une collection…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Enregistrer dans une collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Partager</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Partager…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Ouvrir avec %1$s</string> @@ -288,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Enregistrer</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Marquer cette page</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Modifier le marque-page</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Enregistrer en PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Passer en mode lecture</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Quitter le mode lecture</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traduire la page…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traduit en %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimer…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Aucune extension disponible</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Politique de confidentialité de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">En savoir plus dans notre politique de confidentialité</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Votre protection compte pour nous</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Langues</string> <!-- Preference for translation --> - <string name="preferences_translation">Traduction</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduction</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traductions</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Choix de données</string> <!-- Preference for data collection --> @@ -670,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obligatoire</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Facultatif</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Consulter et modifier les données de sites web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Supprimer le site web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Autoriser pour tous les sites</string> @@ -799,8 +823,6 @@ <string name="preferences_sync_history">Historique</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marque-pages</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identifiants</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Mots de passe</string> <!-- Preference for syncing tabs --> @@ -827,8 +849,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s sur %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartes bancaires</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Moyens de paiement</string> <!-- Preference for syncing addresses --> @@ -846,6 +866,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Onglet provenant de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d onglets fermés sur %1$s</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Afficher les onglets récemment fermés</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceptions</string> @@ -1798,12 +1826,8 @@ <string name="add_to_homescreen_description_2">Vous pouvez facilement ajouter ce site à l’écran d’accueil de votre appareil pour y avoir accès directement et naviguer plus rapidement, comme si vous utilisiez une application.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Identifiants et mots de passe</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Mots de passe</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Enregistrer les identifiants et les mots de passe</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Enregistrer les mots de passe</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Demander pour enregistrer</string> @@ -1819,46 +1843,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Remplit les noms d’utilisateur et les mots de passe dans d’autres applications sur votre appareil.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ajouter un identifiant</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Ajouter un mot de passe</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchroniser les identifiants</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synchroniser les mots de passe</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchroniser les identifiants entre vos appareils</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synchronisez les mots de passe entre vos appareils</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identifiants enregistrés</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Mots de passe enregistrés</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Les identifiants que vous enregistrez ou synchronisez avec %s s’afficheront ici.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Les mots de passe que vous enregistrez ou synchronisez avec %s seront répertoriés ici. Tous les mots de passe que vous enregistrez sont chiffrés.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">En savoir plus sur Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">En savoir plus sur la synchronisation</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceptions</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Les identifiants et les mots de passe qui ne sont pas enregistrés seront affichés ici.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s n’enregistrera pas les mots de passe pour les sites listés ici.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Les identifiants et les mots de passe ne seront pas enregistrés pour ces sites.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s n’enregistrera pas les mots de passe pour ces sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Supprimer toutes les exceptions</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Rechercher des identifiants</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Rechercher des mots de passe</string> <!-- The header for the site that a login is for --> @@ -1887,17 +1892,11 @@ <string name="saved_login_reveal_password">Afficher le mot de passe</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Masquer le mot de passe</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Déverrouillez pour afficher vos identifiants enregistrés</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Déverrouillez pour afficher vos mots de passe enregistrés</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protégez vos identifiants et mots de passe</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Sécurisez les mots de passe enregistrés</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configurez un schéma de verrouillage, un code PIN ou un mot de passe pour protéger vos identifiants de connexion et mots de passe enregistrés pour le cas où quelqu’un accède à votre appareil.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configurez un schéma de verrouillage, un code PIN ou un mot de passe pour protéger vos mots de passe enregistrés si jamais quelqu’un accède à votre appareil.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Plus tard</string> @@ -1914,8 +1913,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nom (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Dernière utilisation</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menu de tri des identifiants</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menu de tri des mots de passe</string> @@ -1925,41 +1922,27 @@ <string name="preferences_autofill">Remplissage automatique</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresses</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartes bancaires</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Moyens de paiement</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Enregistrer et remplir automatiquement les cartes</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Enregistrer et renseigner les moyens de paiement</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Les données sont chiffrées</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s chiffre tous les moyens de paiement que vous enregistrez</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synchroniser les cartes entre vos appareils</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synchroniser les cartes</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Ajouter une carte bancaire</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Ajouter une carte</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gérer les cartes enregistrées</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gérer les cartes</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Ajouter une adresse</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gérer les adresses</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Enregistrer et remplir automatiquement les adresses</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Enregistrer et remplir automatiquement les adresses</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Cela comprend des informations telles que des numéros, des adresses e-mail et des adresses d’expédition</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Y compris les numéros de téléphone et les adresses e-mail</string> @@ -1983,8 +1966,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Supprimer la carte</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Voulez-vous vraiment supprimer cette carte bancaire ?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Supprimer la carte ?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Supprimer</string> @@ -1998,24 +1979,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartes enregistrées</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Veuillez saisir un numéro de carte bancaire valide</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Saisissez un numéro de carte valide</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Veuillez compléter ce champ</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Ajouter un nom</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Déverrouillez pour afficher vos cartes enregistrées</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protégez vos cartes bancaires</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Sécurisez vos moyens de paiement enregistrés</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configurez un schéma de verrouillage, un code PIN ou un mot de passe pour protéger vos cartes bancaires enregistrées si jamais quelqu’un accède à votre appareil.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configurez un schéma de verrouillage, un code PIN ou un mot de passe pour protéger vos moyens de paiement enregistrés si jamais quelqu’un accède à votre appareil.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurer maintenant</string> @@ -2023,8 +1995,6 @@ <string name="credit_cards_warning_dialog_later">Plus tard</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Déverrouillez votre appareil</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Déverrouillez pour utiliser les informations de cartes bancaires enregistrées</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Déverrouillez pour utiliser des moyens de paiement enregistrés</string> @@ -2034,12 +2004,6 @@ <string name="addresses_edit_address">Modifier l’adresse</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gérer les adresses</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Prénom</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Deuxième prénom</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Nom de famille</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nom complet</string> <!-- The header for the street address of an address --> @@ -2066,8 +2030,6 @@ <string name="addressess_delete_address_button">Supprimer l’adresse</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Voulez-vous vraiment supprimer cette adresse ?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Supprimer cette adresse ?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Supprimer</string> @@ -2165,49 +2127,29 @@ <string name="login_menu_delete_button">Supprimer</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Modifier</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Voulez-vous vraiment supprimer cet identifiant ?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Voulez-vous vraiment supprimer ce mot de passe ?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Supprimer</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annuler</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Options de l’identifiant</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Options de mot de passe</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le champ de texte modifiable pour l’adresse web de l’identifiant.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Le champ de texte modifiable pour l’adresse du site web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le champ de texte modifiable pour le nom d’utilisateur de l’identifiant.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Le champ de texte modifiable pour le nom d’utilisateur.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le champ de texte modifiable pour le mot de passe de l’identifiant.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Le champ de texte modifiable pour le mot de passe.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Enregistrez les modifications de l’identifiant.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Enregistrer les modifications.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Modifier</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Modifier le mot de passe</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Ajouter un nouvel identifiant</string> <!-- The page title for adding new password. --> <string name="add_login_2">Ajouter un mot de passe</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Mot de passe requis</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Saisissez un mot de passe</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Le nom d’utilisateur doit être renseigné.</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Saisissez un nom d’utilisateur</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Le nom d’hôte est requis</string> @@ -2617,6 +2559,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Fermer l’onglet Traductions</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Certains paramètres sont temporairement indisponibles.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traductions</string> @@ -2640,6 +2585,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Sélectionnez une langue pour gérer les préférences « Toujours traduire » et « Ne jamais traduire ».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Impossible de charger les langues. Veuillez réessayer plus tard.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Proposer de traduire (par défaut)</string> @@ -2662,6 +2610,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Supprimer %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Impossible de charger des sites. Veuillez réessayer plus tard.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Supprimer %1$s ?</string> @@ -2739,13 +2689,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Revenir</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Ouvrir le panneau de débogage</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Outils d’onglets</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Nombre d’onglets</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Actifs</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Actifs</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Actif</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactifs</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2756,6 +2711,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Outil de création d’onglets</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Nombre d’onglets à créer</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Le champ de texte est vide</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Saisissez uniquement des nombres entiers positifs</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Saisissez un nombre supérieur à zéro</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Vous avez dépassé le nombre maximal d’onglets (%1$s) qui peuvent être générés en une seule opération</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Ajouter aux onglets actifs</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2772,11 +2737,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Politique de confidentialité</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Envoyer</string> + <string name="micro_survey_submit_button_label">Envoyer</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Fermer</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Fermer</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Merci de votre retour !</string> + <string name="micro_survey_feedback_confirmation">Merci de votre retour !</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Très satisfait·e</string> <!-- Option for likert scale --> @@ -2788,6 +2753,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Très insatisfait·e</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Ouvrir le sondage</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Fermer le sondage</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Fermer</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Identifiants</string> diff --git a/mobile/android/fenix/app/src/main/res/values-fur/strings.xml b/mobile/android/fenix/app/src/main/res/values-fur/strings.xml index 8f59de5cbf..20676406c0 100644 --- a/mobile/android/fenix/app/src/main/res/values-fur/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-fur/strings.xml @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Components adizionâi</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Estensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gjestìs estensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Scuvierç altris estensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informazions account</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Vierç intune schede normâl</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Zonte a schermade principâl</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Zonte a scherm. di inizi…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instale</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Tradûs pagjine</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Salve intune racuelte…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Salve intune racuelte</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Condivît</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Condivît…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Vierç in %1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Salve</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Zonte pagjine ai segnelibris</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Modifiche segnelibri</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Salve come PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Ative Viodude di leture</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Disative Viodude di leture</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Tradûs pagjine…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Voltade par %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Stampe…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nissune estension achì</string> @@ -377,8 +405,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Informative su la riservatece di Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Plui informazions te nestre informative su la riservatece</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nus plâs tignîti di cont</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -594,7 +620,9 @@ <!-- Preference for translation --> - <string name="preferences_translation">Traduzion</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduzion</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traduzions</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Sielte di dâts</string> <!-- Preference for data collection --> @@ -665,10 +693,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obligatori</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Facoltatîf</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Lei e modificâ i dâts dai sîts web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Elimine sît web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permet par ducj i sîts</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -797,8 +821,6 @@ <string name="preferences_sync_history">Cronologjie</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Segnelibris</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziâls</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passwords</string> <!-- Preference for syncing tabs --> @@ -823,8 +845,6 @@ The first parameter is the application name, the second is the device manufacturer name and the third is the device model. --> <string name="default_device_name_2">%1$s su %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cjartis di credit</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Metodis di paiament</string> <!-- Preference for syncing addresses --> @@ -841,6 +861,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Schede di %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Schedis di %1$s sieradis: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Viôt schedis sieradis di resint</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Ecezions</string> @@ -1770,12 +1798,8 @@ <string name="add_to_homescreen_description_2">Al è pussibil zontâ chest sît web ae schermade principâl dal dispositîf par doprâle cun plui sveltece, tant che e fos une aplicazion.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziâls e passwords</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passwords</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Salve credenziâls e passwords</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Salve passwords</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Domande prime di salvâ</string> @@ -1789,48 +1813,30 @@ <string name="preferences_android_autofill">Compile in automatic in altris aplicazions</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Compile i nons utent e lis passwords in altris aplicazions dal to dispositîf.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Zonte credenziâl</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Zonte password</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronize lis credenziâls</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronize passwords</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronize lis credenziâls tra dispositîfs</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronize passwords tra i tiei dispositîfs</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziâls salvadis</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Passwords salvadis</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Lis credenziâls che tu salvis o sincronizis su %s a vignaran fûr achì.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Lis passwords salvadis o sincronizadis su %s a vignaran listadis achì. Dutis lis passwords che tu salvis a vegnin cifradis. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Plui informazions su Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Plui informazions su la sincronizazion</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Ecezions</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Lis credenziâls e lis passwords che no tu âs salvât a vignaran fûr achì.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s nol salvarà lis passwords pai sîts listâts achì.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Lis credenziâls e lis passwords no vignaran salvadis par chescj sîts.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s nol salvarà lis passwords par chescj sîts.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Elimine dutis lis ecezions</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Cîr credenziâls</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Cîr tes passwords</string> <!-- The header for the site that a login is for --> @@ -1859,17 +1865,11 @@ <string name="saved_login_reveal_password">Mostre password</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Plate password</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sbloche par visualizâ lis credenziâls salvadis</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Sbloche par viodi lis passwords salvadis</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protêç lis tôs credenziâls di acès</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Protêç lis passwords salvadis</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure une secuence di bloc, PIN o password par protezi lis tôs credenziâls e lis passwords salvadis, cussì che se cualchidun altri al varà il to dispositîf nol rivarà a doprâlis.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configure une secuence di bloc, PIN o password par protezi lis passwords salvadis, cussì che se cualchidun altri al varà il to dispositîf nol rivarà a doprâlis.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Plui indenant</string> @@ -1885,8 +1885,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Non (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Ultime doprade</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordene il menù des credenziâls</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menù par ordenâ lis passwords</string> @@ -1896,41 +1894,27 @@ <string name="preferences_autofill">Compilazion automatiche</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Recapits</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cjartis di credit</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Metodis di paiament</string> - <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Salve e compile in automatic lis cjartis</string> <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Salve e compile i metodis di paiament</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">I dâts a son cifrâts</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s al cifre ducj i metodis di paiaments salvâts</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronize lis cjartis tra plui dispositîfs</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronize cjartis di credit</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Zonte cjarte di credit</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Zonte cjarte</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gjestìs cjartis salvadis</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gjestìs cjartis</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Zonte recapit</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gjestìs recapits</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Salve e compile in automatic i recapits</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Salve e compile direzions</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Includi informazions come numars, e-mail e recapits di spedizion</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inclût numars di telefon e direzions e-mail</string> @@ -1954,8 +1938,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Elimine cjarte</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Eliminâ pardabon cheste cjarte di credit?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Eliminâ la cjarte?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Elimine</string> @@ -1967,24 +1949,16 @@ <string name="credit_cards_cancel_button">Anule</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cjartis salvadis</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Inserìs un numar di cjarte di credit valit</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Inserìs un numar di cjarte valit</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Compile chest cjamp</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Zonte un non</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Sbloche par visualizâ lis cjartis di credit salvadis</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protêç lis tôs cjartis di credit</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Protêç i metodis di paiament salvâts</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure une secuence di bloc, PIN o password par protezi lis tôs cjartis di credit salvadis, cussì che se cualchidun altri al varà il to dispositîf nol rivarà a doprâlis.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configure une secuence di bloc, PIN o password par protezi i tiei metodis di paiament salvâts, cussì che se cualchidun altri al varà il to dispositîf nol rivarà a doprâju.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configure cumò</string> @@ -1992,8 +1966,6 @@ <string name="credit_cards_warning_dialog_later">Plui indenant</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Sbloche il dispositîf</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sbloche par doprâ lis informazions des cjartis di credit memorizadis</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Sbloche par doprâ i metodis di paiament</string> <!-- Title of the "Add address" screen --> @@ -2002,12 +1974,6 @@ <string name="addresses_edit_address">Modifiche recapit</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gjestìs recapits</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Non</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Secont non</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Cognon</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Non</string> <!-- The header for the street address of an address --> @@ -2033,8 +1999,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Elimine recapit</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Eliminâ pardabon chest recapit?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Eliminâ cheste direzion?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Elimine</string> @@ -2132,49 +2096,29 @@ <string name="login_menu_delete_button">Elimine</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Modifiche</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Eliminâ pardabon cheste credenziâl?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Eliminâ pardabon cheste password?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Elimine</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Anule</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opzions credenziâls</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opzions password</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il cjamp di test modificabil pe direzion web de credenziâl.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Il cjamp di test che si pues modificâ pe direzion dal sît web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il cjamp di test modificabil pal non utent de credenziâl.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Il cjamp di test che si pues modificâ pal non utent.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il cjamp di test modificabil pe password de credenziâl.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Il cjamp di test che si pues modificâ pe password.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Salve lis modifichis ae credenziâl.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Salve modifichis.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Modifiche</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Modifiche password</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Zonte gnove credenziâl</string> <!-- The page title for adding new password. --> <string name="add_login_2">Zonte password</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Password necessarie</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Inserìs une password</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Non utent necessari</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Inserìs un non utent</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Non servidôr necessari</string> @@ -2524,6 +2468,8 @@ <string name="translations_bottom_sheet_negative_button">No cumò</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Mostre origjinâl</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Cjariade pagjine origjinâl no tradote</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Fat</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2582,6 +2528,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Siere il sfuei des traduzions</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Cualchi impostazion no je pal moment disponibile.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traduzions</string> @@ -2604,6 +2553,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selezione une lenghe par gjestî lis preferencis ”tradûs simpri“ e ”no sta tradusi mai“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Impussibil cjariâ lis lenghis. Torne controle plui tart.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Propon la traduzion (predefinide)</string> @@ -2626,6 +2578,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Gjave %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Impussibil cjariâ i sîts. Torne controle plui tart.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Eliminâ %1$s?</string> @@ -2707,13 +2661,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Torne indaûr</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Vierç scansel pal debug</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Struments des schedis</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Conte des schedis</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Ative</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Ative</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Ativis</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inative</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2724,6 +2683,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Strument pe creazion di schedis</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Numar di schedis di creâ</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Il cjamp di test al è vueit</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Inserìs dome numars intîrs positîfs</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Inserìs un numar plui grant di zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Al è stât superât il numar massim di schedis (%1$s) che al è pussibil gjenerâ cuntune sole operazion</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Zonte a schedis ativis</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2740,11 +2709,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Informative su la riservatece</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Invie</string> + <string name="micro_survey_submit_button_label">Invie</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Siere</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Siere</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Graciis di vê condividude la tô opinion.</string> + <string name="micro_survey_feedback_confirmation">Graciis di vê condividude la tô opinion.</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Une vore sodisfat(e)</string> <!-- Option for likert scale --> @@ -2756,6 +2725,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Une vore insodisfat(e)</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Vierç sondaç</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Siere sondaç</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Siere</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Credenziâls</string> diff --git a/mobile/android/fenix/app/src/main/res/values-fy-rNL/strings.xml b/mobile/android/fenix/app/src/main/res/values-fy-rNL/strings.xml index 0e0ce000f9..201fbd157c 100644 --- a/mobile/android/fenix/app/src/main/res/values-fy-rNL/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-fy-rNL/strings.xml @@ -200,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Utwreidingen</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Utwreidingen beheare</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Mear útwreidingen ûntdekke</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Accountynformaasje</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Iepenje yn gewoan ljepblêd</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Tafoegje oan startskerm</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Tafoegje oan startskerm…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Ynstallearje</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,9 +236,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Side oersette</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Yn kolleksje bewarje…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Yn kolleksje bewarje</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Diele</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Diele…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Iepenje yn %1$s</string> @@ -285,6 +295,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Bewarje</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Blêdwizer foar dizze side meitsje</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Blêdwizer bewurkje</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Bewarje as PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Lêzerwerjefte ynskeakelje</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Lêzerwerjefte útskeakelje</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Side oersette…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Oerset nei %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Ofdrukke…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Gjin útwreidingen hjir</string> @@ -382,8 +410,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox-privacyferklearring</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Lês mear yn ús privacyferklearring</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Wy hâlde jo graach feilich</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -591,7 +617,9 @@ <!-- Preference for language --> <string name="preferences_language">Taal</string> <!-- Preference for translation --> - <string name="preferences_translation">Oersetting</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Oersetting</string> + <!-- Preference for translations --> + <string name="preferences_translations">Oersettingen</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Gegevenskarren</string> <!-- Preference for data collection --> @@ -665,10 +693,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Fereaske</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opsjoneel</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Websitegegevens lêze en wizigje</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Website fuortsmite</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tastean foar alle websites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -793,8 +817,6 @@ <string name="preferences_sync_history">Skiednis</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Blêdwizers</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Wachtwurden</string> <!-- Preference for syncing tabs --> @@ -821,8 +843,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s op %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcards</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betellingsmetoaden</string> <!-- Preference for syncing addresses --> @@ -838,6 +858,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Ljepblêd fan %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-ljepblêden sluten: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Koartlyn sluten ljepblêden besjen</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Utsûnderingen</string> @@ -1760,12 +1788,8 @@ <string name="add_to_homescreen_description_2">Jo kinne dizze website ienfâldich oan it startskerm fan jo apparaat tafoegje, om sa daliks tagong te hawwen en flugger te navigearjen mei in app-eftige ûnderfining.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen en wachtwurden</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Wachtwurden</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen en wachtwurden bewarje</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Wachtwurden bewarje</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Freegje om te bewarjen</string> @@ -1780,47 +1804,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Brûkersnammen en wachtwurden yn oare apps op jo apparaat ynfolje.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmelding tafoegje</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Wachtwurd tafoegje</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen syngronisearje</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Wachtwurden syngronisearje</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen op apparaten syngronisearje</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Wachtwurden syngronisearje tusken apparaten</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Bewarre oanmeldingen</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Bewarre wachtwurden</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">De oanmeldingen dy’t jo bewarje of syngronisearje mei %s wurde hjir toand.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">De wachtwurden dy’t jo bewarje of syngronisearje mei %s sille hjir fermeld wurde. Alle wachtwurden dy’t jo bewarje binne fersifere. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Mear ynfo oer Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Mear ynfo oer syngronisaasje</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Utsûnderingen</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Net-bewarre oanmeldingen en wachtwurden wurde hjir werjûn.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s sil gjin wachtwurden foar de hjir fermelde websites bewarje.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen en wachtwurden wurde foar dizze websites net bewarre. </string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s sil gjin wachtwurden foar dizze websites bewarje.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Alle útsûnderingen fuortsmite</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldingen sykje</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Wachtwurden sykje</string> <!-- The header for the site that a login is for --> @@ -1849,17 +1854,11 @@ <string name="saved_login_reveal_password">Wachtwurd toane</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Wachtwurd ferstopje</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Untskoattelje om jo bewarre oanmeldingen te besjen</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Untskoattelje om jo bewarre wachtwurden te besjen</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Befeiligje jo oanmeldingen en wachtwurden</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Befeiligje jo bewarre wachtwurden</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Stel in beskoattelingspatroan, pinkoade of wachtwurd foar jo apparaat yn om jo bewarre oanmeldingen en wachtwurden te beskermjen tsjin tagong as in oar jo apparaat hat.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Stel in beskoattelingspatroan, pinkoade of wachtwurd foar jo apparaat yn om jo bewarre wachtwurden te beskermjen tsjin tagong as in oar jo apparaat hat.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Letter</string> @@ -1876,8 +1875,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Namme (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Lêst brûkt</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menu Oanmeldingen sortearje</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Wachtwurdmenu sortearje</string> @@ -1887,41 +1884,27 @@ <string name="preferences_autofill">Automatysk ynfolje</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adressen</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcards</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betellingsmetoaden</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kaarten bewarje en automatysk ynfolje</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Betellingsmetoaden bewarje en ynfolje</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Gegevens binne fersifere</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s fersiferet alle betellingsmetoaden dy’t jo bewarje</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Kaarten syngronisearje tusken apparaten</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Kaarten syngronisearje</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcard tafoegje</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Kaart tafoegje</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Bewarre kaarten beheare</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Kaarten beheare</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adres tafoegje</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adressen beheare</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Adressen bewarje en automatysk ynfolje</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adressen bewarje en ynfolje</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Ynformaasje lykas nûmers, e-mail- en ferstjoeradressen tafoegje</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Ynklusyf telefoannûmers en e-mailadressen</string> @@ -1946,8 +1929,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kaart fuortsmite</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Binne jo wis dat jo dizze creditcard fuortsmite wolle?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kaart fuortsmite?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Fuortsmite</string> @@ -1961,23 +1942,14 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Bewarre kaarten</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Fier in jildich creditkaartnûmer yn</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Fier in jildich kaartnûmer yn</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Folje dit fjild yn</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Foegje in namme ta</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Untskoattelje om jo bewarre kaarten te besjen</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Befeiligje jo creditcards</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Befeiligje jo bewarre betelmetoaden</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Stel in beskoattelingspatroan, pinkoade of wachtwurd foar jo apparaat yn om jo bewarre creditcards te beskermjen tsjin tagong as in oar jo apparaat hat.</string> <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Stel in beskoattelingspatroan, pinkoade of wachtwurd foar jo apparaat yn om jo bewarre betellingsmetoaden te beskermjen tsjin tagong as in oar jo apparaat hat.</string> @@ -1988,9 +1960,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Untskoattelje jo apparaat</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Untskoattelje om bewarre creditkaartynformaasje te brûken</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Untskoattelje om bewarre betellingsmetoaden te brûken</string> <!-- Title of the "Add address" screen --> @@ -1999,12 +1968,6 @@ <string name="addresses_edit_address">Adres bewurkje</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adressen beheare</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Foarnamme</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Twadde namme</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Efternamme</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Namme</string> <!-- The header for the street address of an address --> @@ -2031,8 +1994,6 @@ <string name="addressess_delete_address_button">Adres fuortsmite</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Binne jo wis dat jo dit adres fuortsmite wolle?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Dit adres fuortsmite?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Fuortsmite</string> @@ -2130,49 +2091,29 @@ <string name="login_menu_delete_button">Fuortsmite</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Bewurkje</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Binne jo wis dat jo dizze oanmelding fuortsmite wolle?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Binne jo wis dat jo dit wachtwurd fuortsmite wolle?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Fuortsmite</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annulearje</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Oanmeldopsjes</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Wachtwurdopsjes</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">It bewurkbere tekstfjild foar it webadres fan de oanmelding.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">It bewurkbere tekstfjild foar it websiteadres.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">It bewurkbere tekstfjild foar de brûkersnamme fan de oanmelding.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">It bewurkbere tekstfjild foar de brûkersnamme.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">It bewurkbere tekstfjild foar it wachtwurd fan de oanmelding.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">It bewurkbere tekstfjild foar it wachtwurd.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Wizigingen oan oanmelding bewarje.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Wizigingen bewarje.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Bewurkje</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Wachtwurd bewurkje</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Nije oanmelding tafoegje</string> <!-- The page title for adding new password. --> <string name="add_login_2">Wachtwurd tafoegje</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Wachtwurd fereaske</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Folje in wachtwurd yn</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Brûkersnamme fereaske</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Folje in brûkersnamme yn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostnamme fereaske</string> @@ -2524,6 +2465,8 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <string name="translations_bottom_sheet_negative_button">No net</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Orizjineel toane</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Oarspronklik net-oersette side laden</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Dien</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2580,6 +2523,9 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Blêd Oersettingen slute</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Guon ynstellingen binne tydlik net beskikber.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Oersettingen</string> @@ -2602,6 +2548,9 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selektearje in taal om de foarkarren ‘Altyd oersette’ en ‘Nea oersette’ te behearen.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Kin talen net lade. Probearje it letter nochris.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Oanbiede om oer te setten (standert)</string> @@ -2624,6 +2573,8 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s fuortsmite</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Kin websites net lade. Probearje it letter nochris.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s fuortsmite?</string> @@ -2702,13 +2653,18 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Tebek blêdzje</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Debuglade iepenje</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Ljepblêdhelpmiddelen</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Oantal ljepblêden</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktyf</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktyf</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktyf</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Ynaktyf</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2719,6 +2675,16 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <string name="debug_drawer_tab_tools_tab_creation_tool_title">Helpmiddel foar it oanmeitsjen fan ljepblêden</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Oantal oan te meitsjen ljepblêden</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstfjild is leech</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Fier allinnich positive hiele getallen yn</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Fier in getal grutter dan nul yn</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Dit binne mear as it maksimale oantal ljepblêden (%1$s) dat yn ien bewurking oanmakke wurde kin</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Tafoegje oan aktive ljepblêden</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2735,11 +2701,11 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Privacyferklearring</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Yntsjinje</string> + <string name="micro_survey_submit_button_label">Yntsjinje</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Slute</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Slute</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Tank foar jo kommentaar!</string> + <string name="micro_survey_feedback_confirmation">Tank foar jo kommentaar!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Hiel tefreden</string> <!-- Option for likert scale --> @@ -2751,6 +2717,14 @@ Dizze analyze sil jo allinnich helpe om de beoardielingskwaliteit te beoardielen <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Hiel ûntefreden</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Enkête iepenje</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Enkête slute</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Slute</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Oanmeldingen</string> diff --git a/mobile/android/fenix/app/src/main/res/values-gl/strings.xml b/mobile/android/fenix/app/src/main/res/values-gl/strings.xml index 10e350b1c0..8f2f036b83 100644 --- a/mobile/android/fenix/app/src/main/res/values-gl/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-gl/strings.xml @@ -196,6 +196,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Complementos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensións</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Xestionar as extensións</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubre máis extensións</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Información da conta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -214,6 +218,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir na pestana normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Engadir á páxina de inicio</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Engadir á pantalla de inicio…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -225,9 +231,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducir a páxina</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Gardar na colección…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Gardar na colección</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Aberto en %1$s</string> @@ -279,6 +289,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Gardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Marcar esta páxina</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Gardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activa a vista de lector</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desactiva a vista de lector</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducir a páxina…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducido a %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Non hai extensións aquí</string> @@ -374,8 +402,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Política de privacidade de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Obtéña máis información no noso aviso de privacidade</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Encántanos telo seguro</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -584,7 +610,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Tradución</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tradución</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traducións</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Escollas de datos</string> <!-- Preference for data collection --> @@ -655,10 +683,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obrigatorio</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Le e cambia os datos do sitio web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar sitio web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos os sitios</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -783,8 +807,6 @@ <string name="preferences_sync_history">Historial</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificacións</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contrasinais</string> <!-- Preference for syncing tabs --> @@ -810,8 +832,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s en %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarxetas de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pago</string> <!-- Preference for syncing addresses --> @@ -827,6 +847,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Lapela de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s pestanas pechadas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver pestanas pechadas recentemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepcións</string> @@ -1748,12 +1776,8 @@ <string name="add_to_homescreen_description_2">Pode engadir facilmente este sitio web á pantalla de inicio do dispositivo para ter acceso instantáneo e navegar máis rápido cunha experiencia semellante á dunha aplicación.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificacións e contrasinais</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contrasinais</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Gardar Inicios de sesión e contrasinais</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Gardar contrasinais</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Preguntar para gardar</string> @@ -1768,46 +1792,28 @@ <string name="preferences_android_autofill">Completado automático noutras aplicacións</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Encher os nomes de usuario e os contrasinais noutras aplicacións do dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Engadir credenciais</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Engadir contrasinal</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar os inicios de sesión</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar contrasinais</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar as credenciais entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar os contrasinais entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificacións gardadas</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contrasinais gardados</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Os inicios de sesión que garde ou sincronice co %s aparecerán aquí.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Os contrasinais que garde ou sincronice con %s listaranse aquí. Todos os contrasinais que garde están cifrados.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Obteña máis información sobre Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Obteña máis información sobre Sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepcións</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Aquí mostraranse os inicios de sesión e os contrasinais que non se garden.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s non gardará os contrasinais dos sitios que aparecen aquí.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Non se gardarán os inicios de sesión e os contrasinais para estes sitios.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s non gardará os contrasinais destes sitios.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas as excepcións</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Buscar inicios de sesións</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Buscar contrasinais</string> <!-- The header for the site that a login is for --> @@ -1836,17 +1842,11 @@ <string name="saved_login_reveal_password">Mostrar contrasinal</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Agochar contrasinal</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquee para ver os seus inicios de sesión gardados</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloquear para ver os seus contrasinais gardados</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protexa os seus inicios de sesión e contrasinais</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Protexa os seus contrasinais gardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure un padrón de bloqueo de dispositivo, PIN ou contrasinal para protexer os accesos e contrasinais gardados de que non sexan accedidos se outra persoa ten o seu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configure un padrón de bloqueo do dispositivo, un PIN ou un contrasinal para protexer o acceso aos seus contrasinais gardados se outra persoa ten o seu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Máis tarde</string> @@ -1862,8 +1862,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nome (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Usado por última vez</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordenar o menú de inicio de sesión</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú de ordenar contrasinais</string> @@ -1873,16 +1871,10 @@ <string name="preferences_autofill">Completado automático</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Enderezos</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tarxetas de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pagamento</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gardar e completar automaticamente as tarxetas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Gardar e cubrir os métodos de pago</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Os datos están cifrados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s cifra todos os métodos de pago que garda</string> @@ -1890,12 +1882,8 @@ <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar as tarxetas entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar as tarxetas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Engadir unha tarxeta de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Engadir a tarxeta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Xestionar as tarxetas gardadas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Xestionar tarxetas</string> @@ -1904,12 +1892,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Xestionar enderezos</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Gardar e encher automaticamente enderezos</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Gardar e completar os enderezos</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inclúe información como números, correo electrónico e enderezos de envío</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inclúe números de teléfono e enderezos de correo electrónico</string> @@ -1933,8 +1917,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eliminar a tarxeta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Seguro de que quere eliminar esta tarxeta de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Eliminar a tarxeta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Eliminar</string> @@ -1946,23 +1928,15 @@ <string name="credit_cards_cancel_button">Cancelar</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tarxetas gardadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Introduza un número de tarxeta válido</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Introduza un número de tarxeta válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Cubra este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Engadir un nome</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloquee para ver as súas tarxetas gardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Asegure as súas tarxetas de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Protexa os seus métodos de pago gardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure un padrón de bloqueo de dispositivo, PIN ou contrasinal para evitar que outra persoa co seu dispositivo poida acceder a elas.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configure un padrón de bloqueo do dispositivo, un PIN ou un contrasinal para protexer o acceso aos seus métodos de pago gardados se outra persoa ten o seu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar agora</string> @@ -1970,8 +1944,6 @@ <string name="credit_cards_warning_dialog_later">Máis tarde</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquear o dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquee para empregar a información almacenada de tarxetas de crédito</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquee para usar os métodos de pago gardados</string> <!-- Title of the "Add address" screen --> @@ -1980,12 +1952,6 @@ <string name="addresses_edit_address">Editar enderezo</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Xestionar enderezos</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Nome</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segundo nome</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Apelidos</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nome</string> <!-- The header for the street address of an address --> @@ -2011,8 +1977,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Eliminar enderezo</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Seguro de que quere eliminar este enderezo?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Eliminar este enderezo?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Eliminar</string> @@ -2112,49 +2076,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Confirma que desexa eliminar este inicio de sesión?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Seguro que quere eliminar este contrasinal?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opcións de inicio de sesión</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opcións de contrasinal</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editábel para o enderezo web do inicio de sesión.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">O campo de texto editable para o enderezo do sitio web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editábel para o nome de usuario do inicio de sesión.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">O campo de texto editable para o nome de usuario.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editábel para o contrasinal do inicio de sesión.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">O campo de texto editable para o contrasinal.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Gardar os cambios para iniciar sesión.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Gardar cambios.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar contrasinal</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Engadir novas credenciais</string> <!-- The page title for adding new password. --> <string name="add_login_2">Engadir contrasinal</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Contrasinal obrigatorio</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Introduza un contrasinal</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Requírese un nome de usuario</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Introduza un nome de usuario</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Requírese un nome de servidor</string> @@ -2556,6 +2500,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Pechar a folla de traducións</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algunhas opcións de configuración non están dispoñibles temporalmente.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traducións</string> @@ -2579,6 +2526,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Seleccionar un idioma para xestionar as preferencias de «traducir sempre» e «nunca traducir».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Non se puideron cargar os idiomas. Volve a comprobar máis tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ofrecer traducción (predeterminado)</string> @@ -2602,6 +2552,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Retirar %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Non se puideron cargar os sitios. Volve a comprobar máis tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Eliminar %1$s?</string> @@ -2679,13 +2631,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Retroceder no historial</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abre o caixón de depuración</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Ferramentas de lapelas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Número de lapelas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Activo</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Activo</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Activo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactivo</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2696,6 +2653,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Ferramenta de creación de lapelas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Cantidade de lapelas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">O campo de texto está baleiro</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Introduce só números enteiros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Introduce un número maior que cero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Superouse o número máximo de pestanas (%1$s) que se poden xerar nunha soa operación</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Engadir ás lapelas activas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2712,11 +2679,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Política de privacidade</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Pechar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Pechar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Grazas pola súa opinión</string> + <string name="micro_survey_feedback_confirmation">Grazas pola súa opinión</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Moi satisfeito</string> <!-- Option for likert scale --> @@ -2728,6 +2695,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Moi insatisfeito</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Enquisa aberta</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Pecha enquisa</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Pechar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Identificacións</string> diff --git a/mobile/android/fenix/app/src/main/res/values-gn/strings.xml b/mobile/android/fenix/app/src/main/res/values-gn/strings.xml index a83bce8a53..ae524cde42 100644 --- a/mobile/android/fenix/app/src/main/res/values-gn/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-gn/strings.xml @@ -203,6 +203,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Moĩmbaha</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Jepysokue</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Eñangareko jepysokuére</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Ejuhuvéta jepysokue</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Mba’ete marandu</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -222,6 +226,8 @@ <string name="browser_menu_open_in_regular_tab">Embojuruja tendayke</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Embojuaju mba’erechaha ñepyrũgua</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Embojuaju mba’erechaha ñepyrũgua…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Mohenda</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -233,9 +239,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Emoñe’ẽasa kuatiarogue</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Eñongatu mbyatyhápe…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Eñongatu mbyatyhápe</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Moherakuã</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Moherakuã…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Embojuruja %1$s-pe</string> @@ -289,6 +299,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Ñongatu</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Emongurusu ko kuatiarogue</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Embosako’i techaukaha</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Eñongatu PDF ramo…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Emyandy moñe’ẽha jehecha</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Embogue moñe’ẽha jehecha</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Emoñe’ẽasa kuatiarogue…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s-pe oñemoñe’ẽasapyre</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Mbokuatia…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ndaipóri jepysokue ápe</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox marandu’i ñemigua</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Eikuaave ore marandu’i ñemigua rupive</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Rovy’ã eimére tekorosãme</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -598,7 +624,9 @@ <!-- Preference for language --> <string name="preferences_language">Ñe’ẽ</string> <!-- Preference for translation --> - <string name="preferences_translation">Ñemoñe’ẽasa</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Ñemoñe’ẽasa</string> + <!-- Preference for translations --> + <string name="preferences_translations">Ñemoñe’ẽasa</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Mba’ekuaarã jeporavo</string> <!-- Preference for data collection --> @@ -672,10 +700,6 @@ <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Jeporavorã</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Emoñe’ẽ ha emoambue ñanduti renda mba’ekuaarã</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Emboguete ñanduti renda</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Emoneĩ opaite tendápe g̃uarã</string> @@ -807,8 +831,6 @@ <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Techaukaha</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Tembiapo ñepyrũ</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Ñe’ẽñemi</string> <!-- Preference for syncing tabs --> @@ -835,8 +857,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s %2$s %3$s-pe</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kuatia’atã ñemurã</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Mba’éicha ehepyme’ẽta</string> <!-- Preference for syncing addresses --> @@ -852,6 +872,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tendayke %s mba’e</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tendayke mbotypyre: %2$d-pe</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ehecha tendayke oñembotyramóva</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Oĩ’ỹva</string> @@ -1804,12 +1832,8 @@ <string name="add_to_homescreen_description_2">Ikatu embojuaju ko ñanduti renda ne mba’e’oka mba’erechaha ñepyrũgua rehe eike hag̃ua ha eikundaha pya’eve, peteĩ tembiporu’ícharamo.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Tembiapo ñepyrũ ha ñe’ẽñemi</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Ñe’ẽñemi</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Eñongatu tembiapo ñepyrũ ha ñe’ẽñemi</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Eñongatu ñe’ẽñemi</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Ejerure ñemoneĩ eñongatu hag̃ua</string> @@ -1826,46 +1850,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Emoĩmba ha eñongatu poruhára réra ha ñe’ẽñemi ambue tembiporu’ípe ne mba’e’oka pegua.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuaju jeike</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Embojuaju ñe’ẽñemi</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuehe tembiapo ñepyrũ</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Embojuehe ñe’ẽñemi</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuehe tembiapo ñepyrũ mba’e’oka pa’ũme</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Embojuehe ñe’ẽñemi mba’e’oka pa’ũme</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Tembiapo ñepyrũ ñongatupyre</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Ñe’ẽñemi ñongatupyre</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Ko’ápe ojehecháta tembiapo ñepyrũ eñongatu térã embojuehéva %s ndive.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Umi ñe’ẽñemi eñongatu térã embojuehéva %s ndive ojehecháta ko’ápe. Opaite ñe’ẽñemi eñongatúva ipapapýta.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Eikuaave Sync rehegua</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Eikuaave ñembojuehe rehegua</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Oĩ’ỹva</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Ápe ojehecháta tembiapo ñepyrũ ha ñe’ẽñemi oñeñongatu’ỹva.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s noñongatúi ñe’ẽñemi tendakuéra hysýiva ko’ápe g̃uarãme.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Noñeñongatumo’ãi tembiapo ñepyrũ ha ñe’ẽñemi ko’ã tendápe g̃uarã.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s noñongatúi ñe’ẽñemi ko’ã tendápe g̃uarã.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Emboguete opaite oĩ’ỹva</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Eheka tembiapo ñepyrũ</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Eheka ñe’ẽñemi</string> <!-- The header for the site that a login is for --> @@ -1894,17 +1899,11 @@ <string name="saved_login_reveal_password">Ehechauka ñe’ẽñemi</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Emokañy ñe’ẽñemi</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Emyandyjey ehecha hag̃ua ne rembiapo ñepyrũ ñongatupyre</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Embojuruja ehecha hag̃ua ñe’ẽñemi ñongatupyre</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Erekokuaa nde poruhára ha ñe’ẽñemi</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Emo’ã ne ñe’ẽñemi ñongatupyre</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Emboheko pe patrõ jokoháva mba’e’oka pegua, PIN térã ñe’ẽñemi emo’ã hag̃ua nde poruhára ha ñe’ẽñemi ñongatupyrépe jeike ambue orekórõ ne mba’e’oka.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Emboheko mba’e’oka jekokoha rape, PIN térã ñe’ẽñemi emo’ã hag̃ua ñe’ẽñemi ñongatupyre ha emboyke ani hag̃ua oike ambuéva orekórõ ne mba’e’oka.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Upéi</string> @@ -1923,8 +1922,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Téra (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Jejuru paha</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Emoĩporã poravorã tembiapo ñepyrũgua</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Emoĩporã ñe’ẽñemi poravorã</string> @@ -1934,43 +1931,29 @@ <string name="preferences_autofill">Myanyhẽ jehegui</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Kundaharape</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kuatia’atã ñemurã</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Mba’éicha ehepyme’ẽta</string> - <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Eñongatu ha emyanyhẽ kuatia’atã</string> <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Eñongatu ha emyanyhẽ mba’éicha ehepyme’ẽta</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Mba’ekuaarã ipapapypa</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s ombopapapypa ne ñehepyme’ẽrã ñongatupyre</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Embojuehe kuatia’atã mba’e’oka pa’ũme</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Embojuehe kuatia’atã</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuaju kuatia’atã ñemurã</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Embojuaju kuatia’atã</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Eñangareko kuatia’atã ñongatupyrére</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Eñangareko kuatia’atã</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Embojuaju kundaharape</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Kundaharape ñangareko</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Eñongatu ha emyanyhẽ kundaharape</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Eñongatu ha emyanyhẽ kundaharape</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Emoĩ marandu ipapapy, ñanduti veve ha kundaharape ñemondorãva</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Oike pumbyry papapy ha ñanduti veve kundaharape</string> @@ -1994,8 +1977,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Emboguete kuatia’atã</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Emboguesépa añetehápe ko kuatia’atã ñemurã?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">¿Emboguete kuatia’atã?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Mboguete</string> @@ -2009,24 +1990,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Kuatia’atã ñongatupyre</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ikatúpiko ehai kuatia’atã ñemurã papapy oikóva</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Emoinge kuatia’atã papapy oikóva</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ikatúpiko emyanyhẽ ko kora</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Embojuaju téra</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Embojuruja ehecha hag̃ua kuatia’atã ñongatupyre</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Emohekorosã nde kuatia’atã ñemurã</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Emo’ã ne ñehepyme’ẽrã ñongatupyre</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Emboheko peteĩ jekokoha rape, PIN térã ñe’ẽñemi emo’ã hag̃ua nde kuatia’atã ñongatupyre ambue oikeséramo ne mba’e’okápe.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Emboheko mba’e’oka jekokoha rape, PIN térã ñe’ẽñemi emo’ã hag̃ua ñehepyme’ẽrã ñongatupyre ha emboyke ani hag̃ua oike ambuéva orekórõ ne mba’e’oka.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Emboheko ko’ág̃a</string> @@ -2035,9 +2007,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Embojuruja ne mba’e’oka</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuruja eiporu hag̃ua kuatia’atã ñemurã marandu mbyatypyre</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Embojuruja eiporu hag̃ua ne ñehepyme’ẽrã ñongatupyre</string> <!-- Title of the "Add address" screen --> @@ -2046,12 +2015,6 @@ <string name="addresses_edit_address">Embosako’i kundaharape</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Kundaharape ñangareko</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Téra Peteĩha</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Téra Mokõiha</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Terajoapy</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Téra</string> <!-- The header for the street address of an address --> @@ -2078,8 +2041,6 @@ <string name="addressess_delete_address_button">Embogue kundaharape</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Añetehápepa remboguese ko kundaharape?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">¿Embogue kundaharape?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Mboguete</string> @@ -2179,49 +2140,29 @@ <string name="login_menu_delete_button">Mboguete</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Mbosako’i</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">¿Emboguese añetehápe ko tembiapo ñepyrũ?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Emboguesetépa añetehápe ko ñe’ẽñemi</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Mboguete</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Heja</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Jeporavorã tembiapo ñepyrũgua</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Ñe’ẽñemi jeporavorã</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Moñe’ẽha kora isako’ikuaáva ñanduti kundaharape rembiapo ñepyrũme.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Moñe’ẽrã kora ehaikuaáva kundaharape ñanduti rendápe g̃uarã.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Moñe’ẽha kora isako’ikuaáva poruhára réra rembiapo ñepyrũme.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Moñe’ẽrã kora ehaikuaáva poruhára rérape g̃uarã.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Moñe’ẽha kora isako’ikuaáva ñe’ẽñemi rembiapo ñepyrũme.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Moñe’ẽrã kora ehaikuaáva ñe’ẽñemíme g̃uarã.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Eñongatu moambue tembiapo ñepyrũme.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Moambue ñongatu.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Mbosako’i</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Embosako’i ñe’ẽñemi</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Embojuaju terarenda pyahu</string> <!-- The page title for adding new password. --> <string name="add_login_2">Embojuaju ñe’ẽñemi</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Tekotevẽ ñe’ẽñemi</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Emoinge ñe’ẽñemi</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Poruhára réra jerurepyre</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Ehai poruhára réra</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Mohendahavusu réra jerurepyre</string> @@ -2573,6 +2514,8 @@ <string name="translations_bottom_sheet_negative_button">Ani ko’ág̃a</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Ehechauka ypykuéva</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Oñemyanyhẽ kuatiarogue oñemoñe’ẽasa’ỹre</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Oĩma</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2632,6 +2575,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Emboty ñe’ẽasaha rogue</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Ñemoĩporãha ndojeporukuaáiva ko’ag̃aite.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Ñemoñe’ẽasa</string> @@ -2657,6 +2603,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Eiporavo ñe’ẽ eñangareko hag̃ua umi erohoryvéva “emoñe’ẽasameme” y “ani emoñe’ẽasa”.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Noñemyanyhẽkuaái ñe’ẽnguéra. Eha’ãjey ag̃amieve.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Eikuave’ẽ ñe’ẽasa (ypyguáva)</string> @@ -2680,6 +2629,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Emboguete %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Noñemyanyhẽkuaái tendakuéra. Eha’ãjey ag̃ave.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">¿Emboguete %1$s?</string> @@ -2757,13 +2708,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Eikundaha tapykuévo</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Embojuruja kahõ mopotĩha</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tendayke rembiporu</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Tendayke papapy</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Myandy</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Myandy</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Myandy</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Jokopyre</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2774,6 +2730,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Tembiporu tendayke moheñoiha</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Mboýpa emoheñóita tendayke</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Moñe’ẽrã kora inandi</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Emoinge papapy entero positivo año</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Emoinge pateĩ papapy sérogui tuichavéva</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Ohasáma pe tendayke oñekotevẽva (%1$s) ikatúva oñemongu’e peteĩjeýpe</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Embojuaju tendayke oikóva</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2790,11 +2756,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Marandu’i ñemiguáva</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Mondo</string> + <string name="micro_survey_submit_button_label">Mondo</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Mboty</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Mboty</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">¡Aguyje nde jehaipyrére!</string> + <string name="micro_survey_feedback_confirmation">¡Aguyje nde jehaipyrére!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Avy’aiterei</string> <!-- Option for likert scale --> @@ -2807,6 +2773,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Nachembovy’ái</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Embojuruja ñeporandu</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Emboty ñeporandu</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Mboty</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Tembiapo moñepyrũ</string> diff --git a/mobile/android/fenix/app/src/main/res/values-hr/strings.xml b/mobile/android/fenix/app/src/main/res/values-hr/strings.xml index d1834444f2..a89e528b94 100644 --- a/mobile/android/fenix/app/src/main/res/values-hr/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-hr/strings.xml @@ -2,7 +2,7 @@ <resources xmlns:tools="http://schemas.android.com/tools" xmlns:moz="http://mozac.org/tools"> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> - <string name="app_name_private_5">Privatni %s</string> + <string name="app_name_private_5">Privatne %s</string> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> <string name="app_name_private_4">%s (privatno)</string> @@ -49,12 +49,12 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nedavno spremljeno</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nedavno spremljeno</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Prikaži sve spremljene zabilješke</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Prikaži sve spremljene zabilješke</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Ukloni</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Ukloni</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s proizvodi Mozilla.</string> @@ -144,8 +144,8 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Nova privatna kartica</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Prečac za lozinke</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Prečac za lozinke</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -187,11 +187,11 @@ <!-- Content description (not visible, for screen readers etc.): Stop loading current website --> <string name="browser_menu_stop">Zaustavi</string> <!-- Browser menu button that opens the addon manager --> - <string name="browser_menu_add_ons">Dodaci</string> + <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Dodaci</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informacije računa</string> <!-- Text displayed when there are no add-ons to be shown --> - <string name="no_add_ons">Ovdje nema dodataka</string> + <string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ovdje nema dodataka</string> <!-- Browser menu button that sends a user to help articles --> <string name="browser_menu_help">Pomoć</string> <!-- Browser menu button that sends a to a the what's new article --> @@ -207,7 +207,7 @@ <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Dodaj na početni ekran</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> - <string name="browser_menu_install_on_homescreen">Instaliraj</string> + <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instaliraj</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Ponovna sinkronizacija</string> <!-- Browser menu button that opens the find in page menu --> @@ -313,22 +313,22 @@ <!-- Notification pre-permission dialog --> <!-- Enable notification pre permission dialog title The first parameter is the name of the app defined in app_name (for example: Fenix) --> - <string name="onboarding_home_enable_notifications_title">Obavijesti vam pomažu da učinite više s %s</string> + <string name="onboarding_home_enable_notifications_title" moz:removedIn="124" tools:ignore="UnusedResources">Obavijesti vam pomažu da učinite više s %s</string> <!-- Enable notification pre permission dialog description with rationale The first parameter is the name of the app defined in app_name (for example: Fenix) --> - <string name="onboarding_home_enable_notifications_description">Sinkronizirajte svoje kartice između uređaja, upravljajte preuzimanjima, dobivajte savjete o tome kako najbolje iskoristiti %s zaštitu privatnosti i još mnogo toga.</string> + <string name="onboarding_home_enable_notifications_description" moz:removedIn="124" tools:ignore="UnusedResources">Sinkronizirajte svoje kartice između uređaja, upravljajte preuzimanjima, dobivajte savjete o tome kako najbolje iskoristiti %s zaštitu privatnosti i još mnogo toga.</string> <!-- Text for the button to request notification permission on the device --> - <string name="onboarding_home_enable_notifications_positive_button">Nastavi</string> + <string name="onboarding_home_enable_notifications_positive_button" moz:removedIn="124" tools:ignore="UnusedResources">Nastavi</string> <!-- Text for the button to not request notification permission on the device and dismiss the dialog --> - <string name="onboarding_home_enable_notifications_negative_button">Ne sada</string> + <string name="onboarding_home_enable_notifications_negative_button" moz:removedIn="124" tools:ignore="UnusedResources">Ne sada</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Volimo vas čuvati</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> - <string name="juno_onboarding_default_browser_description_nimbus_2">Naš neprofitni preglednik pomaže spriječiti tvrtke da vas tajno prate na webu.\n\nSaznajte više u našoj obavijesti o privatnosti.</string> + <string name="juno_onboarding_default_browser_description_nimbus_2" moz:RemovedIn="124" tools:ignore="UnusedResources">Naš neprofitni preglednik pomaže spriječiti tvrtke da vas tajno prate na webu.\n\nSaznajte više u našoj obavijesti o privatnosti.</string> <!-- Text for the link to the privacy notice webpage for set as firefox default browser screen. This is part of the string with the key "juno_onboarding_default_browser_description". --> - <string name="juno_onboarding_default_browser_description_link_text" tools:ignore="UnusedResources">politika privatnosti</string> + <string name="juno_onboarding_default_browser_description_link_text" moz:RemovedIn="124" tools:ignore="UnusedResources">politika privatnosti</string> <!-- Text for the button to set firefox as default browser on the device --> <string name="juno_onboarding_default_browser_positive_button" tools:ignore="UnusedResources">Postavi kao zadani preglednik</string> <!-- Text for the button dismiss the screen and move on with the flow --> @@ -511,7 +511,7 @@ <string name="quit_application">Zatvaranje aplikacije radi primjene promjena…</string> <!-- Preference for add_ons --> - <string name="preferences_addons">Dodaci</string> + <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Dodaci</string> <!-- Preference for notifications --> <string name="preferences_notifications">Obavijesti</string> @@ -523,7 +523,7 @@ <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> - <string name="preferences_customize_amo_collection">Prilagođena kolekcija dodataka</string> + <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Prilagođena kolekcija dodataka</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">U redu</string> <!-- Button caption to abort the add-on collection configuration --> @@ -533,13 +533,13 @@ <!-- Hint displayed on input field for custom collection user ID--> <string name="customize_addon_collection_user_hint">Vlasnik kolekcije (ID korisnika)</string> <!-- Toast shown after confirming the custom add-on collection configuration --> - <string name="toast_customize_addon_collection_done">Izmijenjena je kolekcija dodataka. Napuštanje aplikacije za primjenu izmjena…</string> + <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Izmijenjena je kolekcija dodataka. Napuštanje aplikacije za primjenu izmjena…</string> <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Vrati se natrag</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Nedavne zabilješke</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Nedavne zabilješke</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nedavno posjećeno</string> @@ -587,15 +587,15 @@ <!-- Wallpaper onboarding dialog learn more button text. The button navigates to the wallpaper settings screen. --> <string name="wallpapers_onboarding_dialog_explore_more_button_text">Istražite više pozadina</string> - <!-- Add-on process crash dialog to user --> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> - <string name="addon_process_crash_dialog_title" tools:ignore="UnusedResources">Dodaci su privremeno onemogućeni</string> + <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Dodaci su privremeno onemogućeni</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> - <string name="addon_process_crash_dialog_message" tools:ignore="UnusedResources">Jedan ili više dodataka prestalo je raditi, što je vaš sustav učinilo nestabilnim. %1$s je bezuspješno pokušao ponovno pokrenuti dodatke.\n\nDodaci se neće ponovno pokrenuti tijekom vaše trenutačne sesije.\n\nUklanjanje ili onemogućavanje dodataka može riješiti ovaj problem.</string> + <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Jedan ili više dodataka prestalo je raditi, što je vaš sustav učinilo nestabilnim. %1$s je bezuspješno pokušao ponovno pokrenuti dodatke.\n\nDodaci se neće ponovno pokrenuti tijekom vaše trenutačne sesije.\n\nUklanjanje ili onemogućavanje dodataka može riješiti ovaj problem.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> - <string name="addon_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Pokušajte ponovno pokrenuti dodatke</string> + <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Pokušajte ponovno pokrenuti dodatke</string> <!-- The user will continue with all add-ons disabled --> - <string name="addon_process_crash_dialog_disable_addons_button_text" tools:ignore="UnusedResources">Nastavite s onemogućenim dodacima</string> + <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Nastavite s onemogućenim dodacima</string> <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> @@ -608,8 +608,6 @@ <string name="preferences_sync_history">Povijest</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Zabilješke</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins">Prijave</string> <!-- Preference for syncing tabs --> <string name="preferences_sync_tabs_2">Otvorene kartice</string> <!-- Preference for signing out --> @@ -635,8 +633,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s na %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards">Kreditne kartice</string> <!-- Preference for syncing addresses --> <string name="preferences_sync_address">Adrese</string> @@ -1571,10 +1567,6 @@ <!-- Describes the add to homescreen functionality --> <string name="add_to_homescreen_description_2">Ovu stranicu lako možeš dodati na početni zaslon svog uređaja za brže pretraživanje s iskustvom sličnim aplikacijama.</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords">Prijave i lozinke</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins">Spremi prijave i lozinke</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Pitaj treba li se spremiti</string> <!-- Preference option for never saving passwords in Fenix --> @@ -1588,30 +1580,11 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Ispuni korisnička imena i lozinke u drugim aplikacijama na tvom uređaju.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login">Dodaj prijavu</string> - - <!-- Preference for syncing saved logins in Fenix --> - <string name="preferences_passwords_sync_logins">Sinkroniziraj prijave</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices">Sinkroniziraj prijave na svim uređajima</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins">Spremljene prijave</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text">Ovdje će se prikazati prijave koje spremaš ili sinkroniziraš s programom %s.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link">Saznaj više o sinkronizaciji.</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Iznimke</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty">Ovdje će se prikazati prijave i lozinke koje nisu spremljene.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description">Prijave i lozinke neće se spremiti za te web-stanice.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Obriši sve iznimke</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search">Traži prijave</string> <!-- The header for the site that a login is for --> <string name="preferences_passwords_saved_logins_site">Stranica</string> <!-- The header for the username for a login --> @@ -1638,13 +1611,7 @@ <string name="saved_login_reveal_password">Prikaži lozinku</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Sakrij lozinku</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message">Otključaj za pregled tvojih spremljenih prijava</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title">Osiguraj svoje prijave i lozinke</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message">Postavi način za zaključavanje uređaja, PIN-a ili lozinke, kako bi se spriječio pristup spremljenim prijavama i lozinkama, kad netko drugi radi s tvojim uređajem.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Kasnije</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1661,40 +1628,22 @@ <string name="saved_logins_sort_strategy_alphabetically">Naziv (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Zadnja upotreba</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description">Izbornik sortiranja prijava</string> <!-- Autofill --> <!-- Preference and title for managing the autofill settings --> <string name="preferences_autofill">Automatsko ispunjavanje</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adrese</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards">Kreditne kartice</string> - <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards">Spremi i automatski ispuni polja kartice</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary">Podaci su šifrirani</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sinkroniziraj kartice na uređajima</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sinkroniziraj kartice</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card">Dodaj kreditnu karticu</string> - - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards">Upravljaj spremljenim karticama</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Dodaj adresu</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Upravljaj adresama</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses">Spremi i automatski ispuni adrese</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary">Uključi podatke kao što su brojevi, e-pošta i adresa dostave</string> - <!-- Title of the "Add card" screen --> <string name="credit_cards_add_card">Dodaj karticu</string> <!-- Title of the "Edit card" screen --> @@ -1713,8 +1662,6 @@ <string name="credit_cards_menu_delete_card">Izbriši karticu</string> <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Izbriši karticu</string> - <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation">Jeste li sigurni da želite obrisati ovu karticu?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Izbriši</string> <!-- The title for the "Save" menu item for saving a credit card --> @@ -1727,17 +1674,8 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Spremljene kartice</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message">Unesi važeći broj kreditne kartice</string> - - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message">Molimo ispuni ovo polje</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Otključaj za prikaz spremljenih kreditnih kartica</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title">Osiguraj svoje kreditne kartice</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message">Postavi uzorak za otključavanje uređaja, PIN ili lozinku da bi tvoje spremljene kreditne kartice bile zaštićene od neovlaštenog pristupa drugih osoba.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Postavi sada</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> @@ -1745,21 +1683,12 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Otključaj svoj uređaj</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message">Otključ za korištenje spremljenih podataka o kreditnim karticama</string> - <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Dodaj adresu</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Uredi adresu</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Upravljaj adresama</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name">Ime</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name">Srednje ime</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name">Prezime</string> <!-- The header for the street address of an address --> <string name="addresses_street_address">Ulica</string> <!-- The header for the city of an address --> @@ -1783,8 +1712,6 @@ <string name="addresses_cancel_button">Odustani</string> <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Izbriši adresu</string> - <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message">Stvano želiš izbrisati ovu adresu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Izbriši</string> <!-- The text for the negative button on "Delete address" dialog --> @@ -1883,30 +1810,10 @@ <string name="login_menu_delete_button">Izbriši</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Uredi</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation">Sigurno izbrisati ovu prijavu?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Izbriši</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Odustani</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu">Opcije prijave</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description">Tekstualno polje za web adresu prijave koje se može uređivati.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description">Tekstualno polje za korisničko ime koje se može uređivati.</string> - <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description">Tekstualno polje za lozinku koje se može uređivati.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login">Spremi izmjene prijave.</string> - <!-- The page title for editing a saved login. --> - <string name="edit">Uređivanje</string> - <!-- The page title for adding new login. --> - <string name="add_login">Dodaj novu prijavu</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required">Potrebna je lozinka</string> - <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required">Korisničko ime je potrebno</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Domena je potrebna</string> <!-- Voice search button content description --> @@ -2004,7 +1911,7 @@ <!-- Title for search suggestions when the default search suggestion engine is anything other than Google. The first parameter is default search engine name. --> <string name="other_default_search_engine_suggestion_header">%s pretraga</string> - <!-- Default browser experiment --> + <!-- Default browser card text --> <string name="default_browser_experiment_card_text">Postavi automatsko otvaranje poveznica web stranica, e-pošte i poruka u Firefoxu.</string> <!-- Content description for close button in collection placeholder. --> @@ -2014,7 +1921,7 @@ <string name="radio_preference_info_content_description">Klikni za više informacija</string> <!-- Content description for the action bar "up" button --> - <string name="action_bar_up_description">Navigiraj gore</string> + <string name="action_bar_up_description" moz:removedIn="124" tools:ignore="UnusedResources">Navigiraj gore</string> <!-- Content description for privacy content close button --> <string name="privacy_content_close_button_content_description">Zatvori</string> @@ -2056,4 +1963,6 @@ <!-- Translations feature--> + <!-- Micro survey --> + </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-hsb/strings.xml b/mobile/android/fenix/app/src/main/res/values-hsb/strings.xml index b366c59fcd..561485718b 100644 --- a/mobile/android/fenix/app/src/main/res/values-hsb/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-hsb/strings.xml @@ -200,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Přidatki</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Rozšěrjenja</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Rozšěrjenja rjadować</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Dalše rozšěrjenja namakać</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontowe informacije</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -218,6 +222,8 @@ <string name="browser_menu_open_in_regular_tab">W normalnym rajtarku wočinić</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Startowej wobrazowce přidać</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Startowej wobrazowce přidać…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalować</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -229,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Stronu přełožić</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Do zběrki składować…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Do zběrki składować</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Dźělić</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Dźělić…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">W %1$s wočinić</string> @@ -284,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Składować</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Tutu stronu jako zapołožku składować</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Zapołožku wobdźěłać</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Jako PDF składować…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Čitanski napohlad zmóžnić</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Čitanski napohlad znjemóžnić</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Stronu přełožić…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Přełoženy do rěče %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Ćišćeć…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Žane rozšěrjenja tu</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Zdźělenka priwatnosće Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Zhońće wjace w našej zdźělence priwatnosće</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Škitamy was rady</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -588,7 +614,9 @@ <!-- Preference for language --> <string name="preferences_language">Rěč</string> <!-- Preference for translation --> - <string name="preferences_translation">Přełožk</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Přełožk</string> + <!-- Preference for translations --> + <string name="preferences_translations">Přełožki</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Datowe wuběry</string> <!-- Preference for data collection --> @@ -661,10 +689,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Trěbny</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Na přeće</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Websydłowe daty čitać a změnić</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Websydło zhašeć</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Za wšě sydła dowolić</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -791,8 +815,6 @@ <string name="preferences_sync_history">Historija</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Zapołožki</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Hesła</string> <!-- Preference for syncing tabs --> @@ -820,8 +842,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s wot %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne karty</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Płaćenske metody</string> <!-- Preference for syncing addresses --> @@ -837,6 +857,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Rajtark z %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Rajtarki %1$s začinjene: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Runje začinjene rajtarki pokazać</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Wuwzaća</string> @@ -1769,12 +1797,8 @@ <string name="add_to_homescreen_description_2">Móžeće startowej wobrazowce swojeho grata tute websydło lochko přidać, zo byšće direktny přistup měł a spěšnišo z dožiwjenjom nałoženja přehladował.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja a hesła</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Hesła</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja a hesła składować</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Hesła składować</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Před składowanjom so prašeć</string> @@ -1790,46 +1814,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Wužiwarske mjena a hesła w druhich nałoženjach na wašim graće zasadźić.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenje přidać</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Hesło přidać</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja synchronizować</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Hesła synchronizować</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja mjez gratami synchronizować</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Hesła přez graty synchronizować</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Składowane přizjewjenja</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Składowane hesła</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja, kotrež składujeće abo z %s synchronizujeće, so tu pokazaja.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Hesła, kotrež składujeće abo z %s synchronizujeće, so tu nalistuja. Wšě hesła, kotrež składujeće, so zaklučuja.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Zhońće wjace wo Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Zhońće wjace wo sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Wuwzaća</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja a hesła, kotrež so njeskładuja, so tu pokazaja.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s hesła za sydła njeskładuje, kotrež su tu nalistowane.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja a hesła so za tute sydła njeskładuja.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s hesła za tute sydła njeskładuje.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Wšě wuwzaća zhašeć</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenja pytać</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Hesła přepytać</string> <!-- The header for the site that a login is for --> @@ -1858,17 +1863,11 @@ <string name="saved_login_reveal_password">Hesło pokazać</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Hesło schować</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Za zwobraznjenje wašich składowanych přizjewjenjow wotewrěć</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Za zwobraznjenje wašich składowanych hesłow wotewrěć</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zawěsćće swoje přizjewjenja a hesła</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Zawěsćće swoje składowane hesła</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastajće gratowy zawrjenski muster, PIN abo hesło, zo byšće přistupej k swojim składowanym přizjewjenjam a hesłam zadźěwał, jeli něchtó druhi waš grat ma.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Nastajće gratowy zawrjenski muster, PIN abo hesło, zo byšće přistupej k swojim składowanym hesłam zadźěwał, jeli něchtó druhi waš grat ma.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Pozdźišo</string> @@ -1887,9 +1886,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Poslednim wužiću</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Meni přizjewjenskich datow sortěrować</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Meni „Hesła sortěrować“</string> @@ -1898,41 +1894,27 @@ <string name="preferences_autofill">Awtomatisce wupjelnić</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresy</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne karty</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Płaćenske metody</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Karty składować a awtomatisce wupjelnić</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Płaćenske metody składować a wupjelnić</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Daty su zaklučowane</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s wšě płaćenske metody zaklučuje, kotrež składujeće</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Karty přez graty synchronizować</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Karty synchronizować</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditnu kartu přidać</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Kartu přidać</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Składowane karty rjadować</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Karty rjadować</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adresu přidać</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adresy rjadować</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Adresy składować a awtomatisce wupjelnić</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adresy składować a wupjelnić</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Informacije kaž ličby, e-mejlowe a rozsyłanske adresy zapřijeć</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Wobsahuje telefonowe čisła a e-mejlowe adresy</string> @@ -1956,8 +1938,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kartu zhašeć</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Chceće woprawdźe tutu kreditnu kartu zhašeć?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kartu zhašeć?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Zhašeć</string> @@ -1971,24 +1951,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Składowane karty</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Prošu zapodajće płaćiwe čisło kreditneje karty</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Zapodajće płaćiwe kartowe čisło</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Prošu wupjelńće tute polo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Přidajće mjeno</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Za zwobraznjenje wašich składowanych kartow wotewrěć</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Waše kreditne karty zawěsćić</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Zawěsćće swoje składowane płaćenske metody</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastajće gratowy zawrjenski muster, PIN abo hesło, zo byšće přistupej k swojim składowanym kreditnym kartam zadźěwał, jeli něchtó druhi waš grat ma.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Nastajće gratowy zawrjenski muster, PIN abo hesło, zo byšće přistupej k swojim składowanym płácenskim metodam zadźěwał, jeli něchtó druhi waš grat ma.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Nětko konfigurować</string> @@ -1997,9 +1968,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Wotewriće swój grat</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Blokowanje zběhnyć, zo bychu so składowane informacije kreditneje karty wužiwali</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Wotewrěć, zo byšće składowane płaćenske metody wužiwał</string> <!-- Title of the "Add address" screen --> @@ -2008,12 +1976,6 @@ <string name="addresses_edit_address">Adresu wobdźěłać</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adresy rjadować</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Předmjeno</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Druhe předmjeno</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Swójbne mjeno</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Mjeno</string> <!-- The header for the street address of an address --> @@ -2040,8 +2002,6 @@ <string name="addressess_delete_address_button">Adresu zhašeć</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Chceće woprawdźe tutu adresu zhašeć?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Tutu adresu zhašeć?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Zhašeć</string> @@ -2140,49 +2100,29 @@ <string name="login_menu_delete_button">Zhašeć</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Wobdźěłać</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Chceće woprawdźe tute přizjewjenje zhašeć?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Chceće woprawdźe tute hesło zhašeć?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Zhašeć</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Přetorhnyć</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Přizjewjenske nastajenja</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Hesłowe nastajenja</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobdźěłujomne tekstowe polo za webadresu přizjewjenja.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Wobdźěłujomne tekstowe polo za adresu websydła.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobdźěłujomne tekstowe polo za wužiwarske mjeno přizjewjenja.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Wobdźěłujomne tekstowe polo za wužiwarske mjeno.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobdźěłujomne tekstowe polo za hesło přizjewjenja.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Wobdźěłujomne tekstowe polo za hesło.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Změny přizjewjenja składować</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Změny składować.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Wobdźěłać</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Hesło wobdźěłać</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Nowe přizjewjenje přidać</string> <!-- The page title for adding new password. --> <string name="add_login_2">Hesło přidać</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesło trěbne</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Hesło zapodać</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Wužiwarske mjeno trěbne</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Wužiwarske mjeno zapodać</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostmjeno trěbne</string> @@ -2590,6 +2530,9 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Stronu Přełožki začinić</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Někotre nastajenja na chwilu k dispoziciji njejsu.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Přełožki</string> @@ -2613,6 +2556,9 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Wubjerće rěč, zo byšće nastajeni „přeco přełožić“ a „ženje njepřełožić“ rjadował.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Rěče njedachu so začitać. Prošu spytajće pozdźišo hišće raz.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Přełožk poskićić (standard)</string> @@ -2636,6 +2582,8 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s wotstronić</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Sydła njedachu so začitać. Prošu spytajće pozdźišo hišće raz.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s zhašeć?</string> @@ -2713,13 +2661,18 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Wróćo nawigěrować</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Debug drawer wočinić</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Rajtarkowe nastroje</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Ličba rajtarkow</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiwny</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiwny</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiwny</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Njeaktiwny</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2730,6 +2683,16 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <string name="debug_drawer_tab_tools_tab_creation_tool_title">Nastroj za wutworjenje rajtarkow</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Ličba rajtarkow, kotrež so maja wutworić</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstowe polo je prózdne</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Prošu zapodajće jenož pozitiwne cyłe ličby</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Prošu zapodajće ličbu, kotraž je wjetša hač nula</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Maksimalna ličba rajtarkow (%1$s), kotrež dadźa so w jednej operaciji generěrować, je překročena</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Aktiwnym rajtarkam přidać</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2746,11 +2709,11 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Zdźělenka priwatnosće</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Wotpósłać</string> + <string name="micro_survey_submit_button_label">Wotpósłać</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Začinić</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Začinić</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Dźakujemy so za waš komentar!</string> + <string name="micro_survey_feedback_confirmation">Dźakujemy so za waš komentar!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Jara spokojny</string> <!-- Option for likert scale --> @@ -2762,6 +2725,14 @@ To budźe jenož pomhać, kwalitu pohódnoćenjow posudźić, nic kwalitu produk <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Jara njespokojny</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Naprašowanje wočinić</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Naprašowanje začinić</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Začinić</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Přizjewjenja</string> diff --git a/mobile/android/fenix/app/src/main/res/values-hu/strings.xml b/mobile/android/fenix/app/src/main/res/values-hu/strings.xml index 4131faf3bb..efffda262e 100644 --- a/mobile/android/fenix/app/src/main/res/values-hu/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-hu/strings.xml @@ -48,12 +48,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nemrég mentett</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nemrég mentett</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Összes mentett könyvjelző megjelenítése</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Összes mentett könyvjelző megjelenítése</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Eltávolítás</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Eltávolítás</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Könyvjelzők</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Összes könyvjelző megjelenítése</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Eltávolítás</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">A %1$s a Mozilla terméke.</string> @@ -191,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Kiegészítők</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Kiegészítők</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Kiegészítők kezelése</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">További kiegészítők felfedezése</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Fiókinformáció</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -209,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Megnyitás szokásos lapon</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Kezdőképernyőhöz adás</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Hozzáadás a kezdőképernyőhöz…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Telepítés</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -220,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Oldal fordítása</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Mentés gyűjteménybe…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Gyűjteménybe mentés</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Megosztás</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Megosztás…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Megnyitás ezzel: %1$s</string> @@ -277,6 +295,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Mentés</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Oldal könyvjelzőzése</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Könyvjelző szerkesztése</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Mentés PDF-ként…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Olvasó nézetet bekapcsolása</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Olvasó nézet kikapcsolása</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Oldal fordítása…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Lefordítva erre: %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Nyomtatás…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Itt nincsenek kiegészítők</string> @@ -582,6 +618,10 @@ <string name="preferences_account_sync_error">Újracsatlakozás a szinkronizálás folytatásához</string> <!-- Preference for language --> <string name="preferences_language">Nyelv</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Fordítás</string> + <!-- Preference for translations --> + <string name="preferences_translations">Fordítások</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Adatküldések</string> <!-- Preference for data collection --> @@ -689,7 +729,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Ugrás vissza</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Friss könyvjelzők</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Friss könyvjelzők</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Könyvjelzők</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nemrég felkeresett</string> @@ -829,6 +871,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Lap innen: %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s lap bezárva: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Nemrég bezárt lapok megtekintése</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Kivételek</string> @@ -2529,6 +2579,8 @@ <string name="translations_bottom_sheet_negative_button">Most nem</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Eredeti megjelenítése</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Eredeti, lefordítatlan oldal betöltve</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Kész</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2712,13 +2764,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navigálás visszafelé</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Hibakereső fiók megnyitása</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Lapeszközök</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Lapok száma</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktív</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktív</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktív</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktív</string> <!-- The private tab count category in the tab count section in Tab Tools. --> diff --git a/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml b/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml index 4b5ebebaef..7ae4420a7b 100644 --- a/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-hy-rAM/strings.xml @@ -24,7 +24,7 @@ <!-- Placeholder text shown in search bar when using tabs search --> <string name="tab_search_hint">Որոնել ներդիրներ</string> <!-- Placeholder text shown in the search bar when using application search engines --> - <string name="application_search_hint">Մուտքագրեք որոնվող բառը</string> + <string name="application_search_hint">Մուտքագրեք որոնման եզրույթներ</string> <!-- No Open Tabs Message Description --> <string name="no_open_tabs_description">Ձեր բաց ներդիրները կցուցադրվեն այստեղ:</string> @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Հավելումներ</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Ընդլայնումներ</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Կառավարել ընդլայնումները</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Բացահայտեք ավելի շատ ընդլայնումներ</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Հաշվի տվյալներ</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Բացել կանոնավոր ներդիրում</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Ավելացնել Տնային էկրանին</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Ավելացնել Տուն էկրանին…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Տեղադրել</string> @@ -229,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Թարգմանել էջը</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Պահել հավաքածույում…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Պահպանել հավաքածուում</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Տարածել</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Համօգտագործել…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Բացել %1$s-ում</string> @@ -284,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Պահպանել</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Էջանշել այս էջը</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Խմբագրել Էջանիշը</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Պահել որպես PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Միացնել Ընթերցելու եղանակը</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Անջատել Ընթերցելու եղանակը</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Թարգմանել էջը…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Թարգմանված է %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Տպել…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Այստեղ ընդլայնումներ չկան</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox֊ի գաղտնիության ծանուցում</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Իմացեք ավելին մեր գաղտնիության ծանուցման մեջ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Մենք սիրում ենք ձեզ ապահով պահել</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -589,7 +615,9 @@ <string name="preferences_language">Լեզու</string> <!-- Preference for translation --> - <string name="preferences_translation">Թարգմանություն</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Թարգմանություն</string> + <!-- Preference for translations --> + <string name="preferences_translations">Թարգմանություններ</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Տվյալների ընտրություն</string> <!-- Preference for data collection --> @@ -662,10 +690,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Պահանջված</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Կամընտրական</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Կարդալ և փոխել վեբկայքի տվյալները</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Ջնջել վեբկայքը</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Թույլատրել բոլոր կայքերի համար</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -790,8 +814,6 @@ <string name="preferences_sync_history">Պատմություն</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Էջանիշեր</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքանուններ</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Գաղտնաբառեր</string> <!-- Preference for syncing tabs --> @@ -818,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s-ը %2$s %3$s-ում</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Բանկային քարտեր</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Վճարամիջոցներ</string> <!-- Preference for syncing addresses --> @@ -835,6 +855,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Ներդիր %s-ից</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-ի փակված ներդիրները՝ %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Դիտել վերջերս փակված ներդիրները</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Բացառություններ</string> @@ -869,7 +897,7 @@ <!-- Pairing Feature strings --> <!-- Instructions on how to access pairing --> - <string name="pair_instructions_2"><![CDATA[Սկանացրեք <b>firefox.com/pair</b>-ում ցուցադրված QR կոդը]]></string> + <string name="pair_instructions_2"><![CDATA[Սկանավորեք <b>firefox.com/pair</b>-ում ցուցադրված QR կոդը]]></string> <!-- Toolbar Preferences --> <!-- Preference for using top toolbar --> @@ -1022,7 +1050,7 @@ <!-- Dialog button text for canceling removing a study. --> <string name="studies_restart_dialog_cancel">Չեղարկել</string> <!-- Toast shown after turning on/off studies preferences --> - <string name="studies_toast_quit_application" tools:ignore="UnusedResources">Փոփոխությունները գործադրելու համար դուրս է գալիս հավելվածից…</string> + <string name="studies_toast_quit_application" tools:ignore="UnusedResources">Փոփոխությունները կիրառելու համար լքում է հավելվածը…</string> <!-- Sessions --> <!-- Title for the list of tabs --> @@ -1091,7 +1119,7 @@ <!-- History --> <!-- Text for the button to search all history --> - <string name="history_search_1">Մուտքագրեք որոնվող բառը</string> + <string name="history_search_1">Մուտքագրեք որոնման եզրույթներ</string> <!-- Text for the button to clear all history --> <string name="history_delete_all">Ջնջել պատմությունը</string> <!-- Text for the snackbar to confirm that multiple browsing history items has been deleted --> @@ -1134,7 +1162,7 @@ <!-- Crashes --> <!-- Title text displayed on the tab crash page. This first parameter is the name of the application (For example: Fenix) --> - <string name="tab_crash_title_2">Ներողություն. %1$s-ը չի կարող բեռնել այդ էջը:</string> + <string name="tab_crash_title_2">Ներողություն: %1$s-ը չի կարող բեռնել այդ էջը:</string> <!-- Send crash report checkbox text on the tab crash page --> <string name="tab_crash_send_report">Ուղարկել վթարի զեկույցը Mozilla-ին</string> <!-- Close tab button text on the tab crash page --> @@ -1210,7 +1238,7 @@ <string name="bookmark_undo_deletion">ՀԵՏԱՐԿԵԼ</string> <!-- Text for the button to search all bookmarks --> - <string name="bookmark_search">Մուտքագրեք որոնվող բառը</string> + <string name="bookmark_search">Մուտքագրեք որոնման եզրույթներ</string> <!-- Site Permissions --> <!-- Button label that take the user to the Android App setting --> @@ -1266,7 +1294,7 @@ <!-- Summary of tracking protection preference if tracking protection is set to off --> <string name="tracking_protection_off">Անջ.</string> <!-- Summary of tracking protection preference if tracking protection is set to standard --> - <string name="tracking_protection_standard">Ստանդարտ</string> + <string name="tracking_protection_standard">Սովորական</string> <!-- Summary of tracking protection preference if tracking protection is set to strict --> <string name="tracking_protection_strict">Խիստ</string> <!-- Summary of tracking protection preference if tracking protection is set to custom --> @@ -1390,7 +1418,7 @@ <!-- Confirmation dialog button --> <string name="sync_confirmation_button">Հասկացա</string> <!-- Share error message --> - <string name="share_error_snackbar">Հնարավոր չէ տարածել այս հավելվածին</string> + <string name="share_error_snackbar">Չստացվեց տարածել այս հավելվածին</string> <!-- Add new device screen title --> <string name="sync_add_new_device_title">Ուղարկել սարքի</string> <!-- Text for the warning message on the Add new device screen --> @@ -1586,7 +1614,7 @@ <!-- Instructions on how to access pairing --> <string name="sign_in_instructions"><![CDATA[Ձեր համակարգչում բացեք Firefox-ը և անցեք <b>https://firefox.com/pair</b>]]></string> <!-- Text shown for sign in pairing when ready --> - <string name="sign_in_ready_for_scan">Պատրաստ է սկանավորել</string> + <string name="sign_in_ready_for_scan">Պատրաստ է սկանավորման</string> <!-- Text shown for settings option for sign with pairing --> <string name="sign_in_with_camera">Մուտք գործել Ձեր տեսախցիկով</string> <!-- Text shown for settings option for sign with email --> @@ -1614,7 +1642,7 @@ <!-- Text displayed that links to website about enhanced tracking protection --> <string name="preference_enhanced_tracking_protection_explanation_learn_more">Իմանալ ավելին</string> <!-- Preference for enhanced tracking protection for the standard protection settings --> - <string name="preference_enhanced_tracking_protection_standard_default_1">Ստանդարտ (սկզբնադիր)</string> + <string name="preference_enhanced_tracking_protection_standard_default_1">Սովորական (սկզբնադիր)</string> <!-- Preference description for enhanced tracking protection for the standard protection settings --> <string name="preference_enhanced_tracking_protection_standard_description_5">Էջերը նորմալ կբեռնվեն, բայց արգելափակվելու են ավելի քիչ հետագծիչներ:</string> <!-- Accessibility text for the Standard protection information icon --> @@ -1761,12 +1789,8 @@ <string name="add_to_homescreen_description_2">Հեշտությամբ կարող եք ավելացնել այս կայքը ձեր հեռախոսի Տնային էկրանին՝ ակնթարթորեն մատչելու և արագ դիտարկելու համար:</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքանուններ և գաղտնաբառեր</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Գաղտնաբառեր</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Պահպանել մուտքանունները և գաղտնաբառերը</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Պահել գաղտնաբառերը</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Հարցնել պահպանելիս</string> @@ -1781,46 +1805,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Լրացրեք օգտանունները և գաղտնաբառերը Ձեր սարքի այլ հավելվածներում:</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Հավելել մուտքանուն</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Հավելել գաղտնաբառ</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Համաժամեցնել մուտքանունները</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Համաժամեցնել գաղտնաբառերը</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Համաժամեցնել մուտքանունները սարքերի միջև</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Համաժամեցնել գաղտնաբառերը սարքերի միջև</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Պահպանված մուտքանուններ</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Պահված գաղտնաբառեր</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">%s-ի հետ ձեր պահպանած կամ համաժամեցրած մուտքանունները կցուցադրվեն այստեղ:</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Այն գաղտնաբառերը, որոնք դուք պահում կամ համաժամացնում եք %s-ի հետ, կցուցադրվեն այստեղ: Ձեր պահած բոլոր գաղտնաբառերը գաղտնագրված են:</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Իմանալ ավելին համաժամեցման մասին:</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Իմանալ ավելին Սինքի մասին</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Բացառություններ</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքանունները և գաղտնաբառերը, որոնք չեն պահպանվել, կցուցադրվեն այստեղ:</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s-ը չի պահի այստեղ թվարկված կայքերի գաղտնաբառերը:</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքանունները և գաղտնաբառերը չեն պահպանվի այս կայքերի համար:</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s-ը չի պահի այս կայքերի գաղտնաբառերը:</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Ջնջել բոլոր բացառությունները</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Որոնել մուտքանուններ</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Որոնել գաղտնաբառեր</string> <!-- The header for the site that a login is for --> @@ -1850,17 +1855,11 @@ <string name="saved_login_reveal_password">Ցուցադրել գաղտնաբառը</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Թաքցնել գաղտնաբառը</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ապակողպեք՝ դիտելու համար պահպանված մուտքանունները</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Ապակողպեք՝ դիտելու համար պահված գաղտնաբառերը</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Անվտանգ դարձրեք ձեր մուտքանունները և գաղտնաբառերը</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Անվտանգ դարձրեք ձեր պահված գաղտնաբառերը</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ստեղծեք սարքի կողպեքի նմուշ, PIN կամ գաղտնաբառ՝ ձեր պահպանված մուտքանունները և գաղտնաբառերը մուտք գործելուց պաշտպանելու համար, եթե ձեր սարքը ուրիշի ձեռքն ընկնի:</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Տեղակայեք սարքի կողպման նախշ, PIN կամ գաղտնաբառ՝ պաշտպանելու պահված գաղտնաբառերն այն դեպքում, եթե որևէ մեկը ևս մուտք ունենա Ձեր սարքին:</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Հետո</string> @@ -1878,51 +1877,35 @@ <string name="saved_logins_sort_strategy_alphabetically">Անվան (Ա-Ֆ)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Վերջին օգտագործվածը</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Տեսակավորել մուտագրումների ցանկը</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Տեսակավորել գաղտնաբառերի ցանկը</string> <!-- Autofill --> <!-- Preference and title for managing the autofill settings --> - <string name="preferences_autofill">Ինքնալցում</string> + <string name="preferences_autofill">Ինքնալրացում</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Հասցեներ</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Բանկային քարտեր</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Վճարամիջոցներ</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Պահել և ինքնալրացնել քարտերը</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Պահել և լրացնել վճարամիջոցները</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Տվյալները գաղտնագրված են</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s-ը գաղտնագրում է ձեր պահած բոլոր վճարամիջոցները</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Համաժամեցնել քարտերը սարքերի միջև</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Համաժամեցնել քարտերը</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Ավելացնել բանկային քարտ</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Հավելել քարտ</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Կառավարել պահված քարտերը</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Կառավարել քարտերը</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Ավելացնել հասցե</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Կառավարեք հասցեները</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Պահել և ինքնալրացնել քարտերը</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Պահել և լրացնել հասցեները</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Ներառել տեղեկություններ, ինչպիսիք են համարները, էլ.փոստը և առաքման հասցեները</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Ներառում է հեռախոսահամարներ և էլ. փոստի հասցեներ</string> @@ -1946,8 +1929,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Ջնջել քարտը</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Համոզվա՞ծ եք, որ ցանկանում եք ջնջել այս բանկային քարտը:</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Ջնջե՞լ քարտը</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Ջնջել</string> @@ -1961,24 +1942,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Պահպանված քարտեր</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքագրեք բանկային վավեր քարտի համար</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Մուտքագրեք ճիշտ քարտի համար</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Լրացրեք այս դաշտը</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Հավելել անուն</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Ապակողպեք՝ դիտելու համար պահպանված քարտերը</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Անվտանգ դարձրեք ձեր բանկային քարտերը</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Անվտանգ դարձրեք ձեր պահած վճարամիջոցները</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Տեղակայեք սարքի կողպման նախշ, PIN կամ գաղտնաբառ՝ պաշտպանելու պահված բանկային քարտերը այն դեպքում, եթե որևէ մեկը ևս մուտք ունի Ձեր սարքին:</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Տեղակայեք սարքի կողպման նախշ, PIN կամ գաղտնաբառ՝ պաշտպանելու ձեր քարտերն այն դեպքում, եթե որևէ մեկը ևս մուտք ունենա Ձեր սարքին:</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Տեղակայել հիմա</string> @@ -1986,8 +1958,6 @@ <string name="credit_cards_warning_dialog_later">Ավելի ուշ</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Ապակողպեք ձեր սարքը</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ապակողպեք՝ օգտագործելու համար բանկային քարտերի պահված տեղեկությունները</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Ապակողպեք՝ պահված վճարամիջոցն օգտագործելու համար</string> @@ -1997,12 +1967,6 @@ <string name="addresses_edit_address">Խմբագրել հասցեն</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Կառավարեք հասցեները</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Անուն</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Հայրանուն</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Ազգանուն</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Անուն</string> <!-- The header for the street address of an address --> @@ -2028,8 +1992,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Ջնջել հասցեն</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ջնջե՞լ այս հասցեն:</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Ջնջե՞լ այս հասցեն:</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Ջնջել</string> @@ -2126,49 +2088,29 @@ <string name="login_menu_delete_button">Ջնջել</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Խմբագրել</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Համոզվա՞ծ եք, որ ցանկանում եք ջնջել այս մուտքանունը:</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Համոզվա՞ծ եք, որ ցանկանում եք ջնջել այս գաղտնաբառը:</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Ջնջել</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Չեղարկել</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Մուտքի ընտրանքներ</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Գաղտնաբառի ընտրանքներ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Խմբագրելի տեքստի դաշտը մուտքի վեբ հասցեի համար:</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Խմբագրելի տեքստի դաշտ կայքի հասցեի համար:</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Խմբագրելի տեքստի դաշտը մուտք գործողի համար:</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Խմբագրելի տեքստի դաշտ օգտվողի անվան համար:</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Խմբագրելի տեքստի դաշտը մուտքի գաղտնաբառի համար:</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Խմբագրելի տեքստի դաշտ գաղտնաբառի համար:</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Պահպանել փոփոխությունները մուտքագրման համար:</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Պահել փոփոխությունները:</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Խմբագրել</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Խմբագրել գաղտնաբառը</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Հավելել նոր մուտքանուն</string> <!-- The page title for adding new password. --> <string name="add_login_2">Հավելել գաղտնաբառ</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Գաղտնաբառ է պահանջվում</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Մուտքագրեք գաղտնաբառ</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Օգտվողի անունը պարտադիր է</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Մուտքագրեք օգտվողի անունը</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Հոսթի անունը պարտադիր է</string> @@ -2576,6 +2518,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Փակել թարգմանությունների թերթիկը</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Որոշ կարգավորումներ ժամանակավորապես անհասանելի են։</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Թարգմանություններ</string> @@ -2598,6 +2543,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Ընտրեք լեզուն՝ «միշտ թարգմանել» և «երբեք չթարգմանել» նախապատվությունները կառավարելու համար:</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Չստացվեց բեռնել լեզուները։ Խնդրում ենք կրկին ստուգել՝ ավելի ուշ։</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Թարգմանելու առաջարկ (սկզբնադիր)</string> @@ -2620,6 +2568,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Հեռացնել %1$s-ը</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Չստացվեց բեռնել կայքերը։ Խնդրում ենք կրկին ստուգել՝ ավելի ուշ։</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Ջնջե՞լ %1$s-ը:</string> @@ -2697,13 +2647,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Նավարկել հետ</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Բացել վրիպազերծման գզրոցը</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Ներդիրի գործիքներ</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Ներդիրների քանակը</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Ակտիվ</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Ակտիվ</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Ակտիվ</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Անգործուն</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2714,6 +2669,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Ներդիրների ստեղծման գործիք</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Ներդիրների քանակ ստեղծելու համար</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Տեքստային դաշտը դատարկ է</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Խնդրում ենք մուտքագրել միայն դրական ամբողջ թվեր</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Խնդրում ենք մուտքագրել զրոյից մեծ թիվ</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Գերազանցվել է ներդիրների առավելագույն քանակը (%1$s), որոնք կարող են ստեղծվել մեկ գործողության ընթացքում</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Հավելել ակտիվ ներդիրներին</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2730,11 +2695,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Գաղտնիության դրույթներ</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Ուղարկել</string> + <string name="micro_survey_submit_button_label">Ուղարկել</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Փակել</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Փակել</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Շնորհակալությո՜ւն Ձեր արձագանքի համար:</string> + <string name="micro_survey_feedback_confirmation">Շնորհակալությո՜ւն Ձեր արձագանքի համար:</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Շատ գոհ</string> <!-- Option for likert scale --> @@ -2746,6 +2711,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Շատ դժգոհ</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Բացել հարցումը</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Փակել հարցումը</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Փակել</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Մուտքանուններ</string> diff --git a/mobile/android/fenix/app/src/main/res/values-ia/strings.xml b/mobile/android/fenix/app/src/main/res/values-ia/strings.xml index 8aed75c096..91b8cce44c 100644 --- a/mobile/android/fenix/app/src/main/res/values-ia/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-ia/strings.xml @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Additivos</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gerer extensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Discoperir altere extensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informationes del conto</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">Aperir in un scheda regular</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Adder al pagina initial</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Adder al pagina initial…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -231,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traducer le pagina</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Salvar al collection…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Salvar al collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartir</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartir…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Aperir in %1$s</string> @@ -287,6 +297,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Salvar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Adder un marcapaginas pro iste pagina</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Rediger marcapagina</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Salvar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Activar modo lectura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Disactivar modo lectura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traducer le pagina…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traducite in %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimer…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nulle extensiones hic</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de confidentialitate de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Lege nostre aviso de confidentialitate</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">A nos place mantener te secur</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -598,7 +624,9 @@ <!-- Preference for language --> <string name="preferences_language">Lingua</string> <!-- Preference for translation --> - <string name="preferences_translation">Traduction</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduction</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traductiones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Selectiones de datos</string> <!-- Preference for data collection --> @@ -669,10 +697,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Necessari</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leger e cambiar datos del sito web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Deler le sito web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitter a tote le sitos</string> @@ -801,8 +825,6 @@ <string name="preferences_sync_history">Chronologia</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcapaginas</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credentiales</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Contrasignos</string> <!-- Preference for syncing tabs --> @@ -829,8 +851,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s sur %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartas de credito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Methodos de pagamento</string> <!-- Preference for syncing addresses --> @@ -848,6 +868,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Scheda veniente de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Schedas de %1$s clause: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Vider schedas recentemente claudite</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceptiones</string> @@ -1810,13 +1838,8 @@ <string name="add_to_homescreen_description_2">Tu pote facilemente adder iste sito web al Pagina initial de tu apparato pro haber accesso instantanee e navigar plus veloce con un experientia simile al app.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Credentiales e contrasignos -</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Contrasignos</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar credentiales e contrasignos</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Salvar contrasignos</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Demandar pro salvar</string> @@ -1833,46 +1856,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Plenar nomines de usator e contrasignos in altere apps sur tu apparato.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adder credentiales</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Adder contrasigno</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronisar credentiales</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synchronisar contrasignos</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronisar credentiales inter le apparatos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synchronisar contrasignos inter apparatos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credentiales salvate</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Contrasignos salvate</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Le credentiales que tu salva o synchronisa a in %s apparera hic.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Le contrasignos que tu salva o synchronisa in %s sera listate ci. Tote le contrasignos que tu salva es cryptate.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Apprender plus re Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Apprender plus re le synchronisation</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceptiones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Credentiales e contrasignos que non es salvate essera monstrate hic.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s non salvara le password pro le sitos ci listate.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Credentiales e contrasignos non sera salvate pro iste sitos.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s non salvara le contrasignos pro iste sitos.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Deler tote le exceptiones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Cercar credentiales</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Cercar contrasignos</string> <!-- The header for the site that a login is for --> @@ -1901,17 +1905,11 @@ <string name="saved_login_reveal_password">Monstrar contrasigno</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Celar contrasigno</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Disbloca pro vider tu credentiales salvate</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Disbloca pro vider tu contrasignos salvate</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Assecurar tu credentiales e contrasignos</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Protege tu contrasignos salvate</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Implementa un patrono de blocada apparato, PIN o contrasigno pro proteger tu credentiales e contrasignos salvate de esser accedite, si alcuno altere ha tu apparato.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Implementa un patrono de blocada apparato, PIN o contrasigno pro proteger tu contrasignos de esser accedite, si alcuno altere ha tu apparato.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Plus tarde</string> @@ -1929,9 +1927,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Ultimemente usate</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordinar menu de credentiales</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Ordinar le menu del contrasignos</string> @@ -1940,16 +1935,10 @@ <string name="preferences_autofill">Autoplenar</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresses</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartas de credito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Methodos de pagamento</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gerer le cartas salvate</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Salvar e compilar methodos de pagamento automaticamente</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Datos es cryptate</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s crypta tote tu methodos de pagamento salvate</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> @@ -1957,12 +1946,8 @@ <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synchronisar cartas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Adde un carta de credito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Adder carta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gerer le cartas salvate</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gerer le cartas</string> <!-- Preference option for adding an address --> @@ -1970,13 +1955,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gerer adresses</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar e autoplenar adresses</string> - <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Salvar e compilar automaticamente adresses</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Includer informationes como numeros, email e adresses de expedition</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Include numeros de telephono e adresses email</string> @@ -2000,8 +1980,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Deler carta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Desira tu vermente deler iste carta de credito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Deler carta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Deler</string> @@ -2015,24 +1993,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartas salvate</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Insere un numero valide de carta de credito</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Insere un numero de carta valide</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Completa iste campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Adde un nomine</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Disbloca pro vider tu cartas salvate</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protege tu carta de credito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Protege tu methodo de pagamento salvate</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Implementa un patrono de blocada apparato, PIN o contrasigno pro proteger tu cartas de credito de esser accedite, si alcuno altere ha tu apparato.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Implementa un patrono de blocada apparato, PIN o contrasigno pro proteger tu methodos de pagamento salvate de esser accedite, si alcun altere ha tu apparato.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Implementar ora</string> @@ -2041,9 +2010,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Disbloca tu apparato</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Disbloca pro usar le informationes de carta de credito immagazinate</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Disblocar pro usar le methodo de pagamento salvate</string> <!-- Title of the "Add address" screen --> @@ -2052,12 +2018,6 @@ <string name="addresses_edit_address">Modificar le adresse</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gerer addresses</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Prenomine</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Nomine intermedie</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Nomine de familia</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nomine</string> <!-- The header for the street address of an address --> @@ -2084,8 +2044,6 @@ <string name="addressess_delete_address_button">Deler adresses</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desira tu vermente deler iste adresses?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Deler iste adresses?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Deler</string> @@ -2185,50 +2143,30 @@ <string name="login_menu_delete_button">Deler</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Rediger</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Desira tu vermente deler iste credentiales?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Desira tu vermente deler iste contrasigno?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Deler</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancellar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Optiones de apertura de session</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Optiones de contrasigno</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le campo de texto redigibile pro le adresse web del credentiales.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Le campo de texto redigibile pro le adresse del sito web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le campo de texto redigibile pro le nomine de usator del accesso.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Le campo de texto redigibile pro le nomine de usator.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le campo de texto redigibile pro le contrasigno del credentiales.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Le campo de texto redigibile pro le contrasigno.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar cambiamentos a credentiales.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Salvar le cambiamentos.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Rediger</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Modificar le contrasigno</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adder nove credential</string> <!-- The page title for adding new password. --> <string name="add_login_2">Adder contrasigno</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Contrasigno requirite</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Insere un contrasigno</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Nomine de usator necesse.</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Insere un nomine de usator</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Nomine de servitor necesse.</string> @@ -2636,6 +2574,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Eliger folio de traductiones</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Alcun parametros es temporarimente indisponibile.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traduction</string> @@ -2658,6 +2599,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Elige un lingua pro gerer le preferentias “sempre traducer” e “jammais traducer”.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Impossibile cargar le linguas. Re-controla plus tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Offerer le traduction (predefinite)</string> @@ -2680,6 +2624,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Remover %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Impossibile cargar sitos. Retenta plus tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Deler %1$s?</string> @@ -2757,13 +2703,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Naviga a retro</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Aperir tiratorio de depuration</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Numero de schedas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Numero de schedas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Active</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Active</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Active</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2774,6 +2725,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Utensile pro creation de schedas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Numero de schedas a crear</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Le campo de texto es vacue</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Solo insere numeros integre positive</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Insere un numero major que zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Excedite le maxime numero de schedas (%1$s) que pote esser generate in un operation</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Adder a schedas active</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2790,11 +2751,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Aviso de confidentialitate</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Inviar</string> + <string name="micro_survey_submit_button_label">Inviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Clauder</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Clauder</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Gratias pro tu commentario!</string> + <string name="micro_survey_feedback_confirmation">Gratias pro tu commentario!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Absolutemente satisfacite</string> <!-- Option for likert scale --> @@ -2806,6 +2767,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Absolutemente non satisfacite</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Aperir sondage</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Clauder le questionario</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Clauder</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Authenticationes</string> diff --git a/mobile/android/fenix/app/src/main/res/values-is/strings.xml b/mobile/android/fenix/app/src/main/res/values-is/strings.xml index 2cbbea4ff7..8c5d707a9c 100644 --- a/mobile/android/fenix/app/src/main/res/values-is/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-is/strings.xml @@ -198,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Viðbætur</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Forritsaukar</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Sýsla með forritsauka</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Uppgötvaðu fleiri forritsauka</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Upplýsingar um reikning</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Opna í venjulegum flipa</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Bæta við á ræsisíðu</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Bæta við á upphafsskjá…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Setja upp</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Þýða síðu</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Vista í safn…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Vista í safn</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Deila</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Deila…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Opna með %1$s</string> @@ -284,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Vista</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Setja síðu í bókamerki</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Breyta bókamerki</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Vista sem PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Kveikja á lesham</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Slökkva á lesham</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Þýða síðu…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Þýtt á %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Prenta…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Engir forritsaukar hér</string> @@ -380,8 +408,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Meðferð persónuupplýsinga í Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Sjáðu nánar í persónuverndaryfirlýsingu okkar</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Við fáum kikk út úr því að halda þér öruggum</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -591,7 +617,9 @@ <!-- Preference for language --> <string name="preferences_language">Tungumál</string> <!-- Preference for translation --> - <string name="preferences_translation">Þýðing</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Þýðing</string> + <!-- Preference for translations --> + <string name="preferences_translations">Þýðingar</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Gagnamöguleikar</string> <!-- Preference for data collection --> @@ -663,10 +691,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Nauðsynlegt</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valkvætt</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Lesa og breyta vefsíðugögnum</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eyða vefsvæði</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Leyfa fyrir öll vefsvæði</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -792,8 +816,6 @@ <string name="preferences_sync_history">Feril</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bókamerki</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráningar</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Lykilorð</string> <!-- Preference for syncing tabs --> @@ -820,8 +842,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s á %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Greiðslukort</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Greiðslumátar</string> <!-- Preference for syncing addresses --> @@ -837,6 +857,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Flipi frá %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s flipum lokað: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Skoða nýjustu flipa sem var lokað</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Undanþágur</string> @@ -1759,12 +1787,8 @@ <string name="add_to_homescreen_description_2">Þú getur á auðveldan hátt bætt þessu vefsvæði á upphafsskjáinn þinn fyrir auðveldara aðgengi og hraðara vafur.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráning og lykilorð</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Lykilorð</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Vista innskráningu og lykilorð</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Vista lykilorð</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Biðja um að vista</string> @@ -1779,48 +1803,30 @@ <string name="preferences_android_autofill">Sjálfvirk útfylling í öðrum forritum</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fylltu út notendanöfn og lykilorð í öðrum forritum á tækinu þínu.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Bæta við innskráningu</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Bæta við lykilorði</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Samstilla innskráningar</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Samstilla lykilorð</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Samstilla innskráningar milli tækja</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Samstilla lykilorð milli tækja</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Vistaðar innskráningar</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Vistuð lykilorð</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráningarnar sem þú vistar eða samstillir við %s birtast hér.</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Lykilorðin sem þú vistar eða samstillir við %s verða skráð hér. Öll lykilorð sem þú vistar eru dulrituð. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Læra meira um samstillingu.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Frekari upplýsingar um samstillingu</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Undanþágur</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráningar og lykilorð sem ekki eru vistuð sjást hér.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s mun ekki vista lykilorð fyrir vefsvæði sem skráð eru hér.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráningar og lykilorð verða ekki vistuð fyrir þessi vefsvæði.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s mun ekki vista lykilorð fyrir þessi vefsvæði.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eyða öllum undantekningum</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Leita að innskráningu</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Leita að lykilorðum</string> <!-- The header for the site that a login is for --> @@ -1849,17 +1855,11 @@ <string name="saved_login_reveal_password">Sýna lykilorð</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Fela lykilorð</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Aflæstu til að skoða vistaðar innskráningar</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Aflæstu til að skoða vistuð lykilorð</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Verndaðu innskráningar þínar og lykilorð</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Tryggðu öryggi vistuðu lykilorðanna þinna</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Settu upp læsimynstur, PIN eða lykilorð til að vernda vistaðar innskráningar og lykilorð ef ske kynni að einhver annar komist yfir tækið þitt.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Settu upp læsimynstur, PIN-númer eða lykilorð til að vernda vistuðu lykilorðin þín ef ske kynni að einhver annar komist yfir tækið þitt.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Síðar</string> @@ -1877,8 +1877,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nafn (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Síðast notað</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Raða innskráningarvalmyndinni</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Raða lykilorðavalmynd</string> @@ -1888,40 +1886,26 @@ <string name="preferences_autofill">Sjálfvirk útfylling</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Tölvupóstföng</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Greiðslukort</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Greiðslumátar</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Vista og fylla sjálfkrafa út í greiðslukort</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Vista og fylla út greiðslumáta</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Gögn eru dulrituð</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s dulritar alla greiðslumáta sem þú vistar</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Samstilla greiðslukort milli tækja</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Samstilla kort</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Bæta við greiðslukorti</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Bæta við korti</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Sýsla með vistuð greiðslukort</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Sýsla með greiðslukort</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Bæta við tölvupóstfangi</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Sýsla með tölvupóstföng</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Vista og fylla sjálfkrafa út heimilisföng</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Vista og fylla út í heimilisföng</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Láta upplýsingar eins og símanúmer, tölvupóstföng og heimilisföng fylgja með</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Þar með talin símanúmer og tölvupóstföng</string> @@ -1946,8 +1930,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eyða korti</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ertu viss um að þú viljir eyða þessu greiðslukorti?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Eyða korti?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Eyða</string> @@ -1959,23 +1941,15 @@ <string name="credit_cards_cancel_button">Hætta við</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Vistuð greiðslukort</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Settu inn gilt kortanúmer</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Settu inn gilt kortanúmer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Fylltu út í þennan reit</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Bættu við nafni</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Aflæsa til að skoða vistuð greiðslukort</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Haltu kreditkortunum þínum öruggum</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Tryggðu öryggi vistuðu greiðslumátanna þinna</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Settu upp læsimynstur, PIN-númer eða lykilorð til að vernda vistuðu greiðslukortin þín ef ske kynni að einhver annar komist yfir tækið þitt.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Settu upp læsimynstur, PIN-númer eða lykilorð til að vernda vistuðu greiðslumátana þína ef ske kynni að einhver annar komist yfir tækið þitt.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Setja upp núna</string> @@ -1983,8 +1957,6 @@ <string name="credit_cards_warning_dialog_later">Síðar</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Aflæstu tækinu þínu</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Aflæstu til að nota geymdar kreditkortaupplýsingar</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Aflæstu til að nota vistaða greiðslumáta</string> @@ -1994,12 +1966,6 @@ <string name="addresses_edit_address">Breyt tölvupóstfangi</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Sýsla með tölvupóstföng</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Skírnarnafn</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Millinafn</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Eftirnafn</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nafn</string> <!-- The header for the street address of an address --> @@ -2026,8 +1992,6 @@ <string name="addressess_delete_address_button">Eyða heimilisfangi</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ertu viss um að þú viljir eyða þessu póstfangi?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Eyða þessu heimilisfangi?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Eyða</string> @@ -2126,49 +2090,29 @@ <string name="login_menu_delete_button">Eyða</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Breyta</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ertu viss um að þú viljir eyða þessari innskráningu?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Ertu viss um að þú viljir eyða þessu lykilorði?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eyða</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Hætta við</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Innskráningarvalkostir</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Valkostir lykilorðs</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Breytilegi textareiturinn fyrir veffang þessarar innskráningarinnar.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Breytanlegi textareiturinn fyrir vistfang vefsvæðisins.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Breytilegi textareiturinn fyrir notandanafn innskráningarinnar.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Breytanlegi textareiturinn fyrir notandanafnið.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Breytilegi textareiturinn fyrir lykilorð innskráningarinnar.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Breytanlegi textareiturinn fyrir lykilorðið.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Vista breytingar á innskráningu.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Vista breytingar.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Breyta</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Breyta lykilorði</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Bæta við nýrri innskráningu</string> <!-- The page title for adding new password. --> <string name="add_login_2">Bæta við lykilorði</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Lykilorðs krafist</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Settu inn lykilorð</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Notandanafn er nauðsynlegt</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Settu inn notandanafn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hýsingarheiti er nauðsynlegt</string> @@ -2577,6 +2521,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Loka þýðingarblaði</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Sumar stillingar eru ekki aðgengilegar eins og stendur.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Þýðingar</string> @@ -2599,6 +2546,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Veldu tungumál til að stjórna stillingum á „alltaf þýða“ og „aldrei þýða“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Ekki tókst að hlaða tungumálum. Athugaðu aftur síðar.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Bjóðast til að þýða (sjálfgefið)</string> @@ -2622,6 +2572,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Fjarlægja %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Ekki tókst að hlaðið inn vefsvæðum. Athugaðu aftur síðar.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Eyða %1$s?</string> @@ -2699,13 +2651,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Fara til baka</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Opna villuleitarspjald</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Flipaverkfæri</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Fjöldi flipa</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Virkir</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Virkir</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Virkt</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Óvirkir</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2716,6 +2673,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Verkfæri til að búa til flipa</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Fjöldi flipa sem á að búa til</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Textareiturinn er tómur</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Settu aðeins inn jákvæðar heiltölur</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Settu inn tölu sem er stærri en núll</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Farið yfir hámarksfjölda flipa (%1$s) sem hægt er að búa til í einni aðgerð</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Bæta við virka flipa</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2732,11 +2699,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Meðferð persónuupplýsinga</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Senda inn</string> + <string name="micro_survey_submit_button_label">Senda inn</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Loka</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Loka</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Takk fyrir álit þitt!</string> + <string name="micro_survey_feedback_confirmation">Takk fyrir álit þitt!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Mjög ánægð/ur</string> <!-- Option for likert scale --> @@ -2748,6 +2715,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Mjög óánægð/ur</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Opna könnun</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Loka könnun</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Loka</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Innskráningar</string> diff --git a/mobile/android/fenix/app/src/main/res/values-it/strings.xml b/mobile/android/fenix/app/src/main/res/values-it/strings.xml index 36c423b38d..84154422c7 100644 --- a/mobile/android/fenix/app/src/main/res/values-it/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-it/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Componenti aggiuntivi</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Estensioni</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gestisci estensioni</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Scopri altre estensioni</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informazioni sull’account</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Apri in scheda normale</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Agg. a schermata principale</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Agg. a schermata principale…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installa</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,10 +236,14 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduci pagina</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Salva in una raccolta…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Salva in una raccolta</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Condividi</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Condividi…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Apri in %1$s</string> @@ -288,6 +298,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Salva</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Aggiungi pagina ai segnalibri</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Modifica segnalibro</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Salva come PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Attiva Modalità lettura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Disattiva Modalità lettura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traduci pagina…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Tradotta in %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Stampa…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nessuna estensione disponibile</string> @@ -385,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Informativa sulla privacy di Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Ulteriori informazioni nella nostra informativa sulla privacy</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Ci piace mantenerti al sicuro</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Lingua</string> <!-- Preference for translation --> - <string name="preferences_translation">Traduzione</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduzione</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traduzioni</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Condivisione dati</string> <!-- Preference for data collection --> @@ -671,10 +699,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obbligatorio</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Facoltativo</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Leggere e modificare i dati dei siti web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Elimina sito web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Consenti per tutti i siti</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -802,8 +826,6 @@ <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Segnalibri</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziali</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Password</string> <!-- Preference for syncing tabs --> @@ -830,8 +852,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s su %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Carte di credito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Metodi di pagamento</string> <!-- Preference for syncing addresses --> @@ -848,6 +868,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Scheda da %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Schede di %1$s chiuse: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Visualizza schede chiuse di recente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Eccezioni</string> @@ -1802,12 +1830,8 @@ <string name="add_to_homescreen_description_2">È possibile aggiungere questo sito web alla schermata principale del dispositivo per accedervi più rapidamente, come se si trattasse di un’app.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziali e password</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Password</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Salva credenziali e password</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Salva password</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Chiedi prima di salvare</string> @@ -1823,46 +1847,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Compila nomi utente e password nelle altre app del tuo dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Aggiungi credenziali</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Aggiungi password</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizza le credenziali</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizza password</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizza credenziali tra dispositivi</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizza le password tra i tuoi dispositivi</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenziali salvate</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Password salvate</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Le credenziali salvate o sincronizzate in %s verranno visualizzate qui.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Le password salvate o sincronizzate con %s verranno visualizzate qui. Tutte le password salvate sono crittate.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Ulteriori informazioni su Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Ulteriori informazioni sulla sincronizzazione</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Eccezioni</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Le credenziali e le password non salvate verranno mostrate qui.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s non salverà le password per i siti elencati qui.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Le credenziali e le password non verranno salvate per questi siti.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s non salverà le password per questi siti.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Elimina tutte le eccezioni</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Cerca credenziali</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Cerca nelle password</string> <!-- The header for the site that a login is for --> @@ -1891,17 +1896,11 @@ <string name="saved_login_reveal_password">Mostra password</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Nascondi password</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sblocca per visualizzare le credenziali salvate</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Sblocca per visualizzare le password salvate</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteggi le credenziali di accesso</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Proteggi le password salvate</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Imposta una sequenza di blocco, PIN o password per impedire a chi si impossessa del dispositivo di visualizzare le tue credenziali.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Imposta una sequenza di blocco, PIN o password per impedire a chi si impossessa del dispositivo di visualizzare le password salvate.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Più tardi</string> @@ -1919,8 +1918,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nome (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Ultimo utilizzo</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Ordina il menu delle credenziali di accesso</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menu per ordinare le password</string> @@ -1930,41 +1927,27 @@ <string name="preferences_autofill">Compilazione automatica</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Indirizzi</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Carte di credito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Metodi di pagamento</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvare e compilare automaticamente le carte</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Salva e compila i metodi di pagamento</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">I dati sono crittati</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s critta tutti i metodi di pagamento salvati</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizza le carte tra più dispositivi</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizza carte di credito</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Aggiungi una carta di credito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Aggiungi carta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gestione carte salvate</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gestisci carte</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Aggiungi indirizzo</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gestione indirizzi</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvare e compilare automaticamente gli indirizzi</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Salva e compila indirizzi</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Includere informazioni come numeri, email e indirizzi di spedizione</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Include numeri di telefono e indirizzi email</string> @@ -1989,8 +1972,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Elimina carta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Eliminare questa carta di credito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Eliminare la carta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Elimina</string> @@ -2004,24 +1985,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Carte salvate</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Inserire un numero di carta di credito valido</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Inserisci un numero di carta valido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Compilare questo campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Aggiungi un nome</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Sblocca per visualizzare le carte di credito salvate</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteggi le tue carte di credito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Proteggi i metodi di pagamento salvati</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Imposta una sequenza di blocco, PIN o password per impedire a chi si impossessa del dispositivo di visualizzare le carte di credito salvate.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Imposta una sequenza di blocco, PIN o password per impedire a chi si impossessa del dispositivo di visualizzare i metodi di pagamento salvati.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Imposta adesso</string> @@ -2030,9 +2002,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Sblocca il dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sblocca per utilizzare le informazioni delle carte di credito salvate</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Sblocca per utilizzare i metodi di pagamento salvati</string> <!-- Title of the "Add address" screen --> @@ -2041,12 +2010,6 @@ <string name="addresses_edit_address">Modifica indirizzo</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gestione indirizzi</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Nome</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Secondo nome</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Cognome</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nome</string> <!-- The header for the street address of an address --> @@ -2074,8 +2037,6 @@ <string name="addressess_delete_address_button">Elimina indirizzo</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Eliminare questo indirizzo?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Eliminare questo indirizzo?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Elimina</string> @@ -2173,49 +2134,29 @@ <string name="login_menu_delete_button">Elimina</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Modifica</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Rimuovere queste credenziali?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Eliminare questa password?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Rimuovi</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annulla</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opzioni credenziali</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opzioni password</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il campo di testo modificabile per l’indirizzo web delle credenziali</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Il campo di testo modificabile per l’indirizzo del sito web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il campo di testo modificabile per il nome utente delle credenziali</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Il campo di testo modificabile per il nome utente.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Il campo di testo modificabile per la password delle credenziali</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Il campo di testo modificabile per la password.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Salva le modifiche alle credenziali.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Salva modifiche.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Modifica</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Modifica password</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Aggiungi nuove credenziali</string> <!-- The page title for adding new password. --> <string name="add_login_2">Aggiungi password</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Password obbligatoria</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Inserisci una password</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Nome utente obbligatorio</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Inserisci un nome utente</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Nome server obbligatorio</string> @@ -2627,6 +2568,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Chiudi il pannello per le traduzioni</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Alcune impostazioni sono temporaneamente non disponibili.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traduzioni</string> @@ -2649,6 +2593,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Seleziona una lingua per gestire le preferenze “Traduci sempre” e “Non tradurre mai“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Impossibile caricare le lingue. Ricontrolla più tardi.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Proponi la traduzione (predefinita)</string> @@ -2672,6 +2619,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Rimuovi %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Impossibile caricare i siti. Ricontrolla più tardi.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Rimuovere %1$s?</string> @@ -2749,13 +2698,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Torna indietro</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Apri riquadro di navigazione a scomparsa per il debug</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Strumenti per le schede</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Conteggio schede</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Attive</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Attive</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Attive</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inattive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2766,6 +2720,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Strumento per la creazione di schede</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Numero di schede da creare</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Il campo di testo è vuoto</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Inserire solo numeri interi positivi</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Inserire un numero maggiore di zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Superato il numero massimo di schede (%1$s) che è possibile generare in una singola operazione</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Aggiungi a schede attive</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2782,11 +2746,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Informativa sulla privacy</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Invia</string> + <string name="micro_survey_submit_button_label">Invia</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Chiudi</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Chiudi</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Grazie per aver condiviso la tua opinione.</string> + <string name="micro_survey_feedback_confirmation">Grazie per aver condiviso la tua opinione.</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Molto soddisfatto/a</string> <!-- Option for likert scale --> @@ -2798,6 +2762,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Molto insoddisfatto/a</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Apri sondaggio</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Chiudi sondaggio</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Chiudi</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Credenziali</string> diff --git a/mobile/android/fenix/app/src/main/res/values-iw/strings.xml b/mobile/android/fenix/app/src/main/res/values-iw/strings.xml index 6afb865f1c..934a428d3c 100644 --- a/mobile/android/fenix/app/src/main/res/values-iw/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-iw/strings.xml @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">תוספות</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">הרחבות</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">ניהול הרחבות</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">גילוי הרחבות נוספות</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">מידע על החשבון</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">פתיחה בלשונית רגילה</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">הוספה למסך הבית</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">הוספה למסך הבית…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">התקנה</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">תרגום הדף</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">שמירה לאוסף…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">שמירה לאוסף</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">שיתוף</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">שיתוף…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">פתיחה ב־%1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">שמירה</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">יצירת סימנייה לדף זה</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">עריכת סימנייה</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">שמירה כ־PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">הפעלת תצוגת קריאה</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">כיבוי תצוגת קריאה</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">תרגום הדף…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">תורגם ל%1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">הדפסה…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">אין כאן הרחבות</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">הצהרת הפרטיות של Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">מידע נוסף בהצהרת הפרטיות שלנו</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">אנחנו אוהבים לשמור עליך</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -586,7 +612,9 @@ <!-- Preference for language --> <string name="preferences_language">שפה</string> <!-- Preference for translation --> - <string name="preferences_translation">תרגום</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">תרגום</string> + <!-- Preference for translations --> + <string name="preferences_translations">תרגומים</string> <!-- Preference for data choices --> <string name="preferences_data_choices">בחירות נתונים</string> <!-- Preference for data collection --> @@ -660,10 +688,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">נדרש</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">לא חובה</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">קריאה ושינוי נתוני אתרים</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">מחיקת אתר</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">לאפשר לכל האתרים</string> @@ -794,8 +818,6 @@ <string name="preferences_sync_history">היסטוריה</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">סימניות</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">כניסות</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">ססמאות</string> <!-- Preference for syncing tabs --> @@ -822,8 +844,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s על %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">כרטיסי אשראי</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">אמצעי תשלום</string> <!-- Preference for syncing addresses --> @@ -839,6 +859,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">לשונית מהמכשיר %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d לשוניות נסגרו מ־%1$s</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">הצגת לשוניות שנסגרו לאחרונה</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">חריגות</string> @@ -1770,12 +1798,8 @@ <string name="add_to_homescreen_description_2">באפשרותך להוסיף בקלות אתר זה למסך הבית של המכשיר שלך כדי לקבל גישה מיידית ולגלוש מהר יותר עם חוויה שמדמה שימוש ביישומון.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">כניסות וססמאות</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">ססמאות</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">שמירת כניסות וססמאות</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">שמירת ססמאות</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">לבקש לשמור</string> @@ -1792,46 +1816,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">מילוי ושמירת שמות משתמשים וססמאות ביישומונים אחרים במכשיר שלך.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">הוספת כניסה</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">הוספת ססמה</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">סנכרון כניסות</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">סנכרון ססמאות</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">סנכרון כניסות בין מכשירים</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">סנכרון ססמאות בין מכשירים</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">כניסות שמורות</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">ססמאות שמורות</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">הכניסות שיישמרו או יסתנכרנו אל %s יופיעו כאן.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">הססמאות שיישמרו או יסונכרנו עם %s יופיעו כאן. כל הססמאות השמורות הינן מוצפנות.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">מידע נוסף על Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">מידע נוסף על סנכרון</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">חריגות</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">כניסות וססמאות שאינן שמורות יופיעו כאן.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s לא ישמור ססמאות לאתרים המפורטים כאן.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">כניסות וססמאות לא יישמרו עבור אתרים אלו.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s לא ישמור ססמאות לאתרים אלו.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">מחיקת כל החריגות</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">חיפוש כניסות</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">חיפוש ססמאות</string> <!-- The header for the site that a login is for --> @@ -1860,17 +1865,11 @@ <string name="saved_login_reveal_password">הצגת ססמה</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">הסתרת ססמה</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">יש לבטל את הנעילה כדי להציג את הכניסות השמורות שלך</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">יש לבטל את הנעילה כדי להציג את הססמאות השמורות שלך</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">שמירה מאובטחת של הכניסות והססמאות שלך</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">אבטחת הססמאות השמורות שלך</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ניתן להגדיר תבנית נעילת מכשיר, קוד או ססמה כדי להגן על פרטי הגישה והססמאות השמורות שלך מפני גורמים בלתי מהימנים שמחזיקים במכשיר שלך.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">ניתן להגדיר תבנית נעילת מכשיר, קוד או ססמה כדי להגן על הססמאות השמורות שלך מפני גורמים בלתי מהימנים שמחזיקים במכשיר שלך.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">מאוחר יותר</string> @@ -1888,8 +1887,6 @@ <string name="saved_logins_sort_strategy_alphabetically">שם (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">שימוש אחרון</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">תפריט מיון כניסות</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">תפריט מיון ססמאות</string> @@ -1899,42 +1896,28 @@ <string name="preferences_autofill">מילוי אוטומטי</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">כתובות</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">כרטיסי אשראי</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">אמצעי תשלום</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">שמירה ומילוי אוטומטי של כרטיסים</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">שמירה ומילוי אמצעי תשלום</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">הנתונים מוצפנים</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s מצפין את כל אמצעי התשלום השמורים</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">סנכרון כרטיסים בין מכשירים</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">סנכרון כרטיסים</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">הוספת כרטיס אשראי</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">הוספת כרטיס</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ניהול כרטיסים שמורים</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">ניהול כרטיסים</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">הוספת כתובת</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">ניהול כתובות</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">שמירה ומילוי אוטומטי של כתובות</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">שמירה ומילוי כתובות</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">לכלול מידע כמו מספרים, כתובות דוא״ל וכתובות למשלוח</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">כולל מספרי טלפון וכתובות דוא״ל</string> @@ -1958,8 +1941,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">מחיקת כרטיס</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">האם ברצונך למחוק את כרטיס האשראי הזה?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">למחוק את הכרטיס?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">מחיקה</string> @@ -1973,24 +1954,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">כרטיסים שמורים</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">נא להכניס מספר כרטיס אשראי תקין</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">נא להכניס מספר כרטיס תקני</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">נא למלא שדה זה</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">הוספת שם</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">יש לבטל את הנעילה כדי להציג את הכרטיסים השמורים שלך</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">אבטחת כרטיסי האשראי שלך</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">אבטחת אמצעי התשלום השמורים שלך</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ניתן להגדיר תבנית נעילת מכשיר, קוד או ססמה כדי להגן על כרטיסי האשראי השמורים שלך מפני גורמים בלתי מהימנים שמחזיקים במכשיר שלך.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">ניתן להגדיר תבנית נעילת מכשיר, קוד או ססמה כדי להגן על אמצעי התשלום השמורים שלך מפני גורמים בלתי מהימנים שמחזיקים במכשיר שלך.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">להגדיר כעת</string> @@ -1999,9 +1971,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">שחרור נעילת המכשיר שלך</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">יש לבטל את הנעילה כדי להשתמש בפרטי כרטיס האשראי השמור</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">יש לבטל את הנעילה כדי להשתמש באמצעי התשלום השמורים שלך</string> <!-- Title of the "Add address" screen --> @@ -2010,12 +1979,6 @@ <string name="addresses_edit_address">עריכת כתובת</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">ניהול כתובות</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">שם פרטי</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">שם אמצעי</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">שם משפחה</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">שם</string> <!-- The header for the street address of an address --> @@ -2040,9 +2003,6 @@ <string name="addressess_delete_address_button">מחיקת כתובת</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">האם ברצונך למחוק את כתובת זו?</string> - - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">למחוק את הכתובת הזאת?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">מחיקה</string> @@ -2141,49 +2101,29 @@ <string name="login_menu_delete_button">מחיקה</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">עריכה</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">האם ברצונך למחוק את כניסה זו?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">האם ברצונך למחוק ססמה זו?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">מחיקה</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">ביטול</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">אפשרויות כניסה</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">אפשרויות ססמה</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">שדה הטקסט הניתן לעריכה עבור כתובת האתר של הכניסה.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">שדה הטקסט הניתן לעריכה עבור כתובת האתר.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">שדה הטקסט הניתן לעריכה עבור שם המשתמש של הכניסה.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">שדה הטקסט הניתן לעריכה עבור שם המשתמש.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">שדה הטקסט הניתן לעריכה עבור הססמה של הכניסה.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">שדה הטקסט הניתן לעריכה עבור הססמה.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">שמירת השינויים של הכניסה.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">שמירת שינויים.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">עריכה</string> <!-- The page title for editing a saved password. --> <string name="edit_2">עריכת הססמה</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">הוספת כניסה חדשה</string> <!-- The page title for adding new password. --> <string name="add_login_2">הוספת ססמה</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">נדרשת ססמה</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">נא להכניס ססמה</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">דרוש שם משתמש</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">נא להכניס שם משתמש</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">דרוש שם מארח</string> @@ -2592,6 +2532,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">סגירת גיליון התרגומים</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">זמנית, חלק מההגדרות אינן זמינות.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">תרגומים</string> @@ -2614,6 +2557,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">יש לבחור שפה כדי לנהל את ההעדפות של ״תמיד לתרגם״ ו״לעולם לא לתרגם״.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">לא ניתן היה לטעון שפות. נא לנסות שוב מאוחר יותר.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">להציע לתרגם (ברירת מחדלץ)</string> @@ -2636,6 +2582,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">להסיר את %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">לא ניתן היה לטעון אתרים. נא לנסות שוב מאוחר יותר.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">למחוק את %1$s?</string> @@ -2714,13 +2662,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">ניווט אחורה</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">פתיחת מגירת ניפוי השגיאות</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">כלי לשוניות</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">ספירת לשוניות</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">פעיל</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">פעיל</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">פעילים</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">לא פעיל</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2731,6 +2684,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">כלי ליצירת לשוניות</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">כמות הלשוניות ליצירה</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">שדה הטקסט ריק</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">נא להכניס מספרים שלמים חיוביים בלבד</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">נא להכניס מספר הגדול מאפס</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">חריגה ממספר הלשוניות המירבי (%1$s) שניתן ליצור בפעולה אחת</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">הוספה ללשוניות פעילות</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2747,11 +2710,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">הצהרת פרטיות</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">שליחה</string> + <string name="micro_survey_submit_button_label">שליחה</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">סגירה</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">סגירה</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">תודה על המשוב שלך!</string> + <string name="micro_survey_feedback_confirmation">תודה על המשוב שלך!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">מאוד מרוצה</string> <!-- Option for likert scale --> @@ -2763,6 +2726,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">מאוד לא מרוצה</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">פתיחת סקר</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">סגירת סקר</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">סגירה</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">כניסות</string> diff --git a/mobile/android/fenix/app/src/main/res/values-ja/strings.xml b/mobile/android/fenix/app/src/main/res/values-ja/strings.xml index 5040b99f60..cad2df70fa 100644 --- a/mobile/android/fenix/app/src/main/res/values-ja/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-ja/strings.xml @@ -51,12 +51,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">最近保存</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">最近保存</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">保存したブックマークをすべて表示します</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">保存したブックマークをすべて表示します</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">削除</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">削除</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">ブックマーク</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">すべてのブックマークを表示</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">削除</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s は Mozilla の製品です。</string> @@ -147,8 +155,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">新しいプライベートタブ</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">パスワードのショートカット</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">パスワード</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">パスワードのショートカット</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -193,6 +203,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">アドオン</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">拡張機能</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">拡張機能を管理</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">拡張機能を探す</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">アカウント情報</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -211,18 +225,26 @@ <string name="browser_menu_open_in_regular_tab">通常タブで開く</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">ホーム画面に追加</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">ホーム画面に追加...</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">インストール</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">再同期</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">ページ内検索</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">ページ内を検索...</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">ページを翻訳</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">コレクションに保存...</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">コレクションに保存</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">共有</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">共有...</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s で開く</string> @@ -252,9 +274,47 @@ <string name="browser_menu_customize_home_1">ホームページをカスタマイズ</string> <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> - <string name="browser_menu_sign_in" tools:ignore="UnusedResources">ログイン</string> - <!-- Browser menu caption label for the "Sign in" browser menu item described in browser_menu_sign_in --> - <string name="browser_menu_sign_in_caption" tools:ignore="UnusedResources">パスワード、タブなどを同期します</string> + <string name="browser_menu_sign_in">ログイン</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">パスワード、タブなどを同期します</string> + + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">ログインして Sync に戻る</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">同期を一時停止中</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">新しいプライベートタブ</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">パスワード</string> + + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">%1$s の新着情報</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">PC 版サイトに切り替える</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">ツール</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">保存</string> + + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">このページをブックマーク</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">ブックマークを編集</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF として保存...</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">リーダービューで開く</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">リーダービューを閉じる</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">ページを翻訳...</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s に翻訳しました</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">印刷...</string> <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> @@ -353,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox のプライバシー通知</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">詳細はプライバシー通知をご覧ください</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">私たちはあなたの安全を守りたいと願っています</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -565,6 +623,10 @@ <string name="preferences_account_sync_error">再接続して同期を再開</string> <!-- Preference for language --> <string name="preferences_language">言語</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">翻訳</string> + <!-- Preference for translations --> + <string name="preferences_translations">翻訳</string> <!-- Preference for data choices --> <string name="preferences_data_choices">データの選択</string> <!-- Preference for data collection --> @@ -633,6 +695,17 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">許可されていません</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">必須</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">任意</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">すべてのサイトで許可する</string> + + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">この拡張機能を信頼する場合は、すべてのウェブサイトに対して権限を与えられます。</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">カスタムアドオンコレクション</string> @@ -656,7 +729,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">以前表示したタブ</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">最近追加したブックマーク</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">最近追加したブックマーク</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">ブックマーク</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">最近訪れたサイト</string> @@ -751,8 +826,6 @@ <string name="preferences_sync_history">表示履歴</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">ブックマーク</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">パスワード</string> <!-- Preference for syncing tabs --> @@ -779,8 +852,6 @@ and the third is the device model. --> <string name="default_device_name_2">%2$s %3$s 上の %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">クレジットカード情報</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">支払い方法</string> <!-- Preference for syncing addresses --> @@ -797,6 +868,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s からのタブ</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s のタブを %2$d 個閉じました</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">最近閉じたタブを表示</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">例外</string> @@ -1736,12 +1815,8 @@ <string name="add_to_homescreen_description_2">このウェブサイトを端末のホーム画面に簡単な操作で追加できます。アプリのような感覚で素早くアクセスして閲覧しましょう。</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報とパスワード</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">パスワード</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報を保存する</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">パスワードを保存</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">保存するか確認する</string> @@ -1757,46 +1832,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">端末上の他のアプリにユーザー名とパスワードを入力します。</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報を追加</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">パスワードを追加</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報を同期</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">パスワードを同期</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">端末間でログイン情報を同期します</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">端末間でパスワードを同期</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">保存されたログイン情報</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">保存されたパスワード</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">端末に保存または %s と同期したログイン情報がここに表示されます。</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">%s に保存または同期したパスワードがこのリストに表示されます。保存されたすべてのパスワードは暗号化されます。</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync についての詳細情報。</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Sync についての詳細情報</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">例外</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報が保存されないサイトがここに表示されます。</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s は、このリストに表示されているサイトのパスワードを保存しません。</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">これらのサイトではログイン情報が保存されません。</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s はこれらのサイトのパスワードを保存しません。</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">すべての例外を削除</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報を検索</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">パスワードを検索</string> <!-- The header for the site that a login is for --> @@ -1825,17 +1881,11 @@ <string name="saved_login_reveal_password">パスワードを表示</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">パスワードを隠す</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ロック解除して保存されたログイン情報を表示します</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">保存されたパスワードを表示するにはロック解除してください</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報とパスワードの保護</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">保存されたパスワードを保護してください</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">端末のロックパターンや PIN、パスワードを設定して、保存されたログイン情報とパスワードを他人の不正なアクセスから保護しましょう。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">端末のロックパターンや PIN、パスワードを設定して、保存されたパスワードを他人の不正なアクセスから保護しましょう。</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">後で</string> @@ -1853,8 +1903,6 @@ <string name="saved_logins_sort_strategy_alphabetically">名前 (昇順)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">最終使用日時</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報メニューの並べ替え</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">パスワードを並べ替えます</string> @@ -1864,29 +1912,19 @@ <string name="preferences_autofill">自動入力</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">所在地フォーム</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">クレジットカード</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">支払い方法</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">カード情報を保存して自動入力する</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">支払い方法を保存して入力する</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">データは暗号化されています</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s は保存したすべての支払い方法を暗号化します</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">端末間でカード情報を同期する</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">クレジットカード情報を同期</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">クレジットカードを追加</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">カード情報を追加</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">保存したカードを管理</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">カード情報を管理</string> <!-- Preference option for adding an address --> @@ -1894,12 +1932,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">アドレスの管理</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">アドレスを保存して自動入力する</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">住所を保存して入力する</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">カード番号、メールアドレス、配送先などの情報を含める</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">電話番号とメールアドレスを含みます</string> @@ -1924,8 +1958,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">カードを削除</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">本当にこのクレジットカード情報を削除してもよろしいですか?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">カード情報を削除しますか?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">削除</string> @@ -1939,25 +1971,16 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">保存したカード</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">有効なクレジットカード番号を入力してください</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">正しいカード番号を入力してください</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">このフィールドは入力必須です</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">名前を追加してください</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">保存されたカード情報を表示するにはロック解除してください</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">クレジットカード情報の保護</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">保存された支払い方法を保護してください</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">端末のロックパターンや PIN、パスワードを設定して、保存されたクレジットカード情報とパスワードを他人の不正なアクセスから保護しましょう。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">端末のロックパターンや PIN、パスワードを設定して、保存された支払い方法を他人の不正なアクセスから保護しましょう。</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">今すぐ設定</string> @@ -1966,9 +1989,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">端末のロック解除</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ロックを解除して保存したクレジットカード情報を使用します</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">保存された支払い方法を使用するにはロック解除してください</string> <!-- Title of the "Add address" screen --> @@ -1977,12 +1997,6 @@ <string name="addresses_edit_address">住所の編集</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">アドレスの管理</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">名</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">ミドルネーム</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">姓</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">氏名</string> <!-- The header for the street address of an address --> @@ -2009,8 +2023,6 @@ <string name="addressess_delete_address_button">アドレスを削除</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">本当にこの住所を削除してもよろしいですか?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">このアドレスを削除しますか?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">削除</string> @@ -2108,8 +2120,6 @@ <string name="login_menu_delete_button">削除</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">編集</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">このログイン情報を削除してもよろしいですか?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">本当にこのパスワードを削除してもよろしいですか?</string> <!-- Positive action of a dialog asking to delete --> @@ -2117,41 +2127,23 @@ <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">キャンセル</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">ログインオプション</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">パスワードのオプション</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報のウェブアドレスの編集可能なテキストフィールド。</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">ウェブサイトのアドレスの編集可能なテキストフィールド。</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報のユーザー名の編集可能なテキストフィールド。</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">ユーザー名の編集可能なテキストフィールド。</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ログイン情報のパスワードの編集可能なテキストフィールド。</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">パスワードの編集可能なテキストフィールド。</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">変更を保存してログインします。</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">変更を保存します。</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">編集</string> <!-- The page title for editing a saved password. --> <string name="edit_2">パスワードを編集</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">新しいログイン情報の追加</string> <!-- The page title for adding new password. --> <string name="add_login_2">パスワードを追加</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">パスワードが必要です</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">パスワードを入力してください</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ユーザー名は必須です</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">ユーザー名を入力してください</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">ホスト名は必須です</string> @@ -2497,10 +2489,14 @@ <string name="translations_bottom_sheet_translate_from">翻訳元</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">翻訳先</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">別の翻訳元言語を試す</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">後で</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">元の言語で表示</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">翻訳されていない元のページが読み込まれました</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">完了</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2520,7 +2516,7 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">申し訳ありませんが、%1$s はまだサポートされていません。</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">詳細情報</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">詳細情報</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> <string name="translation_in_progress_snackbar">翻訳中…</string> @@ -2535,7 +2531,9 @@ <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">翻訳オプション</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">翻訳オプション</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">翻訳オプション</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">常に翻訳機能を提供する</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2553,6 +2551,12 @@ <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">%1$s の翻訳機能について</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">翻訳シートを閉じる</string> + + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">一部の設定が一時的に利用できません。</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">翻訳</string> @@ -2576,6 +2580,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">設定で「常に翻訳する」言語と「翻訳しない」言語を選択します。</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">言語を読み込めませんでした。後でもう一度ご確認ください。</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">翻訳を通知する (既定)</string> @@ -2598,6 +2605,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s を削除します</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">サイトを読み込めませんでした。後でもう一度ご確認ください。</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s を削除しますか?</string> @@ -2675,12 +2684,19 @@ <string name="debug_drawer_title">デバッグツール</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">前のページへ戻ります</string> + + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">デバッグパネルを開く</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">タブツール</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">タブ数</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">使用中</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">使用中</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">使用中</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">休止中</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2691,10 +2707,63 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">タブ作成ツール</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">作成するタブの数</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">テキストフィールドが空です</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">正の整数を入力してください</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">0 より大きい数字を入力してください</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">1 回の操作で生成できるタブの上限 (%1$s 個) に達しました</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">使用中のタブに追加</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">休止中のタブに追加</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">プライベートタブに追加</string> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">続ける</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">このアンケートにご回答ください</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">プライバシー通知</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">送信</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">閉じる</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">フィードバックのご提供ありがとうございます。</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">とても満足</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">満足</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">どちらでもない</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">不満</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">非常に不満</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">アンケートを開く</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">アンケートを閉じる</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">閉じる</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">ログイン情報</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">現在のドメイン: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">このドメインの疑似ログイン情報を追加</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">ユーザー名 %s のログイン情報を削除します</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-kab/strings.xml b/mobile/android/fenix/app/src/main/res/values-kab/strings.xml index 65fa7f8a0c..0c17e45335 100644 --- a/mobile/android/fenix/app/src/main/res/values-kab/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-kab/strings.xml @@ -51,12 +51,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Yettwasekles melmi kan</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Yettwasekles melmi kan</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Sken akk ticraḍ n yisebtar yettwaskelsen</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Sken akk ticraḍ n yisebtar yettwaskelsen</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Kkes</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Kkes</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Ticraḍ n yisebtar</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Sken akk ticraḍ n yisebtar</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Kkes</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s d afares n Mozilla.</string> @@ -196,6 +204,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Izegrar</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Isiɣzaf</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Sefrek isiɣzaf</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Talut n umiḍan</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,12 +230,18 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="resync_button_content_description">Ales amtawi</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Nadi deg usebter</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Nadi deg usebter…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Suqel asebter</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Sekles deg tegrumma…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Sekles ɣer tegrumma</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Bḍu</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Bḍu…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Ldi di %1$s</string> @@ -257,6 +273,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="browser_menu_sign_in">Kcem</string> <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> <string name="browser_menu_sign_in_caption">Mtawi awalen n uεeddi, accaren akked wayen niḍen</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Ales qqen i wakken ad tesnekreḍ amtawi</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Amtawa yeḥbes</string> <!-- Browser menu label that creates a private tab --> <string name="browser_menu_new_private_tab">Iccer uslig amaynut</string> <!-- Browser menu label that navigates to the Password screen --> @@ -265,6 +285,28 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara The first parameter is the name of the app defined in app_name (for example: Fenix)--> <string name="browser_menu_new_in_firefox">Amaynut deg %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Ddu ɣer usmel n tnarit</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Ifecka</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Sekles</string> + + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Creḍ asebter-a</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Ẓreg tacreḍt n usebter</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Kles d PDF…</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Suqel asebter…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Suqqel ɣer %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Siggez…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ulac isiɣzaf dagi</string> @@ -280,6 +322,11 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Content description for the translate page toolbar button that opens the translations dialog when no translation has occurred. --> <string name="browser_toolbar_translate">Suqel asebter</string> + <!-- Content description (not visible, for screen readers etc.) for the translate page toolbar button that opens the translations dialog when the page is translated successfully. + The first parameter is the name of the language that is displayed in the original page. (For example: English) + The second parameter is the name of the language which the page was translated to. (For example: French) --> + <string name="browser_toolbar_translated_successfully">Asebter yettwasuqqel seg %1$s ɣer %2$s.</string> + <!-- Locale Settings Fragment --> <!-- Content description for tick mark on selected language --> <string name="a11y_selected_locale_content_description">Fren tutlayt</string> @@ -358,8 +405,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Tasertit tabaḍnit n Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Issin ugar deg tsertit-nneɣ n tbaḍnit</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nḥemmel ad teqqimeḍ d aɣellsan</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> @@ -550,6 +595,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="preferences_account_sync_error">Ales tuqqna akken ad ikemmel umtawi</string> <!-- Preference for language --> <string name="preferences_language">Tutlayt</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tasuqilt</string> + <!-- Preference for translations --> + <string name="preferences_translations">Tisuqilin</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Afran n yisefka</string> <!-- Preference for data collection --> @@ -604,6 +653,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Preference for add_ons --> <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Izegrar</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Isiɣzaf</string> <!-- Preference for installing a local add-on --> <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Sebded azegrir seg ufaylu</string> <!-- Preference for installing a local extension --> @@ -621,10 +672,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Yettawsra</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Afrayan</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Γeṛ syen tesnefleḍ isefka n usmel web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Kkes asmel web</string> + + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Sireg meṛṛa ismal</string> <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> @@ -645,7 +695,9 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Uɣal ɣer deffir</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Ticraḍ n yisebtar n melmi kan</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Ticraḍ n yisebtar n melmi kan</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Ticraḍ n yisebtar</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Yemmẓer melmi kan</string> @@ -697,18 +749,27 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Izegrar imaynuten llan tura</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Llan akka tura isiɣzaf imaynuten</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Snirem ugar n 100 yisiɣzaf imaynuten ara ak·akem-yeǧǧen ad tsagneḍ Firefox.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Snirem izegrar</string> + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Snirem isiɣzaf</string> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Azegrir yensa i kra n wakud</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">Isiɣzaf nsan i kra n wakud</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Yiwen neɣ ugar n yizegrar ḥebsen, rran anagraw-ik d arurkid. %1$s ur yessaweḍ ara ad yales asenker n uzegrir(yizegrar).\n\nIzegrar ugin ad alsen tanekra ɣef teɣzi n tiɣimit-a.\n\Kkes neɣ sens izegrar-a, ahat ad yefru wugur-a.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Ɛreḍ asenker n uzegrir</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Ԑreḍ allus n usenker n yisiɣzaf</string> <!-- The user will continue with all add-ons disabled --> <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Kemml s uzegrir yensa</string> @@ -725,8 +786,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="preferences_sync_history">Azray</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Ticraḍ n yisebtar</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inekcam</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Awalen uffiren</string> <!-- Preference for syncing tabs --> @@ -754,8 +813,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara and the third is the device model. --> <string name="default_device_name_2">%1$s deg %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tikarḍiwin n usmad</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Tarrayin n uxelleṣ</string> <!-- Preference for syncing addresses --> @@ -1709,12 +1766,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="add_to_homescreen_description_2">Tzemreḍ s sshal ad ternuḍ asmel-a web ɣer ugdil agejdan n yibenk-inek·inem i wakken ad tesɛuḍ anekcum askudan d tunigin taruradt s termt i icuban asnas.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Inekcam d wawalen uffiren</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Awalen uffiren</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sekles inekcam d wawalen uffiren</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Sekles awalen uffiren</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Suter asekles</string> @@ -1730,38 +1783,19 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Ččar ismawen n useqdac d wawalen uffiren deg yisnasen-nniḍen ɣef yibenk-ik·im.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Rnu anekcum</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Rnu awal uffir</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Mtawi inekcam</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Mtawi awalen uffiren</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Mtawi inekcam gqr yibenkan</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inekcam yettwakelsen</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Awalen uffiren yettwakelsen</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Anekcum i tḥerzeḍ ɣer %s ad d-ittwasken da.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Issin ugar ɣef umtawi.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Issin ugar ɣef umtawi</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Tisuraf</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Inekcam akked wawalen uffiren ur yettwaskelsen ara ad ttwaseknen dagi.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Inekcam akked wawalen uffiren ur ttwaseklasen ara i yismal-a.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Kkes akk tisuraf</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Nadi inekcam</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Nadi awalen uffiren</string> <!-- The header for the site that a login is for --> @@ -1790,14 +1824,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="saved_login_reveal_password">Sken awal uffir</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ffer awal uffir</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Serreḥ akken ad tsekneḍ inekcam-ik yettwaskelsen</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Mmesten inekcam d wawalen uffiren</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Seɣles awalen-ik·im uffiren i yettwaskelsen</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sbadu azenziɣ n usekkeṛ, tangal PIN, neɣ awal uffir akken ad temmesteneḍ inekcam-ik akked wawlen-ik uffiren yettwaskelsen ticki yella win ikecmen ɣer yibenk-ik.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Ticki</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1815,44 +1843,34 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Aseqdec aneggaru</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Umuɣ n usemyizwer n yinekcam</string> + <!-- Content description (not visible, for screen readers etc.) --> + <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Umuɣ n usmizwer n wawalen n uεeddi</string> <!-- Autofill --> <!-- Preference and title for managing the autofill settings --> <string name="preferences_autofill">Taččart tawurmant</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Tansiwin</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Tikarḍiwin n usmad</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Tarrayin n uxelleṣ</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Asekles d taččart tawurmant n tkarḍiwin</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Isefka ttwawgelhen</string> + <string name="preferences_credit_cards_save_and_autofill_cards_2">Sekles syen ččar tarrayin n uxelleṣ</string> + <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> + <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s yettewgellih akk tarrayin n uxelleṣ i teskelseḍ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Mtawi tikarḍiwin gar yibenkan</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Mtawi tikarḍiwin</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Rnu takarḍa n usmad</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Rnu takarḍa</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Sefrek tikerḍiwin yettwaskelsen</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Sefrek tikarḍiwin</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Rnu tansa</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Sefrek tansiwin</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Asekles d taččart tawurmant n tansiwin</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Sekles; teččareḍ tansiwin</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Seddu talɣut am wuṭṭunen, imayl akked tansiwin n usiweḍ</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Seddu ula uṭṭunen n tiliɣri d tansiwin n yimayl</string> @@ -1876,8 +1894,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kkes takarḍa</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tebɣiḍ s tidet ad tekkseḍ takarḍa-a n usmad?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kkes takarḍa?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Kkes</string> @@ -1890,42 +1906,31 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Tikerḍiwin yettwasekles</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ma ulac aɣilif sekcem uṭṭun ameɣtu n tkarḍa n usmad</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Sekcem uṭṭun n tkarḍa ameɣtu</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ttxil-k·m ččar urti-a</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Rnu isem</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Kkes asekkeṛ i wakken ad twaliḍ tikerḍiwin-ik·im yettwaskelsen</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Seɣles tikerḍiwin-ik·im n usmad</string> + <string name="credit_cards_warning_dialog_title_2">Seɣles tarrayin-ik n uxelleṣ i yettwaskelsen</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Sbadu taneɣruft n usekkeṛ n yibenk, tangalt PIN neq awal uffir i ummesten n tkerḍiwin-ik·im n usmad yettwaskelsen ticki yella win ikecmen ɣer yibenk-inek·inem.</string> + <string name="credit_cards_warning_dialog_message_3">Sbadu taneɣruft n usekkeṛ n yibenk, tangalt PIN neq awal uffir i ummesten n tarrayin-ik·im n usmad yettwaskelsen ticki yella win ikecmen ɣer yibenk-inek·inem.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Sbadu tura</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_later">Ticki</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Serreḥ i ibenk-inek·inem</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Kkes asekkeṛ i wakken ad tesqedceḍ talɣut n tkarḍa n usmad</string> + <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> + <string name="credit_cards_biometric_prompt_unlock_message_2">Kkes asekkeṛ tarrayin-ik n uxelleṣ i yettwaskelsen</string> <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Rnu tansa</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Ẓreg tansa</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Sefrek tansiwin</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Aɣara</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Isem alemmas</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Isem</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Isem</string> <!-- The header for the street address of an address --> @@ -1952,8 +1957,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="addressess_delete_address_button">Kkes tansa</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">D tidet tebɣiḍ ad tekkseḍ tansa-a?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Kkes tansa-a?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Kkes</string> @@ -2053,41 +2056,29 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <string name="login_menu_delete_button">Kkes</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Ẓreg</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tebɣiḍ ad tekseḍ anekcum-agi?</string> + <!-- Message in delete confirmation dialog for password --> + <string name="login_deletion_confirmation_2">D tidet tebɣiḍ ad tekkseḍ awal-a n uεeddi?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Kkes</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Sefsex</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Iɣewwaren n unekcum</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Tixtiṛiyin n wawal uffir</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Urti n uḍris yettusenfal i tansa n unekcum n web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Urti n uḍris yettusenfal i yisem n useqdac n unekcum.</string> + <!-- The editable text field for a website address. --> + <string name="saved_login_hostname_description_3">Urti n uḍris yettusenfal i tansa n usmel web.</string> + <!-- The editable text field for a username. --> + <string name="saved_login_username_description_3">Urti n uḍris yettusenfal i yisem n useqdac.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Urti n uḍris yettusenfal i wawal uffir n unekcum.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Sekles isenfaln unekcum.</string> + <string name="saved_login_password_description_2">Urti n uḍris yettusenfal i wawal n uεeddi.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Sekles isenfal.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Ẓreg</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Ẓreg awal uffir</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Rnu anekcum amaynut</string> <!-- The page title for adding new password. --> <string name="add_login_2">Rnu awal uffir</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Awal uffir yettusra</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Sekcem awal uffir</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Isem n useqdac yettwasra</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Sekcem isem n useqdac</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Asenneftaɣ yettwasra</string> @@ -2510,7 +2501,7 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Amḍan n waccaren</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Urmid</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Urmid</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Insa</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2518,12 +2509,50 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara <!-- The total tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_total">Asemday</string> + <!-- The button text to add tabs to the active tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Rnu ɣer waccaren urmiden</string> + <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Rnu ɣer waccaren irurmiden</string> + <!-- The button text to add tabs to the private tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Rnu ɣer waccaren usligen</string> + <!-- Micro survey --> + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Kemmel</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Smed aḥedqis-a</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Tasertit n tbaḍnit</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Azen</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Mdel</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Tanemmirt ɣef tekti yinek!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Yumer aṭas</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Y·Tumer</string> <!-- Option for likert scale --> <string name="likert_scale_option_3" tools:ignore="UnusedResources">War tamawt</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Ur yumir ara</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Texseṛ-as akk nniya</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Ldi aḥedqis</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Mdel aḥedqis</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Mdel</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Inekcam</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Taɣult-a: %s</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-kk/strings.xml b/mobile/android/fenix/app/src/main/res/values-kk/strings.xml index eec9afe73c..cb9da8fe5c 100644 --- a/mobile/android/fenix/app/src/main/res/values-kk/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-kk/strings.xml @@ -198,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Қосымшалар</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Кеңейтулер</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Кеңейтулерді басқару</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Көбірек кеңейтулерді табу</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Тіркелгі ақпараты</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -216,6 +220,8 @@ <string name="browser_menu_open_in_regular_tab">Қалыпты бетте ашу</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Үй экранына қосу</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Үй экранына қосу…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Орнату</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -227,9 +233,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Парақты аудару</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Жинаққа сақтау…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Жинаққа сақтау</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Бөлісу</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Бөлісу…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s көмегімен ашу</string> @@ -282,6 +292,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Сақтау</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Бұл бетті бетбелгілерге қосу</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Бетбелгіні түзету</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF ретінде сақтау…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Оқу көрінісін іске қосу</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Оқу көрінісін сөндіру</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Парақты аудару…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s тіліне аударылған</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Баспаға шығару…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Мұнда кеңейтулер жоқ</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox жекелік ескертуі</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Біздің жекелік ескертуімізден көбірек біліңіз</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Біз сіздің қауіпсіздігіңізді қамтамасыз етуді жақсы көреміз</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -591,7 +617,9 @@ <!-- Preference for language --> <string name="preferences_language">Тіл</string> <!-- Preference for translation --> - <string name="preferences_translation">Аударма</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Аударма</string> + <!-- Preference for translations --> + <string name="preferences_translations">Аудармалар</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Деректер таңдауы</string> <!-- Preference for data collection --> @@ -663,10 +691,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Міндетті</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Міндетті емес</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Веб-сайт деректерін оқу және өзгерту</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Веб-сайтты өшіру</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Барлық сайттар үшін рұқсат ету</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -792,8 +816,6 @@ <string name="preferences_sync_history">Шолу тарихы</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Бетбелгілер</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндер</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Парольдер</string> <!-- Preference for syncing tabs --> @@ -819,8 +841,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s, %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Несиелік карталар</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Төлем әдістері</string> <!-- Preference for syncing addresses --> @@ -836,6 +856,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s құрылғысынан бет</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s бет жабылды: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Жақында жабылған беттерді қарау</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Ережеден бөлек</string> @@ -1762,12 +1790,8 @@ <string name="add_to_homescreen_description_2">Бұл веб-сайтты жылдам қатынау және қолданба тектес режимде жылдам шолу мақсатымен құрылғыңыздың үй бетіңізге қосуға болады.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндер және парольдер</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Парольдер</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндер және парольдерді сақтау</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Парольдерді сақтау</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Сақтау алдында сұрау</string> @@ -1784,46 +1808,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Құрылғыңыздағы басқа қолданбаларда пайдаланушы аттары мен парольдерін толтыру.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Логинді қосу</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Парольді қосу</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндерді синхрондау</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Парольдерді синхрондау</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндерді құрылғылар арасында синхрондау</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Парольдерді құрылғылар арасында синхрондау</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Сақталған логиндер</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Сақталған парольдер</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Сіз %s ішінде сақтаған немесе синхрондаған логиндер осында көрсетіледі.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Сіз %s ішіне сақтаған немесе синхрондаған парольдер осында тізіліп көрсетіледі. Сіз сақтаған барлық парольдер шифрленген.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхрондау туралы көбірек біліңіз.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Синхрондау туралы көбірек біліңіз</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Ережеден бөлек</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Сақталмаған логиндер мен парольдер осында көрсетіледі.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s осы жерде тізімделген сайттар үшін парольдерді сақтамайтын болады.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Бұл сайттар үшін логиндер мен парольдер сақталмайды.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s бұл сайттар үшін парольдерді сақтамайтын болады.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Барлық ережеден тыс жағдайларды өшіру</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндерден іздеу</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Парольдерді іздеу</string> <!-- The header for the site that a login is for --> @@ -1852,17 +1857,11 @@ <string name="saved_login_reveal_password">Парольді көрсету</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Парольді жасыру</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Сақталған логиндеріңізді көру үшін бұғаттауын ашыңыз</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Сақталған парольдеріңізді көру үшін бұғаттауын ашыңыз</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндер және парольдерді қорғаңыз</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Сақталған парольдерді қорғаңыз</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Бөтен адам сіздің құрылғыңызда болса, одан сақталған логиндер мен парольдерді қорғау үшін құрылғының бұғаттау үлгісін, PIN-кодын немесе парольді орнатыңыз.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Бөтен адам сіздің құрылғыңызда болса, одан сақталған парольдеріңізді қорғау үшін құрылғының бұғаттау үлгісін, PIN-кодын немесе парольді орнатыңыз.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Кейінірек</string> @@ -1879,8 +1878,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Аты (А-Я)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Соңғы қолданылған</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиндерді сұрыптау мәзірі</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Парольдерді сұрыптау мәзірі</string> @@ -1890,41 +1887,27 @@ <string name="preferences_autofill">Автотолтыру</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Адрестер</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Несиелік карталар</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Төлем әдістері</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Карталарды сақтау және автотолтыру</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Төлем әдістерін сақтау және толтыру</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Деректер шифрленген</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s сіз сақтаған барлық төлем әдістерін шифрлейді</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Карталарды құрылғылар арасында синхрондау</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Карталарды синхрондау</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Несиелік картаны қосу</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Картаны қосу</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Сақталған карталарды басқару</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Карталарды басқару</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Адресті қосу</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Адрестерді басқару</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Адрестерді сақтау және автотолтыру</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Адрестерді сақтау және толтыру</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Нөмірлер, эл. пошта және жеткізу адрестері сияқты ақпаратты қосу</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Телефон нөмірлері мен электрондық пошта адрестерін қамтиды</string> @@ -1948,8 +1931,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Картаны өшіру</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Бұл несие картасын өшіруді шынымен қалайсыз ба?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Картаны өшіру керек пе?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Өшіру</string> @@ -1963,24 +1944,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Сақталған карталар</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Несиелік картаның жарамды нөмірін енгізіңіз</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Жарамды карта нөмірін енгізіңіз</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Бұл өрісті толтырыңыз</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Атын қосыңыз</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Сақталған карталарыңызды көру үшін бұғаттауын ашыңыз</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Несиелік карталарыңызды қорғаңыз</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Сақталған төлем әдістерін қорғаңыз</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Бөтен адам сіздің құрылғыңызда болса, одан сақталған несиелік карталарды қорғау үшін құрылғының бұғаттау үлгісін, PIN-кодын немесе парольді орнатыңыз.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Бөтен адам сіздің құрылғыңызда болса, одан сақталған төлем әдістерін қорғау үшін құрылғының бұғаттау үлгісін, PIN-кодын немесе парольді орнатыңыз.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Қазір баптау</string> @@ -1989,9 +1961,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Құрылғының бұғаттауын ашыңыз</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Сақталған несиелік карта ақпаратын қолдану үшін бұғаттауын ашыңыз</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Сақталған төлем әдістерін қолдану үшін құлыптан босатыңыз</string> <!-- Title of the "Add address" screen --> @@ -2000,12 +1969,6 @@ <string name="addresses_edit_address">Адресті түзету</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Адрестерді басқару</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Аты</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Әкесінің аты</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Тегi</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Аты</string> <!-- The header for the street address of an address --> @@ -2033,8 +1996,6 @@ <string name="addressess_delete_address_button">Адресті өшіру</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Бұл адресті өшіруді шынымен қалайсыз ба?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Бұл адресті өшіру керек пе?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Өшіру</string> @@ -2131,50 +2092,30 @@ <string name="login_menu_delete_button">Өшіру</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Түзету</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Бұл логинді өшіруді қалайсыз ба?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Бұл парольді өшіруді шынымен қалайсыз ба?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Өшіру</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Бас тарту</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Логин баптаулары</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Пароль опциялары</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиннің веб-адресі үшін түзетуге болатын мәтіндік өрісі.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Веб-сайт адресі үшін түзетуге болатын мәтіндік өрісі.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиннің пайдаланушы аты үшін түзетуге болатын мәтіндік өрісі.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Пайдаланушы аты үшін түзетуге болатын мәтіндік өрісі.</string> - <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Логиннің паролі үшін түзетуге болатын мәтіндік өрісі.</string> <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Пароль үшін түзетуге болатын мәтіндік өрісі.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Логин өзгерістерін сақтау.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Өзгерістерді сақтау.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Түзету</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Парольді түзету</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Жаңа логинді қосу</string> <!-- The page title for adding new password. --> <string name="add_login_2">Парольді қосу</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Пароль керек</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Парольді енгізіңіз</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Пайдаланушы аты керек</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Пайдаланушы атын енгізіңіз</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Хост атауы керек</string> @@ -2524,6 +2465,8 @@ <string name="translations_bottom_sheet_negative_button">Қазір емес</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Түпнұсқаны көрсету</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Аударылмаған түпнұсқа бет жүктелді</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Дайын</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2582,6 +2525,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Аудармалар парағын жабу</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Кейбір баптаулар уақытша қолжетімсіз.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Аудармалар</string> @@ -2604,6 +2550,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">"әрқашан аудару" және "ешқашан аудармау" баптауларды басқару үшін тілді таңдаңыз.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Тілдерді жүктеу мүмкін емес. Кейінірек қайта тексеріңіз.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Аударуды ұсыну (үнсіз келісім бойынша)</string> @@ -2627,6 +2576,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s өшіру</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Сайттарды жүктеу мүмкін емес. Кейінірек қайта тексеріңіз.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s өшіру керек пе?</string> @@ -2705,13 +2656,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Артқа өту</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Жөндеу сөресін ашу</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Беттер саймандары</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Беттер саны</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Белсенді</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Белсенді</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Белсенді</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Белсенді емес</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2722,6 +2678,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Беттерді жасау құралы</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Жасау үшін беттер саны</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Мәтін өрісі бос</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Тек оң сандарды енгізіңіз</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Нөлден үлкен санды енгізіңіз</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Беттер саны бір әрекетте жасауға болатын максималды санынан (%1$s) асты</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Белсенді беттерге қосу</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2738,11 +2704,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Жекелік ескертуі</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Жіберу</string> + <string name="micro_survey_submit_button_label">Жіберу</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Жабу</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Жабу</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Пікіріңізге рахмет!</string> + <string name="micro_survey_feedback_confirmation">Пікіріңізге рахмет!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Өте жақсы</string> <!-- Option for likert scale --> @@ -2754,6 +2720,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Өте нашар</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Сауалнаманы ашу</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Сауалнаманы жабу</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Жабу</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Логиндер</string> diff --git a/mobile/android/fenix/app/src/main/res/values-ko/strings.xml b/mobile/android/fenix/app/src/main/res/values-ko/strings.xml index 3d14dbadd0..5da118bfc3 100644 --- a/mobile/android/fenix/app/src/main/res/values-ko/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-ko/strings.xml @@ -205,6 +205,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">부가 기능</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">확장 기능</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">확장 기능 관리</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">더 많은 확장 기능 살펴보기</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">계정 정보</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -223,6 +227,8 @@ <string name="browser_menu_open_in_regular_tab">일반 탭에서 열기</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">홈 화면에 추가</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">홈 화면에 추가…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">설치</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -234,9 +240,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">페이지 번역</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">모음집에 저장…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">모음집에 저장</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">공유</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">공유…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s에서 열기</string> @@ -291,6 +301,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">저장</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">이 페이지 북마크</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">북마크 편집</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF로 저장…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">리더뷰 켜기</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">리더뷰 끄기</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">페이지 번역…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s 언어로 번역됨</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">인쇄…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">확장 기능 없음</string> @@ -388,8 +416,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox 개인정보처리방침</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">개인정보 보호정책에서 자세히 알아보기</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">우리는 사용자를 안전하게 지키는 것을 좋아합니다</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -600,7 +626,9 @@ <!-- Preference for language --> <string name="preferences_language">언어</string> <!-- Preference for translation --> - <string name="preferences_translation">번역</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">번역</string> + <!-- Preference for translations --> + <string name="preferences_translations">번역</string> <!-- Preference for data choices --> <string name="preferences_data_choices">데이터 선택</string> <!-- Preference for data collection --> @@ -675,10 +703,6 @@ <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">선택 사항</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">웹 사이트 데이터 읽기 및 변경</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">웹 사이트 삭제</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">모든 사이트에 허용</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -805,8 +829,6 @@ <string name="preferences_sync_history">기록</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">북마크</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">비밀번호</string> <!-- Preference for syncing tabs --> @@ -833,8 +855,6 @@ and the third is the device model. --> <string name="default_device_name_2">%2$s %3$s의 %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">신용 카드</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">결제 방법</string> <!-- Preference for syncing addresses --> @@ -851,6 +871,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s에서 온 탭</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s 탭 닫힘: %2$d개</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">최근에 닫은 탭 보기</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">예외 목록</string> @@ -1813,12 +1841,8 @@ <string name="add_to_homescreen_description_2">이 웹 사이트를 기기의 홈 화면에 쉽게 추가하여 앱과 같은 경험을 통해 즉시 액세스하고 더 빠르게 탐색 할 수 있습니다.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인과 비밀번호</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">비밀번호</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인과 비밀번호 저장</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">비밀번호 저장</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">저장할지 묻기</string> @@ -1834,46 +1858,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">기기의 다른 앱에서 사용자 이름과 비밀번호를 채웁니다.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 추가</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">비밀번호 추가</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync 로그인</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">비밀번호 동기화</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">기기 간에 로그인 동기화</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">기기 간에 비밀번호 동기화</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">저장된 로그인</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">저장된 비밀번호</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">%s에 저장하거나 동기화한 로그인이 여기에 표시됩니다.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">%s에 저장하거나 동기화한 비밀번호는 여기에 나열됩니다. 저장한 모든 비밀번호는 암호화됩니다.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync에 대해 더 알아보기.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">동기화에 대해 더 알아보기</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">예외 목록</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">저장되지 않은 로그인과 비밀번호가 여기에 표시됩니다.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s는 여기에 나열된 사이트의 비밀번호를 저장하지 않습니다.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">이 사이트에 대한 로그인과 비밀번호는 저장되지 않습니다.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s는 이 사이트의 비밀번호를 저장하지 않습니다.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">모든 예외 삭제</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 검색</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">비밀번호 검색</string> <!-- The header for the site that a login is for --> @@ -1902,17 +1907,11 @@ <string name="saved_login_reveal_password">비밀번호 보이기</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">비밀번호 숨기기</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">저장된 로그인을 보려면 잠금 해제하세요</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">저장된 비밀번호를 보려면 잠금 해제하세요</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인과 비밀번호 보안</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">저장된 비밀번호를 보호하세요</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">다른 사람이 내 기기를 가지고 있는 경우, 저장된 로그인과 비밀번호에 접근하지 못하도록 기기 잠금 패턴, PIN 또는 비밀번호를 설정하세요.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">다른 사람이 내 기기를 가지고 있는 경우, 저장된 비밀번호에 접근하지 못하도록 기기 잠금 패턴, PIN 또는 비밀번호를 설정하세요.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">나중에</string> @@ -1930,8 +1929,6 @@ <string name="saved_logins_sort_strategy_alphabetically">이름 (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">마지막 사용</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 정렬 메뉴</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">비밀번호 정렬 메뉴</string> @@ -1941,42 +1938,28 @@ <string name="preferences_autofill">자동 채우기</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">주소</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">신용 카드</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">결제 방법</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">카드 저장 및 자동 채우기</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">결제 방법 저장 및 채우기</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">데이터가 암호화됨</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s는 저장한 모든 결제 방법을 암호화합니다</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">기기 간에 카드 동기화</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">카드 동기화</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">신용 카드 추가</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">카드 추가</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">저장된 카드 관리</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">카드 관리</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">주소 추가</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">주소 관리</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">주소 저장 및 자동 채우기</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">주소 저장 및 채우기</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">숫자, 이메일 및 배송 주소와 같은 정보 포함</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">전화번호와 이메일 주소가 포함됩니다</string> @@ -2001,8 +1984,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">카드 삭제</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">이 신용 카드를 삭제하시겠습니까?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">카드를 삭제하시겠습니까?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">삭제</string> @@ -2016,24 +1997,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">저장된 카드</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">유효한 신용 카드 번호를 입력해 주세요</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">유효한 카드 번호를 입력하세요</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">이 항목을 입력하세요.</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">이름 추가</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">저장된 카드를 보려면 잠금 해제하세요</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">신용 카드 보안</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">저장된 결제 방법을 보호하세요</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">다른 사람이 내 기기를 가지고 있는 경우, 저장된 신용 카드에 접근하지 못하도록 기기 잠금 패턴, PIN 또는 비밀번호를 설정하세요.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">다른 사람이 내 기기를 가지고 있는 경우, 저장된 결제 방법에 접근하지 못하도록 기기 잠금 패턴, PIN 또는 비밀번호를 설정하세요.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">지금 설정</string> @@ -2042,9 +2014,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">기기 잠금 해제</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">저장된 신용 카드 정보를 사용하려면 잠금 해제하세요</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">저장된 결제 방법을 사용하려면 잠금 해제하세요</string> <!-- Title of the "Add address" screen --> @@ -2053,12 +2022,6 @@ <string name="addresses_edit_address">주소 편집</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">주소 관리</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">이름</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">중간 이름</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">성</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">이름</string> <!-- The header for the street address of an address --> @@ -2085,8 +2048,6 @@ <string name="addressess_delete_address_button">주소 삭제</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">이 주소를 삭제하시겠습니까?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">이 주소를 삭제하시겠습니까?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">삭제</string> @@ -2185,49 +2146,29 @@ <string name="login_menu_delete_button">삭제</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">편집</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">이 로그인을 삭제하시겠습니까?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">이 비밀번호를 삭제하시겠습니까?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">삭제</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">취소</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 옵션</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">비밀번호 옵션</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 웹 주소의 편집 가능한 텍스트 필드입니다.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">웹 사이트 주소에 대한 편집 가능한 텍스트 필드입니다.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 사용자 이름의 편집 가능한 텍스트 필드입니다.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">사용자 이름에 대한 편집 가능한 텍스트 필드입니다.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">로그인 비밀번호의 편집 가능한 텍스트 필드입니다.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">비밀번호에 대한 편집 가능한 텍스트 필드입니다.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">변경 내용을 로그인에 저장.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">변경 내용 저장.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">편집</string> <!-- The page title for editing a saved password. --> <string name="edit_2">비밀번호 수정</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">새 로그인 추가</string> <!-- The page title for adding new password. --> <string name="add_login_2">비밀번호 추가</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">비밀번호 필요</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">비밀번호 입력</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">사용자 이름은 필수입니다</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">사용자 이름 입력</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">호스트 이름은 필수입니다</string> @@ -2636,6 +2577,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">번역 시트 닫기</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">일부 설정을 일시적으로 사용할 수 없습니다.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">번역</string> @@ -2659,6 +2603,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">”항상 번역“ 및 ”번역 안 함“ 설정을 관리할 언어를 선택하세요</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">언어를 로드할 수 없습니다. 나중에 다시 확인해 주세요.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">번역 제안 (기본값)</string> @@ -2682,6 +2629,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s 제거</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">사이트를 로드할 수 없습니다. 나중에 다시 확인해 주세요.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s 사이트를 삭제하시겠습니까?</string> @@ -2761,13 +2710,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">뒤로</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">디버그 서랍 열기</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">탭 도구</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">탭 수</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">활성</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">활성</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">활성</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">비활성</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2778,6 +2732,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">탭 생성 도구</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">생성할 탭 수량</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">텍스트 필드가 비어 있음</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">양의 정수만 입력하세요</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">0보다 큰 숫자를 입력하세요</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">한 번의 작업으로 생성할 수 있는 최대 탭 수(%1$s)를 초과했음</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">활성 탭에 추가</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2794,12 +2758,12 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">개인정보처리방침</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">보내기</string> + <string name="micro_survey_submit_button_label">보내기</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">닫기</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">닫기</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">의견을 보내 주셔서 감사합니다!</string> + <string name="micro_survey_feedback_confirmation">의견을 보내 주셔서 감사합니다!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">매우 만족</string> <!-- Option for likert scale --> @@ -2811,6 +2775,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">매우 불만족</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">설문조사 열기</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">설문조사 닫기</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">닫기</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">로그인</string> diff --git a/mobile/android/fenix/app/src/main/res/values-nb-rNO/strings.xml b/mobile/android/fenix/app/src/main/res/values-nb-rNO/strings.xml index 3479298722..d435330c22 100644 --- a/mobile/android/fenix/app/src/main/res/values-nb-rNO/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-nb-rNO/strings.xml @@ -48,12 +48,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nylig lagret</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nylig lagret</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Vis alle lagrede bokmerker</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Vis alle lagrede bokmerker</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Fjern</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Fjern</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Bokmerker</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Vis alle bokmerker</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Fjern</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s er produsert av Mozilla.</string> @@ -191,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tillegg</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Utvidelser</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Behandle utvidelser</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Oppdag flere utvidelser</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontoinformasjon</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -210,18 +222,26 @@ <string name="browser_menu_open_in_regular_tab">Åpne i vanlig fane</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Legg til på startskjermen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Legg til på startskjermen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installer</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Synkroniser på nytt</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Finn på siden</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Finn på siden…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Oversett siden</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Lagre i samling…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Lagre i samling</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Del</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Del…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Åpne i %1$s</string> @@ -261,6 +281,34 @@ <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Passord</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Nytt i %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Bytt til datamaskinversjon</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Verktøy</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Lagre</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bokmerk denne siden</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Rediger bokmerke</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Lagre som PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Slå på leservisning</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Slå av leservisning</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Oversett siden…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Oversatt til %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Skriv ut…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ingen utvidelser her</string> @@ -358,8 +406,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox personvernerklæring</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Les mer i vår personvernerklæring</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Vi beskytter deg gjerne</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -566,6 +612,10 @@ <string name="preferences_account_sync_error">Koble til igjen for å fortsette synkroniseringen</string> <!-- Preference for language --> <string name="preferences_language">Språk</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Oversettelse</string> + <!-- Preference for translations --> + <string name="preferences_translations">Oversettelser</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Datavalg</string> <!-- Preference for data collection --> @@ -638,10 +688,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Nødvendig</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valgfri</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Les og endre nettstedsdata</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Slett nettsted</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tillat for alle nettsteder</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -671,7 +717,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Hopp inn igjen</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Nylige bokmerker</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Nylige bokmerker</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Bokmerker</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nylig besøkt</string> @@ -765,8 +813,6 @@ <string name="preferences_sync_history">Historikk</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bokmerker</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Innlogginger</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passord</string> <!-- Preference for syncing tabs --> @@ -793,8 +839,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s på %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betalingsmåter</string> <!-- Preference for syncing addresses --> @@ -811,6 +855,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Fane fra %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s lukket %2$d faner</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Vis nylig lukkede faner</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Unntak</string> @@ -1743,12 +1795,8 @@ <string name="add_to_homescreen_description_2">Du kan enkelt legge til dette nettstedet på enhetens startskjerm for å få øyeblikkelig tilgang og surfe raskere med en app-lignende opplevelse.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Innlogginger og passord</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passord</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre innlogginger og passord</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Lagre passord</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Spør om å lagre</string> @@ -1764,47 +1812,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fyll inn brukernavn og passord i andre apper på enheten din.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til innlogging</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Legg til passord</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser innlogginger</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synkroniser passord</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser innlogginger på tvers av enheter</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synkroniser passord på tvers av enheter</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagrede innlogginger</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Lagrede passord</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">De innlogginger du lagrer eller synkroniserer til %s vil vises her.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Passordene du lagrer eller synkroniserer med %s vil bli oppført her. Alle passord du lagrer er kryptert.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Les mer om Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Les mer om synkronisering</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Unntak</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Innlogginger og passord som ikke er lagret vil vises her.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s vil ikke lagre passord for nettsteder som er oppført her.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Innlogginger og passord vil ikke bli lagret for disse nettstedene.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s vil ikke lagre passord for disse nettstedene.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Slett alle unntak</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Søk innlogginger</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Søk etter passord</string> <!-- The header for the site that a login is for --> @@ -1834,17 +1863,11 @@ <string name="saved_login_reveal_password">Vis passord</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Skjul passord</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås opp for å se dine lagrede innlogginger</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Lås opp for å se dine lagrede passord</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Sikre dine innlogginger og passord</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Sikre dine lagrede passord</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Konfigurer en PIN-kode, et passord eller et låsemønster for å forhindre at andre mennesker får tilgang de lagrede innloggingene og passordene dine, hvis de har adgang til din enhet.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Konfigurer en PIN-kode, et passord eller et låsemønster for å beskytte dine lagrede passord om noen andre skulle få tak i enheten din.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Senere</string> @@ -1864,9 +1887,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Sist brukt</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sorter innlogginger-meny</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Sorter passord-menyen</string> @@ -1875,41 +1895,27 @@ <string name="preferences_autofill">Autofyll</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresser</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betalingsmåter</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre og fyll ut kort automatisk</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Lagre og fyll inn betalingsmåter</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data er kryptert</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s krypterer alle betalingsmåter du lagrer</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synkroniser kort på tvers av enheter</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synkroniser kort</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til betalingskort</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Legg til kort</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Behandle lagrede kort</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Behandle kort</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Legg til adresse</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Behandle adresser</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre og autoutfyll adresser</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Lagre og fyll ut adresser</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inkluderer informasjon som telefonnummer, e-post og leveringsadresser</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inkluderer telefonnumre og e-postadresser</string> @@ -1933,8 +1939,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Slett kort</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du vil slette dette bankkortet?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Slett kort?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Slett</string> @@ -1947,24 +1951,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Lagrede kort</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Oppgi et gyldig betalingskortnummer</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Skriv inn et gyldig kortnummer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Fyll ut dette feltet</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Legg til et navn</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Lås opp for å se dine lagrede betalingskort</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Sikre dine betalingskort</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Sikre dine lagrede betalingsmåter</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Konfigurer en PIN-kode, et passord eller et låsemønster for å beskytte de lagrede betalingskortene dine om noen andre skulle få tak i enheten din.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Konfigurer en PIN-kode, et passord eller et låsemønster for å beskytte dine lagrede betalingsmåter om noen andre skulle få tak i enheten din.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Konfigurer nå</string> @@ -1973,9 +1968,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Lås opp enheten din</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås opp for å bruke lagret betalingskortinformasjon</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Lås opp for å bruke lagrede betalingsmåter</string> <!-- Title of the "Add address" screen --> @@ -1984,12 +1976,6 @@ <string name="addresses_edit_address">Rediger adresse</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Behandle adresser</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Fornavn</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Mellomnavn</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Etternavn</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Navn</string> <!-- The header for the street address of an address --> @@ -2016,8 +2002,6 @@ <string name="addressess_delete_address_button">Slett adresse</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du vil slette denne adressen?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Slette denne adressen?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Slett</string> @@ -2117,49 +2101,29 @@ <string name="login_menu_delete_button">Slett</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Rediger</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du ønsker å slette denne innloggingen?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Er du sikker på at du ønsker å slette dette passordet?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Slett</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Avbryt</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingsalternativer</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Passordalternativer</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggingens nettadresse.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Det redigerbare tekstfeltet for nettstedsadressen.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggingens brukernavn.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Det redigerbare tekstfeltet for brukernavnet.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggingens passord.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Det redigerbare tekstfeltet for passordet.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre endringer for innlogging.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Lagre endringer.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Rediger</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Rediger passord</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til ny innlogging</string> <!-- The page title for adding new password. --> <string name="add_login_2">Legg til passord</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Passord kreves</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Skriv inn et passord</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Brukernavn påkrevd</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Skriv inn et brukernavn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Servernavn påkrevd</string> @@ -2508,6 +2472,8 @@ <string name="translations_bottom_sheet_negative_button">Ikke nå</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Vis original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Original uoversatt side lastet inn</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Ferdig</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2564,6 +2530,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Lukk oversettelsesarket</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Noen innstillinger er midlertidig utilgjengelige.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Oversettelser</string> @@ -2588,6 +2557,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Velg et språk for å behandle innstillinger for «oversett alltid» og «oversett aldri».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Kunne ikke laste inn språk. Prøv igjen senere.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Tilby å oversette (standard)</string> @@ -2610,6 +2582,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Fjern %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Kunne ikke laste inn nettsteder. Prøv igjen senere.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Vil du slette %1$s?</string> @@ -2687,13 +2661,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Naviger tilbake</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Åpne feilsøkingsskuffen</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Faneverktøy</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Antall faner</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiv</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiv</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiv</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktiv</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2704,6 +2683,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Verktøy for å lage faner</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Antall faner som skal opprettes</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstfeltet er tomt</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Angi bare positive heltall</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Skriv inn et tall større enn null</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Overskredet det maksimale antallet faner (%1$s) som kan genereres i én operasjon</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Legg til aktive faner</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2711,6 +2700,39 @@ <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Legg til private faner</string> + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Fortsett</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Gjennomfør denne undersøkelsen</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Personvernbestemmelser</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Send</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Lukk</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Takk for tilbakemeldingen!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Veldig fornøyd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Fornøyd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Nøytral</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Misfornøyd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Veldig misfornøyd</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Åpen undersøkelse</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Lukk undersøkelse</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Lukk</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Innlogginger</string> diff --git a/mobile/android/fenix/app/src/main/res/values-night/colors.xml b/mobile/android/fenix/app/src/main/res/values-night/colors.xml index 2b7178b3d2..228a8df4af 100644 --- a/mobile/android/fenix/app/src/main/res/values-night/colors.xml +++ b/mobile/android/fenix/app/src/main/res/values-night/colors.xml @@ -26,11 +26,11 @@ <!-- Warning background --> <color name="fx_mobile_layer_color_warning" tools:ignore="UnusedResources">@color/photonYellow70A77</color> <!-- Confirmation background --> - <color name="fx_mobile_layer_color_confirmation" tools:ignore="UnusedResources">@color/photonGreen80</color> + <color name="fx_mobile_layer_color_success" tools:ignore="UnusedResources">@color/photonGreen80</color> <!-- Error background --> - <color name="fx_mobile_layer_color_error" tools:ignore="UnusedResources">@color/photonPink80</color> + <color name="fx_mobile_layer_color_critical" tools:ignore="UnusedResources">@color/photonPink80</color> <!-- Info background --> - <color name="fx_mobile_layer_color_info" tools:ignore="UnusedResources">@color/photonBlue50A80</color> + <color name="fx_mobile_layer_color_information" tools:ignore="UnusedResources">@color/photonBlue50</color> <!-- Search --> <color name="fx_mobile_layer_color_search">@color/photonDarkGrey80</color> @@ -40,7 +40,7 @@ <!-- Primary button in a disabled state--> <color name="fx_mobile_action_color_primary_disabled" tools:ignore="UnusedResources">@color/photonViolet60A50</color> <!-- Secondary button --> - <color name="fx_mobile_action_color_secondary">@color/photonLightGrey30</color> + <color name="fx_mobile_action_color_secondary">@color/photonDarkGrey05</color> <!-- Filter --> <color name="fx_mobile_action_color_tertiary" tools:ignore="UnusedResources">@color/photonDarkGrey10</color> <!-- Chip --> @@ -48,11 +48,11 @@ <!-- Warning button --> <color name="fx_mobile_action_color_warning" tools:ignore="UnusedResources">@color/photonYellow40A41</color> <!-- Confirmation button --> - <color name="fx_mobile_action_color_confirmation" tools:ignore="UnusedResources">@color/photonGreen70</color> + <color name="fx_mobile_action_color_success" tools:ignore="UnusedResources">@color/photonGreen70</color> <!-- Error button --> - <color name="fx_mobile_action_color_error" tools:ignore="UnusedResources">@color/photonPink70A69</color> + <color name="fx_mobile_action_color_critical" tools:ignore="UnusedResources">@color/photonPink70A69</color> <!-- Info button --> - <color name="fx_mobile_action_color_info" tools:ignore="UnusedResources">@color/photonBlue30</color> + <color name="fx_mobile_action_color_information" tools:ignore="UnusedResources">@color/photonBlue60</color> <!-- Checkbox default, Radio button default --> <color name="fx_mobile_action_color_form_default" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Checkbox selected, Radio button selected --> @@ -78,9 +78,9 @@ <!-- Disabled text --> <color name="fx_mobile_text_color_disabled">@color/photonLightGrey05A40</color> <!-- Warning text --> - <color name="fx_mobile_text_color_warning">@color/photonRed20</color> + <color name="fx_mobile_text_color_critical">@color/photonRed20</color> <!-- Warning text on Secondary button --> - <color name="fx_mobile_text_color_warning_button">@color/photonRed70</color> + <color name="fx_mobile_text_color_critical_button">@color/photonRed20</color> <!-- Small heading, Text link --> <color name="fx_mobile_text_color_accent">@color/photonViolet20</color> <!-- Small heading, Text link --> @@ -94,7 +94,7 @@ <!-- Action Primary disabled text --> <color name="fx_mobile_text_color_action_primary_disabled" tools:ignore="UnusedResources">@color/photonLightGrey05A40</color> <!-- Action Secondary text --> - <color name="fx_mobile_text_color_action_secondary">@color/photonDarkGrey90</color> + <color name="fx_mobile_text_color_action_secondary">@color/photonLightGrey05</color> <!-- Action Tertiary text --> <color name="fx_mobile_text_color_action_tertiary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Tertiary Active text --> @@ -117,9 +117,9 @@ <color name="fx_mobile_icon_color_information">@color/photonBlue30</color> <!-- Icon button --> <color name="fx_mobile_icon_color_button" tools:ignore="UnusedResources">@color/photonLightGrey05</color> - <color name="fx_mobile_icon_color_warning" tools:ignore="UnusedResources">@color/photonRed20</color> + <color name="fx_mobile_icon_color_critical" tools:ignore="UnusedResources">@color/photonRed20</color> <!-- Warning icon on Secondary button --> - <color name="fx_mobile_icon_color_warning_button">@color/photonRed70</color> + <color name="fx_mobile_icon_color_critical_button">@color/photonRed20</color> <color name="fx_mobile_icon_color_accent_violet">@color/photonViolet20</color> <color name="fx_mobile_icon_color_accent_blue">@color/photonBlue20</color> <color name="fx_mobile_icon_color_accent_pink">@color/photonPink20</color> @@ -128,7 +128,7 @@ <!-- Action Primary Icon --> <color name="fx_mobile_icon_color_action_primary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Secondary Icon --> - <color name="fx_mobile_icon_color_action_secondary">@color/photonDarkGrey90</color> + <color name="fx_mobile_icon_color_action_secondary">@color/photonLightGrey05</color> <!-- Action Tertiary Icon --> <color name="fx_mobile_icon_color_action_tertiary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Reader, ETP Shield --> @@ -149,7 +149,7 @@ <!-- Form parts --> <color name="fx_mobile_border_color_disabled" tools:ignore="UnusedResources">@color/photonLightGrey05A40</color> <!-- Form parts --> - <color name="fx_mobile_border_color_warning" tools:ignore="UnusedResources">@color/photonRed40</color> + <color name="fx_mobile_border_color_critical" tools:ignore="UnusedResources">@color/photonRed20</color> <!-- Toolbar divider --> <color name="fx_mobile_border_color_toolbar_divider">@color/photonDarkGrey60</color> diff --git a/mobile/android/fenix/app/src/main/res/values-nl/strings.xml b/mobile/android/fenix/app/src/main/res/values-nl/strings.xml index 3277940ff0..8d3f1fd0b8 100644 --- a/mobile/android/fenix/app/src/main/res/values-nl/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-nl/strings.xml @@ -204,6 +204,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensies</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Extensies beheren</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Meer extensies ontdekken</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Accountinformatie</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -222,6 +226,8 @@ <string name="browser_menu_open_in_regular_tab">Openen in gewoon tabblad</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Toevoegen aan startscherm</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Toevoegen aan startscherm…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installeren</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -233,9 +239,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Pagina vertalen</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">In collectie opslaan…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">In collectie opslaan</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Delen</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Delen…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Openen in %1$s</string> @@ -290,6 +300,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Opslaan</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bladwijzer voor deze pagina maken</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Bladwijzer bewerken</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Opslaan als PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Lezerweergave inschakelen</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Lezerweergave uitschakelen</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Pagina vertalen…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Vertaald naar %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Afdrukken…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Geen extensies hier</string> @@ -387,8 +415,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox-privacyverklaring</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Lees meer in onze privacyverklaring</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">We houden u graag veilig</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Taal</string> <!-- Preference for translation --> - <string name="preferences_translation">Vertaling</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Vertaling</string> + <!-- Preference for translations --> + <string name="preferences_translations">Vertalingen</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Gegevenskeuzes</string> <!-- Preference for data collection --> @@ -670,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Vereist</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optioneel</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Websitegegevens lezen en wijzigen</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Website verwijderen</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Toestaan voor alle websites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -800,8 +824,6 @@ <string name="preferences_sync_history">Geschiedenis</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bladwijzers</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Wachtwoorden</string> <!-- Preference for syncing tabs --> @@ -828,8 +850,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s op %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcards</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betalingsmethoden</string> <!-- Preference for syncing addresses --> @@ -845,6 +865,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tabblad van %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s-tabbladen gesloten: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Onlangs gesloten tabbladen bekijken</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Uitzonderingen</string> @@ -1777,12 +1805,8 @@ <string name="add_to_homescreen_description_2">U kunt deze website eenvoudig aan het startscherm van uw apparaat toevoegen, om zo direct toegang te hebben en sneller te navigeren met een app-achtige ervaring.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen en wachtwoorden</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Wachtwoorden</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen en wachtwoorden opslaan</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Wachtwoorden opslaan</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Vragen om op te slaan</string> @@ -1797,46 +1821,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Gebruikersnamen en wachtwoorden in andere apps op uw apparaat invullen.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmelding toevoegen</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Wachtwoord toevoegen</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen synchroniseren</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Wachtwoorden synchroniseren</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen op apparaten synchroniseren</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Wachtwoorden synchroniseren tussen apparaten</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Opgeslagen aanmeldingen</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Opgeslagen wachtwoorden</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">De aanmeldingen die u opslaat of synchroniseert met %s worden hier getoond.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">De wachtwoorden die u opslaat of synchroniseert met %s zullen hier worden vermeld. Alle wachtwoorden die u opslaat, zijn versleuteld.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Meer info over Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Meer info over synchronisatie</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Uitzonderingen</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Niet-opgeslagen aanmeldingen en wachtwoorden worden hier weergegeven.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s zal geen wachtwoorden voor de hier vermelde websites opslaan.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen en wachtwoorden worden voor deze websites niet opgeslagen.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s zal geen wachtwoorden voor deze websites opslaan.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Alle uitzonderingen verwijderen</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldingen zoeken</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Wachtwoorden zoeken</string> <!-- The header for the site that a login is for --> @@ -1865,17 +1870,11 @@ <string name="saved_login_reveal_password">Wachtwoord tonen</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Wachtwoord verbergen</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ontgrendel om uw opgeslagen aanmeldingen te bekijken</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Ontgrendel om uw opgeslagen wachtwoorden te bekijken</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Beveilig uw aanmeldingen en wachtwoorden</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Beveilig uw opgeslagen wachtwoorden</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Stel een vergrendelingspatroon, pincode of wachtwoord voor uw apparaat in om uw opgeslagen aanmeldingen en wachtwoorden te beschermen tegen toegang als iemand anders uw apparaat heeft.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Stel een vergrendelingspatroon, pincode of wachtwoord voor uw apparaat in om uw opgeslagen wachtwoorden te beschermen tegen toegang als iemand anders uw apparaat heeft.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Later</string> @@ -1892,8 +1891,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Naam (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Laatst gebruikt</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menu Aanmeldingen sorteren</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Wachtwoordmenu sorteren</string> @@ -1903,41 +1900,27 @@ <string name="preferences_autofill">Automatisch invullen</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adressen</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcards</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betalingsmethoden</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kaarten opslaan en automatisch invullen</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Betalingsmethoden opslaan en invullen</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Gegevens zijn versleuteld</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s versleutelt alle betalingsmethoden die u opslaat</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Kaarten synchroniseren tussen apparaten</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Kaarten synchroniseren</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Creditcard toevoegen</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Kaart toevoegen</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Opgeslagen kaarten beheren</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Kaarten beheren</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adres toevoegen</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adressen beheren</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Adressen opslaan en automatisch invullen</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adressen opslaan en invullen</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Informatie zoals nummers, e-mail- en verzendadressen toevoegen</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inclusief telefoonnummers en e-mailadressen</string> @@ -1961,8 +1944,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kaart verwijderen</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Weet u zeker dat u deze creditcard wilt verwijderen?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kaart verwijderen?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Verwijderen</string> @@ -1976,24 +1957,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Opgeslagen kaarten</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Voer een geldig creditcardnummer in</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Voer een geldig kaartnummer in</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vul dit veld in</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Voeg een naam toe</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Ontgrendel om uw opgeslagen kaarten te bekijken</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Beveilig uw creditcards</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Beveilig uw opgeslagen betalingsmethoden</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Stel een vergrendelingspatroon, pincode of wachtwoord voor uw apparaat in om uw opgeslagen creditcards te beschermen tegen toegang als iemand anders uw apparaat heeft.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Stel een vergrendelingspatroon, pincode of wachtwoord voor uw apparaat in om uw opgeslagen betalingsmethoden te beschermen tegen toegang als iemand anders uw apparaat heeft.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Nu instellen</string> @@ -2002,9 +1974,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Ontgrendel uw apparaat</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ontgrendelen om opgeslagen creditcardgegevens te gebruiken</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Ontgrendel om opgeslagen betalingsmethoden te gebruiken</string> <!-- Title of the "Add address" screen --> @@ -2013,12 +1982,6 @@ <string name="addresses_edit_address">Adres bewerken</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adressen beheren</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Voornaam</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Tweede naam</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Achternaam</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Naam</string> <!-- The header for the street address of an address --> @@ -2045,8 +2008,6 @@ <string name="addressess_delete_address_button">Adres verwijderen</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Weet u zeker dat u dit adres wilt verwijderen?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Dit adres verwijderen?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Verwijderen</string> @@ -2144,49 +2105,29 @@ <string name="login_menu_delete_button">Verwijderen</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Bewerken</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Weet u zeker dat u deze aanmelding wilt verwijderen?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Weet u zeker dat u dit wachtwoord wilt verwijderen?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Verwijderen</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annuleren</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Aanmeldopties</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Wachtwoordopties</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Het bewerkbare tekstveld voor het webadres van de aanmelding.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Het bewerkbare tekstveld voor het websiteadres.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Het bewerkbare tekstveld voor de gebruikersnaam van de aanmelding.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Het bewerkbare tekstveld voor de gebruikersnaam.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Het bewerkbare tekstveld voor het wachtwoord van de aanmelding.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Het bewerkbare tekstveld voor het wachtwoord.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Wijzigingen aan aanmelding opslaan.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Wijzigingen opslaan.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Bewerken</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Wachtwoord bewerken</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Nieuwe aanmelding toevoegen</string> <!-- The page title for adding new password. --> <string name="add_login_2">Wachtwoord toevoegen</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Wachtwoord vereist</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Vul een wachtwoord in</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Gebruikersnaam vereist</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Vul een gebruikersnaam in</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Hostnaam vereist</string> @@ -2537,6 +2478,8 @@ <string name="translations_bottom_sheet_negative_button">Niet nu</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Origineel tonen</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Oorspronkelijk onvertaalde pagina geladen</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Gereed</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2594,6 +2537,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Blad Vertalingen sluiten</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Sommige instellingen zijn tijdelijk niet beschikbaar.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Vertalingen</string> @@ -2617,6 +2563,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecteer een taal om de voorkeuren ‘Altijd vertalen’ en ‘Nooit vertalen’ te beheren.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Kan talen niet laden. Probeer het later nog eens.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Aanbieden om te vertalen (standaard)</string> @@ -2639,6 +2588,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s verwijderen</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Kan websites niet laden. Probeer het later nog eens.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s verwijderen?</string> @@ -2716,13 +2667,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Terug bladeren</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Debuglade openen</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Tabbladhulpmiddelen</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Aantal tabbladen</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Actief</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Actief</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Actief</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactief</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2733,6 +2689,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Hulpmiddel voor het aanmaken van tabbladen</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Aantal aan te maken tabbladen</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Tekstveld is leeg</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Voer alleen positieve gehele getallen in</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Voer een getal groter dan nul in</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Het maximale aantal tabbladen (%1$s) dat in één bewerking kan worden aangemaakt is overschreden</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Toevoegen aan actieve tabbladen</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2749,11 +2715,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Privacyverklaring</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Indienen</string> + <string name="micro_survey_submit_button_label">Indienen</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Sluiten</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Sluiten</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Bedankt voor uw feedback!</string> + <string name="micro_survey_feedback_confirmation">Bedankt voor uw feedback!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Zeer tevreden</string> <!-- Option for likert scale --> @@ -2765,6 +2731,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Zeer ontevreden</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Enquête openen</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Enquête sluiten</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Sluiten</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Aanmeldingen</string> diff --git a/mobile/android/fenix/app/src/main/res/values-nn-rNO/strings.xml b/mobile/android/fenix/app/src/main/res/values-nn-rNO/strings.xml index a85ae3472e..928e6f2594 100644 --- a/mobile/android/fenix/app/src/main/res/values-nn-rNO/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-nn-rNO/strings.xml @@ -51,12 +51,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nyleg lagra</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nyleg lagra</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Vis alle lagra bokmerke</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Vis alle lagra bokmerke</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Fjern</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Fjern</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Bokmerke</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Vis alle bokmerke</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Fjern</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s er produsert av Mozilla.</string> @@ -197,6 +205,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tillegg</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Utvidingar</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Handsam utviding</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Oppdag fleire utvidingar</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontoinformasjon</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -215,18 +227,26 @@ <string name="browser_menu_open_in_regular_tab">Opne i vanlig fane</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Legg til på startskjermen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Legg til på startskjermen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installer</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Synkroniser på nytt</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Finn på sida</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Finn på sida…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Omset sida</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Lagre i samling…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Lagre i samling</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Del</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Del…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Opne i %1$s</string> @@ -258,11 +278,44 @@ <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> <string name="browser_menu_sign_in_caption">Synkroniser passord, faner, og meir</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Logg inn igjen for å synkronisere</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Synkronisering sett på pause</string> <!-- Browser menu label that creates a private tab --> <string name="browser_menu_new_private_tab">Ny privat fane</string> <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Passord</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Nytt i %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Byt til datamaskinversjon</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Verktøy</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Lagre</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bokmerk denne sida</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Rediger bokmerke</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Lagre som PDF…</string> + + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Slå på leservising</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Slå av leservising</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Omset sida…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Omset til %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Skriv ut…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Ingen utvidingar her</string> @@ -359,10 +412,15 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox personvernerklæring</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Les meir i personvernerklæringa vår</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Vi vernar deg gjerne</string> + <!-- Title for set firefox as default browser screen used by Nimbus experiments. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_default_browser_title_nimbus_3" tools:ignore="UnusedResources">Finn ut kvifor millionar likar Firefox</string> + <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_title_nimbus_4" tools:ignore="UnusedResources">Sikker surfing med fleire val</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_3">Den ideelle nettlesaren vår hindrar selskap i å spore aktiviteten din i hemmelegheit på nettet.</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_description_nimbus_4" tools:ignore="UnusedResources">Meir enn 100 millionar menneske beskyttar personvernet sitt ved å velje ein nettleser som er støtta av ein ideell organisasjon.</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> @@ -385,6 +443,12 @@ <string name="juno_onboarding_sign_in_positive_button" tools:ignore="UnusedResources">Logg inn</string> <!-- Text for the button dismiss the screen and move on with the flow --> <string name="juno_onboarding_sign_in_negative_button" tools:ignore="UnusedResources">Ikkje no</string> + <!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_enable_notifications_title_nimbus_2">Varsel gjer deg tryggare med Firefox</string> + <!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_enable_notifications_description_nimbus_2">Send faner trygt mellom einingane dine og oppdag andre personvernfunksjonar i Firefox.</string> <!-- Text for the button to request notification permission on the device --> <string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Slå på varsel</string> <!-- Text for the button dismiss the screen and move on with the flow --> @@ -437,6 +501,8 @@ <string name="preferences_search_engines">Søkjemotorar</string> <!-- Preference for settings related to Search engines suggestions--> <string name="preferences_search_engines_suggestions">Forslag frå søkjemotorar</string> + <!-- Preference Category for settings related to Search address bar --> + <string name="preferences_settings_address_bar">Innstillingar for adresselinja</string> <!-- Preference Category for settings to Firefox Suggest --> <string name="preference_search_address_bar_fx_suggest">Adresselinje - Firefox forslag</string> <!-- Preference link to Learn more about Firefox Suggest --> @@ -553,6 +619,10 @@ <string name="preferences_account_sync_error">Kople til igjen for å halde fram synkroniseringa</string> <!-- Preference for language --> <string name="preferences_language">Språk</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Omsetting</string> + <!-- Preference for translations --> + <string name="preferences_translations">Omsettingar</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Dataval</string> <!-- Preference for data collection --> @@ -611,6 +681,8 @@ <string name="preferences_extensions">Utvidingar</string> <!-- Preference for installing a local add-on --> <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Installer utviding frå fil</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Installer utviding frå fil</string> <!-- Preference for notifications --> <string name="preferences_notifications">Varsel</string> @@ -623,9 +695,18 @@ <!-- The title of the required permissions section from addon's permissions screen --> <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Påkravd</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valfri</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tillat for alle nettstadar</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Viss du stolar på denne utvidinga, kan du gje henne løyve på kvar nettstad.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Tilpassa tilleggssamling</string> + <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> + <string name="preferences_customize_extension_collection">Tilpassa utvidings-samling</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">OK</string> <!-- Button caption to abort the add-on collection configuration --> @@ -637,11 +718,16 @@ <!-- Toast shown after confirming the custom add-on collection configuration --> <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Tilleggssamling endra. Avsluttar applikasjonen for å bruke endringar…</string> + <!-- Toast shown after confirming the custom extension collection configuration --> + <string name="toast_customize_extension_collection_done">Utvidingssamling endra. Avsluttar applikasjonen for å leggje til endringar…</string> + <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Hopp inn igjen</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Nylege bokmerke</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Nylege bokmerke</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Bokmerke</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nyleg besøkte</string> @@ -693,22 +779,38 @@ <!-- Title of the Nimbus message for add-ons general availability--> <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Nye utvidingar tilgjengelege no</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Nye utvidingar tilgjengelege no</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Sjekk ut 100+ nye utvidingar som lèt deg gjere Firefox til din eigen.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Utforsk utvidingar</string> + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Utforsk utvidingar</string> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Tillegg er mellombels deaktivert</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">Utvidinga er mellombels deaktivert</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Eitt eller fleire tillegg slutta å fungere, noko som gjorde systemet ditt ustabilt. %1$s prøvde utan hell å starte tillegget/tillegga på nytt.\n\nTillegg vil ikkje bli starta på nytt under gjeldande økt.\n\nDersom du fjernar eller deaktiverer tillegg, kan dette løyse problemet.</string> + <!-- This is a message shown to the user when too many errors have occurred with the extensions process and they have been disabled. + The user can decide if they would like to continue trying to start extensions or if they'd rather continue without them. + The first parameter is the application name. --> + <string name="extension_process_crash_dialog_message">Ei eller flere utvidingar slutta å fungere, noko som gjorde systemet ditt ustabilt. %1$s prøvde utan hell å starte utvidinga(ne) på nytt.\n\nUtvidingane vil ikkje bli starta på nytt under gjeldande økt.\n\nViss du fjernar eller deaktiverer utvidingar, kan dette løyse problemet.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Prøv å starte tillegga på nytt</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Prøv å starte utvidingar på nytt</string> <!-- The user will continue with all add-ons disabled --> <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Hald fram med deaktiverte tillegg</string> + <!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. --> + <string name="extension_process_crash_dialog_disable_extensions_button_text">Hald fram med utvidingar deaktiverte</string> + <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> <string name="preferences_manage_account">Handsam kontoen</string> @@ -722,8 +824,6 @@ <string name="preferences_sync_history">Historikk</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bokmerke</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingar</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Passord</string> <!-- Preference for syncing tabs --> @@ -750,8 +850,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s på %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betalingsmåtar</string> <!-- Preference for syncing addresses --> @@ -767,6 +865,15 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Fane frå %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s lét att %2$d faner</string> + + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Vis nyleg attlatne faner</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Unntak</string> @@ -1347,6 +1454,8 @@ <!-- Text shown in the notification that pops up to remind the user that a private browsing session is active for Android 14+ --> <string name="notification_erase_title_android_14">Late att private faner?</string> + <string name="notification_erase_text_android_14">Trykk eller sveip dette varselet for å late att private faner.</string> + <!-- Name of the marketing notification channel. Displayed in the "App notifications" system settings for the app --> <string name="notification_marketing_channel_name">Marknadsføring</string> @@ -1701,12 +1810,8 @@ <string name="add_to_homescreen_description_2">Du kan enkelt leggje til denne nettstaden på startskjermen til eininga for å, med ein gong, få tilgang og surfe raskare med ei app-liknande oppleving.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingar og passord</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Passord</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre innloggingar og passord</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Lagre passord</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Spør om å lagre</string> @@ -1723,40 +1828,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fyll inn brukarnamn og passord i andre appar på eininga di.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til innlogging</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Legg til passord</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser innloggingar</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synkroniser passord</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkroniser innloggingar på tvers av einingar</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synkroniser passord på tvers av einingar</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagra innloggingar</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Lagra passord</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingane du lagrar eller synkroniserer til %s vil visast her.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Les meir om Sync.</string> + <string name="preferences_passwords_saved_logins_description_empty_text_2">Passorda du lagrar eller synkroniserer med %s vil bli oppførte her. Alle passorda du lagrar er krypterte.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Les meir om synkronisering</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Unntak</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingar og passord som ikkje er lagra vil visast her.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingar og passord vil ikkje bli lagra for desse nettstadane.</string> + <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> + <string name="preferences_passwords_exceptions_description_empty_2">%s vil ikkje lagre passord for nettstadar som er oppførte her.</string> + <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> + <string name="preferences_passwords_exceptions_description_2">%s vil ikkje lagre passord for desse nettstadane.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Slett alle unntak</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Søk innloggingar</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Søk etter passord</string> <!-- The header for the site that a login is for --> @@ -1786,12 +1878,12 @@ <string name="saved_login_reveal_password">Vis passord</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Gøym passord</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås opp for å sjå dei lagra innloggingane dine</string> + <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> + <string name="logins_biometric_prompt_message_2">Lås opp for å sjå dei lagra passorda dine</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Gjer innloggingane og passorda dine trygge</string> + <string name="logins_warning_dialog_title_2">Sikre dei lagra passorda dine</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lag ein PIN-kode, eit passord eller eit låsemønster for å hindre at andre får tilgang dei lagra innloggingane og passorda dine, dersom dei har tilgang til eininga di.</string> + <string name="logins_warning_dialog_message_2">Konfigurer ein PIN-kode, eit passord eller eit låsemønster for å beskytte dei lagra passorda dine om nokon andre skulle få tak i eininga di.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Seinare</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1807,8 +1899,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Namn (A-Å)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Sist brukt</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sorter inloggningsmenyen</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Sorter passord-menyen</string> @@ -1818,27 +1908,19 @@ <string name="preferences_autofill">Autofyll</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresser</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Betalingskort</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betalingsmåtar</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre og fyll ut kort automatisk</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Lagre og fyll inn betalingsmåtar</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data er kryptert</string> + <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> + <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s krypterer alle betalingsmåtar du lagrar</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synkroniser kort på tvers av einingar</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synkroniser kort</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til betalingskort</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Legg til kort</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Handsam lagra kort</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Handsam kort</string> <!-- Preference option for adding an address --> @@ -1846,12 +1928,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Handsam adresser</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre og fyll ut adresser automatisk</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Lagre og fyll ut adresser</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inkluderer informasjon som telefonnummer, e-post og leveringsadresser</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inkluderer telefonnummer og e-postadresser</string> @@ -1875,8 +1953,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Slett kort</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du vil slette dette bankkortet?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Slette kort?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Slett</string> @@ -1890,21 +1966,16 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Lagra bankkort</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Skriv inn eit gyldig betalingskortnummer</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Skriv inn eit gyldig kortnummer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Fyll ut dette feltet</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Legg til eit namn</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Lås opp for å sjå lagra betalingskort</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Sikre betalingskorta dine</string> + <string name="credit_cards_warning_dialog_title_2">Sikre dei lagra betalingsmåtane dine</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Konfigurer eit låsemønster for eininga, PIN, eller passord, for å beskytte dei lagra betalingskorta dine om nokon andre skulle få tak i eininga di.</string> + <string name="credit_cards_warning_dialog_message_3">Konfigurer ein PIN-kode, eit passord eller eit låsemønster for å beskytte dei lagra betalingsmåtane dine om nokon annan skulle få tak i eininga di.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Konfigurer no</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> @@ -1912,21 +1983,14 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Lås opp eininga di</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås opp for å bruke lagra betalingskortinformasjon</string> - + <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> + <string name="credit_cards_biometric_prompt_unlock_message_2">Lås opp for å bruke lagra betalingsmåtar</string> <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Legg til adresse</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Rediger adresse</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Handsam adresser</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Fornamn</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Mellomnamn</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Etternamn</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Namn</string> <!-- The header for the street address of an address --> @@ -1952,8 +2016,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Slett adresse</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du vil slette denne adressa?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Slette denne adressa?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Slett</string> @@ -2055,41 +2117,29 @@ <string name="login_menu_delete_button">Slett</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Rediger</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Er du sikker på at du ønskjer å slette denne innlogginga?</string> + <!-- Message in delete confirmation dialog for password --> + <string name="login_deletion_confirmation_2">Er du sikker på at du ønskjer å slette dette passordet?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Slett</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Avbryt</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Innloggingsalternativ</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Passordalternativ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggings-nettadressa.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggings-brukarnamnet.</string> + <!-- The editable text field for a website address. --> + <string name="saved_login_hostname_description_3">Det redigerbare tekstfeltet for nettstadadressa.</string> + <!-- The editable text field for a username. --> + <string name="saved_login_username_description_3">Det redigerbare tekstfeltet for brukarnamnet.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbare tekstfeltet for innloggings-passordet.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lagre endringar for innlogging.</string> + <string name="saved_login_password_description_2">Det redigerbare tekstfeltet for passordet.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Lagre endringar.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Rediger</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Rediger passord</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Legg til ny innlogging</string> <!-- The page title for adding new password. --> <string name="add_login_2">Legg til passord</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Passord påkravd</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Skriv inn passord</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Brukarnamn påkravd</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Skriv inn eit brukarnamn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Vertsnamn påkravd</string> @@ -2192,6 +2242,9 @@ <!-- Title for search suggestions when the default search suggestion engine is anything other than Google. The first parameter is default search engine name. --> <string name="other_default_search_engine_suggestion_header">Søk med %s</string> + <!-- Default browser experiment --> + <!-- Default browser card title --> + <string name="default_browser_experiment_card_title">Endre standardnettlesar</string> <!-- Default browser card text --> <string name="default_browser_experiment_card_text">Vel at lenker frå nettstadar, e-postmeldingar og meldingar skal opnast automatisk i Firefox.</string> @@ -2342,6 +2395,10 @@ <string name="review_quality_check_contextual_onboarding_learn_more">Med krafta i %1$s frå Mozilla hjelper vi deg med å unngå einsidige og ikkje-truverdige vurderingar. AI-modellen vår vert alltid forbetra for å beskytte deg når du handlar. %2$s</string> <!-- Clickable text from the contextual onboarding card that links to review quality check support article. --> <string name="review_quality_check_contextual_onboarding_learn_more_link">Les meir</string> + <!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. First parameter is Firefox app name, third parameter is the Fakespot product name. Second & fourth are for clickable texts defined in review_quality_check_contextual_onboarding_privacy_policy_3 and review_quality_check_contextual_onboarding_terms_use. --> + <string name="review_quality_check_contextual_onboarding_caption_3" moz:RemovedIn="124" tools:ignore="UnusedResources">Ved å velje «Ja, prøv det» godtek du %1$s sine %2$s og %3$s sine %4$s.</string> + <!-- Caption text to be displayed in review quality check contextual onboarding card above the opt-in button. First parameter is Firefox app name, third parameter is the Fakespot product name. Second & fourth are for clickable texts defined in review_quality_check_contextual_onboarding_privacy_policy_3 and review_quality_check_contextual_onboarding_terms_use. --> + <string name="review_quality_check_contextual_onboarding_caption_4">Ved å velje «Ja, prøv det» godtek du %1$s sine %2$s og %3$s sine %4$s.</string> <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy notice. --> <string name="review_quality_check_contextual_onboarding_privacy_policy_3">peronvernerklæring</string> <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot terms of use. --> @@ -2413,16 +2470,28 @@ <!-- Translation request dialog --> <!-- Title for the translation dialog that allows a user to translate the webpage. --> <string name="translations_bottom_sheet_title">Omsetje denne sida?</string> + <!-- Title for the translation dialog after a translation was completed successfully. + The first parameter is the name of the language that the page was translated from, for example, "French". + The second parameter is the name of the language that the page was translated to, for example, "English". --> + <string name="translations_bottom_sheet_title_translation_completed">Sida er omsett frå %1$s til %2$s</string> + <!-- Title for the translation dialog that allows a user to translate the webpage when a user uses the translation feature the first time. The first parameter is the name of the application, for example, "Fenix". --> + <string name="translations_bottom_sheet_title_first_time">Prøv private omsettingar i %1$s</string> + <!-- Additional information on the translation dialog that appears when a user uses the translation feature the first time. The first parameter is clickable text with a link, for example, "Learn more". --> + <string name="translations_bottom_sheet_info_message">Av omsyn til personvernet ditt forlét aldri omsettingar eininga di. Nye språk og forbetringar kjem snart! %1$s</string> <!-- Text that links to additional information about the Firefox translations feature. --> <string name="translations_bottom_sheet_info_message_learn_more">Les meir</string> <!-- Label for the dropdown to select which language to translate from on the translations dialog. Usually the translate from language selected will be the same as the page language. --> <string name="translations_bottom_sheet_translate_from">Omset frå</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Omset til</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Prøv eit anna kjeldespråk</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Ikkje no</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Vis original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Original ikkje-omsett side lasta inn</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Ferdig</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2438,6 +2507,10 @@ <string name="translations_bottom_sheet_default_dropdown_selection">Vel eit språk</string> <!-- The title of the warning card informs the user that a translation could not be completed. --> <string name="translation_error_could_not_translate_warning_text">Det oppstod eit problem med å omsetje. Prøv på nytt.</string> + <!-- The title of the warning card informs the user that the list of languages cannot be loaded. --> + <string name="translation_error_could_not_load_languages_warning_text">Klarte ikkje å laste inn språk. Sjekk Internett-tilkoplinga di og prøv igjen.</string> + <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> + <string name="translation_error_language_not_supported_warning_text">Beklagar, vi stør ikkje %1$s enno.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Les meir</string> @@ -2445,9 +2518,18 @@ <string name="translation_in_progress_snackbar">Omset…</string> + <!-- Title for the data saving mode warning dialog used in the translation request dialog. + This dialog will be presented when the user attempts to perform + a translation without the necessary language files downloaded first when Android's data saver mode is enabled and the user is not using WiFi. + The first parameter is the size in kilobytes or megabytes of the language file. --> + <string name="translations_download_language_file_dialog_title">Last ned språk i datasparemodus (%1$s)?</string> + + <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Innstillingar for omsetjing</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Innstillingar for omsetting</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Tilby alltid å omsetje</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2465,12 +2547,20 @@ <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">Om omsetjingar i %1$s</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Lat att omsettingsarket</string> + + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Nokre innstillingar er mellombels utilgjengelege.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Omsetjingar</string> <!-- Toggle switch label that indicates that the browser should signal or indicate when a translation is possible for any page. --> <string name="translation_settings_offer_to_translate">Tilby å omsetje når det er muleg</string> + <!-- Toggle switch label that indicates that downloading files required for translating is permitted when using data saver mode in Android. --> + <string name="translation_settings_always_download">Last alltid ned språk i datasparemodus</string> <!-- Section header text that begins the section of a list of different options the user may select to adjust their translation preferences. --> <string name="translation_settings_translation_preference">Innstillingar for omsetjing</string> <!-- Button text for the button that will take the user to the automatic translations settings dialog. On the automatic translations settings dialog, the user can set if translations should occur automatically for a given language. --> @@ -2487,6 +2577,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Vel eit språk for å handsame innstillingar for «omset alltid» og «omset aldri».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Klarte ikkje å laste inn språk. Prøv igjen seinare.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Tilby å omsetje (standard)</string> @@ -2510,6 +2603,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Fjern %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Klarte ikkje å laste inn nettstadar. Prøv igjen seinare.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Vil du slette %1$s?</string> @@ -2551,11 +2646,28 @@ The first parameter is the name of the language, for example, "Spanish" and the second parameter is the size in kilobytes or megabytes of the language file. --> <string name="delete_language_file_dialog_title">Slett %1$s (%2$s)?</string> + <!-- Additional information for the dialog used by the translations feature to confirm deleting a language. The first parameter is the name of the application, for example, "Fenix". --> + <string name="delete_language_file_dialog_message">Viss du slettar dette språket, vil %1$s laste ned delar av språk til snøgglageret ditt medan du omset.</string> + <!-- Title for the dialog used by the translations feature to confirm deleting all languages file. + The dialog will be presented when the user requests deletion of all languages file. + The first parameter is the size in kilobytes or megabytes of the language file. --> + <string name="delete_language_all_languages_file_dialog_title">Slette alle språk (%1$s)?</string> + <!-- Additional information for the dialog used by the translations feature to confirm deleting all languages file. The first parameter is the name of the application, for example, "Fenix". --> + <string name="delete_language_all_languages_file_dialog_message">Viss du slettar alle språk, vil %1$s laste ned delar av språk tilsnøgglageret ditt medan du omset.</string> <!-- Button text on the dialog used by the translations feature to confirm deleting a language. --> <string name="delete_language_file_dialog_positive_button_text">Slett</string> <!-- Button text on the dialog used by the translations feature to cancel deleting a language. --> <string name="delete_language_file_dialog_negative_button_text">Avbryt</string> + <!-- Title for the data saving mode warning dialog used by the translations feature. + This dialog will be presented when the user attempts to download a language or perform + a translation without the necessary language files downloaded first when Android's data saver mode is enabled and the user is not using WiFi. + The first parameter is the size in kilobytes or megabytes of the language file.--> + <string name="download_language_file_dialog_title">Laste ned medan du er i datasparemodus (%1$s)?</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation. --> + <string name="download_language_file_dialog_message_all_languages">Vi lastar ned delvise språk til snøgglageret ditt for å halde omsettingar private.</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation without mentioning the cache. --> + <string name="download_language_file_dialog_message_all_languages_no_cache">Vi lastar ned delvise språk for å halde omsettingar private.</string> <!-- Checkbox label text on the data saving mode warning dialog used by the translations feature. This checkbox allows users to ignore the data usage warnings. --> <string name="download_language_file_dialog_checkbox_text">Last alltid ned i datasparemodus</string> <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file. --> @@ -2571,13 +2683,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Naviger tilbake</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Opne feilsøkingsskuffa</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Faneverktøy</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Antal faner</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Verksam</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Verksam</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiv</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Uverksam</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2588,6 +2705,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Verktøy for å lage faner</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Tal på faner som skal opprettast</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Text field is empty</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Skriv inn berre positive heiltall</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Skriv inn eit tal større enn null</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Overskreid det maksimale talet på faner (%1$s) som kan genererast i éin operasjon</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Legg til i verksame faner</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2599,16 +2726,43 @@ <!-- The continue button label --> <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Hald fram</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Ver med i denne undersøkinga</string> <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Personvernerklæring</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Send inn</string> + <string name="micro_survey_submit_button_label">Send inn</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Lat att</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Lat att</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Takk for tilbakemeldinga di!</string> + <string name="micro_survey_feedback_confirmation">Takk for tilbakemeldinga di!</string> + + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Veldig fornøgd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Fornøgd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Nøytral</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Misfornøgd</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Veldig misfornøgd</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Opne undersøking</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Lat att undersøking</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Lat att</string> <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Innloggingar</string> - </resources> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Gjeldande domene: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Legg til ei falsk innlogging for dette domenet</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Slett innlogging med brukarnamn %s</string> +</resources> diff --git a/mobile/android/fenix/app/src/main/res/values-oc/strings.xml b/mobile/android/fenix/app/src/main/res/values-oc/strings.xml index dadbc407db..93e80beb14 100644 --- a/mobile/android/fenix/app/src/main/res/values-oc/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-oc/strings.xml @@ -48,12 +48,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Salvats recentament</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Salvats recentament</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Afichar totes los marcapaginas enregistrats</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Afichar totes los marcapaginas enregistrats</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Levar</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Levar</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Marcapaginas</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Afichar totes los marcapaginas</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Suprimir</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s es produch per Mozilla.</string> @@ -191,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Moduls</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gerir las extensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descobrir mai d’extensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informacion compte</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -209,18 +221,26 @@ <string name="browser_menu_open_in_regular_tab">Dobrir dins un onglet classic</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Apondre a l’ecran d’acuèlh</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Apondre a l’ecran d’acuèlh…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Tornar sincronizar</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Recercar dins la pagina</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Recercar dins la pagina…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduire la pagina</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Salvar a la colleccion…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Salvar a la colleccion</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Partejar</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Partejar…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Dobrir amb %1$s</string> @@ -262,6 +282,34 @@ <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Senhals</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Novetats dins %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Passar en version ordenador</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Aisinas</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Enregistrar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Marcar aquesta pagina</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Modificar lo marcapagina</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Enregistrar en PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Passar a la vista lectura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Quitar lo mòde lectura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traduire la pagina…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traduch en %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Cap d’extension aquí</string> @@ -358,8 +406,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Politica de confidencialitat de Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Ne saber mai tocant nòstra politica de confidencialitat</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos impòrta vòstra vida privada</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -570,6 +616,10 @@ <!-- Preference for language --> <string name="preferences_language">Lenga</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Traduccion</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traduccions</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Donadas collectadas</string> <!-- Preference for data collection --> @@ -641,10 +691,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Requesida</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Facultativa</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Consultar e modificar las donadas de sites web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Suprimir lo site web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Autorizar per totes los sites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -675,7 +721,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Tornar a aqueste onglet</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Marcats recentament</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Marcats recentament</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Marcapaginas</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Visitats fa res</string> @@ -772,8 +820,6 @@ <string name="preferences_sync_history">Istoric</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcapaginas</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificants</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Senhals</string> @@ -802,8 +848,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s sus %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartas de crèdit</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Metòdes de pagament</string> <!-- Preference for syncing addresses --> @@ -819,6 +863,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Onglet de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d onglets tampats de %1$s</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Veire los onglets tampats recentament</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Excepcions</string> @@ -1767,12 +1819,8 @@ <string name="add_to_homescreen_description_2">Podètz facilament apondre aqueste site a l’ecran d’acuèlh de vòstre periferic per i accedir dirèctament e i navegar coma se foguèsse una aplicacion.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificants e senhals</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Senhals</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar los identificants e senhals</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Salvar senhals</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Demandar per salvar</string> @@ -1789,47 +1837,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Emplena los noms d’utilizaires e los senhals d’autres aplicacions sus vòstre periferic.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Apondre un identificant</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Apondre un senhal</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar los identificants</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar los senhals</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar los identificants entre totes los periferics</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar los senhals entre los periferics</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Identificants salvats</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Senhals salvats</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Aquí se mòstran los identificants que salvatz o sincronizatz amb %s.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Los senhals que salvatz o sincronizatz amb %s seràn listats aquí. Totes los senhals qu’enregistratz son chifrats. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Per ne saber mai sus Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Per ne saber mai sus sync</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Excepcions</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Los identificants e senhals pas salvats seràn mostrats aquí.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s enregistrarà pas los senhals pels sites listats aicí.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Los identificants e senhals seràn pas salvats per aquestes sites.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s enregistrarà pas los senhals per aquestes sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Suprimir totas las excepcions</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Recercar d’identificants</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Recercar de senhals</string> <!-- The header for the site that a login is for --> @@ -1859,17 +1888,11 @@ <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Amagar lo senhal</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desblocatz per veire los identificants enregistrats</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desblocatz per veire los senhals salvats</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Protegissètz vòstres identificants e senhals</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Securizatz los senhals salvats</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configuratz un esquèma de verrolhatge, un còdi PIN o un senhal per protegir vòstres identificants de connexion e senhals enregistrats se per cas qualqu’un accedisca a vòstre periferic.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configuratz un esquèma de desverrolhatge, un còdi PIN o un senhal per protegir vòstres senhals salvats se per cas qualqu’un accedisca a vòstre aparelh.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Mai tard</string> @@ -1886,9 +1909,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Darrièra utilizacion</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menú per triar los identificants</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menú de tria dels senhals</string> @@ -1897,42 +1917,28 @@ <string name="preferences_autofill">Emplenament automatic</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adreças</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartas de crèdit</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Metòdes de pagament</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar e completar automaticament las cartas</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Enregistrar e entresenhar los metòdes de pagament</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Donadas chifradas</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s chifra totes los metòdes de pagament qu’enregistratz</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar las cartas entre los periferics</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar las cartas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Apondre una cartas de crèdit</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Apondre una carta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gerir las cartas enregistradas</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gerir las cartas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Apondre una adreça</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gerir las adreças</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar e completar automaticament las adreças</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Salvar e emplenar automaticament las adreças</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inclutz las informacions coma los numèros, las adreças electronicas e las adreças de liurason</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluses los numèros de telefòn e las adreças electronicas</string> @@ -1956,8 +1962,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Suprimir la carta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Volètz vertadièrament suprimir aquesta carta bancària ?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Suprimir la carta ?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Suprimir</string> @@ -1971,25 +1975,16 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartas enregistradas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Picatz un numèro de carta de crèdit valid</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Picatz un numèro de carta valid</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Completatz aqueste camp</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Apondre un nom</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desblocatz per veire las cartas enregistradas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Securizatz vòstras cartas de crèdit</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Securizatz los metòdes de pagament enregistrats</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configuratz un esquèma de verrolhatge, un còdi PIN o un senhal per protegir vòstres identificants de cartas de crèdit enregistrats se per cas qualqu’un accedisca a vòstre periferic.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configuratz un esquèma de desverrolhatge, un còdi PIN o un senhal per protegir vòstres mejans de pagament se per cas qualqu’un accedisca a vòstre aparelh.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar ara</string> @@ -1998,9 +1993,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desverrolhatz lo periferic</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desverrolhatz per utilizar las informacions de cartas de crèdit enregistradas</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desblocatz per utilizar de metòdes de pagament enregistrats</string> <!-- Title of the "Add address" screen --> @@ -2009,12 +2001,6 @@ <string name="addresses_edit_address">Modificar l’adreça</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gestion de las adreças</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Pichon nom</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Segond pichon nom</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Nom d’ostal</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nom</string> <!-- The header for the street address of an address --> @@ -2041,8 +2027,6 @@ <string name="addressess_delete_address_button">Suprimir l’adreça</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Volètz vertadièrament suprimir aquesta adreça ?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Suprimir aquesta adreça ?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Suprimir</string> @@ -2142,8 +2126,6 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& <string name="login_menu_delete_button">Suprimir</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Modificar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Volètz vertadièrament suprimir aqueste identificant ?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Volètz vertadièrament suprimir aqueste senhal ?</string> <!-- Positive action of a dialog asking to delete --> @@ -2151,41 +2133,23 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Anullar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opcions de l’identificant</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opcions de senhal</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Lo camp de tèxt modificable per l’adreça web de l’identificant.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Lo camp de tèxt modificable per l’adreça del site web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Lo camp de tèxt modificable pel nom d’utilizaire de l’identificant.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Lo camp de tèxt modificable pel nom d’utilizaire.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Lo camp de tèxt modificable pel senhal de l’identificant.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Lo camp de tèxt modificable pel senhal.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Enregistratz las modificacions de l’identificant.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Enregistrar las modificacions.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Modificar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Modificar lo senhal</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Apondre un identificant novèl</string> <!-- The page title for adding new password. --> <string name="add_login_2">Apondre un senhal</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Senhal requesit</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Picar lo senhal</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Lo nom d’utilizaire es obligatòri</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Picar un nom d’utilizaire</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Lo nom d’òste es obligatòri</string> @@ -2535,6 +2499,8 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& <string name="translations_bottom_sheet_negative_button">Pas ara</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Veire la pagina originala</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Pagina originala non traducha cargada</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Acabat</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2718,13 +2684,18 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Tornar</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Dobrir lo panèl de desvolopament</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Aisinas d’onglet</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Nombre d’onglets</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Actius</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Actius</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Actiu</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactius</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2742,6 +2713,31 @@ Exemple :\nhttps://suggestqueries.google.com/complete/search?client=firefox& <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Apondre als onglets privats</string> + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Contunhar</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Participar al sondatge</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Politica de confidencialitat</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Mandar</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Tampar</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Mercés per vòstre retorn !</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Plan satisfach</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Satisfach</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Indiferent</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Insatisfach</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Plan insatisfach</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Identificants</string> diff --git a/mobile/android/fenix/app/src/main/res/values-pa-rIN/strings.xml b/mobile/android/fenix/app/src/main/res/values-pa-rIN/strings.xml index 2f5f2c0153..7991883f6d 100644 --- a/mobile/android/fenix/app/src/main/res/values-pa-rIN/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-pa-rIN/strings.xml @@ -205,6 +205,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">ਐਡ-ਆਨ</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">ਇਕਸਟੈਨਸ਼ਨਾਂ</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">ਇਕਸਟੈਨਸ਼ਨਾਂ ਦਾ ਇੰਤਜ਼ਾਮ</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">ਹੋਰ ਇਕਸਟੈਨਸ਼ਨਾਂ ਲੱਭੋ</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">ਖਾਤਾ ਜਾਣਕਾਰੀ</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -223,6 +227,8 @@ <string name="browser_menu_open_in_regular_tab">ਰੈਲੂਲਰ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">ਮੁੱਖ ਸਕਰੀਨ ‘ਤੇ ਜੋੜੋ</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">…ਮੁੱਖ ਸਕਰੀਨ ‘ਤੇ ਜੋੜੋ</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">ਇੰਸਟਾਲ ਕਰੋ</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -235,9 +241,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">ਸਫ਼ੇ ਦਾ ਉਲੱਥਾ ਕਰੋ</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">…ਭੰਡਾਰ ਵਿੱਚ ਸੰਭਾਲੋ</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">ਭੰਡਾਰ ‘ਚ ਸੰਭਾਲੋ</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">ਸਾਂਝਾ ਕਰੋ</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">…ਸਾਂਝਾ ਕਰੋ</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s ‘ਚ ਖੋਲ੍ਹੋ</string> @@ -291,6 +301,25 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">ਸੰਭਾਲੋ</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">ਇਹ ਸਫ਼ੇ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">ਬੁੱਕਮਾਰਕ ਨੂੰ ਸੋਧੋ</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">…PDF ਵਜੋਂ ਸੰਭਾਲੋ</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">ਪੜ੍ਹਨ ਝਲਕ ਨੂੰ ਚਾਲੂ ਕਰੋ</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">ਪੜ੍ਹਨ ਝਲਕ ਨੂੰ ਬੰਦ ਕਰੋ</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">…ਸਫ਼ੇ ਦਾ ਉਲੱਥਾ ਕਰੋ</string> + + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s ਵਿੱਚ ਉਲੱਥਾ ਕੀਤਾ</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">…ਪਰਿੰਟ ਕਰੋ</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">ਇੱਥੇ ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਨਹੀਂ ਹੈ</string> @@ -388,8 +417,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">ਸਾਡੀ ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ ਵਿੱਚ ਹੋਰ ਜਾਣਕਾਰੀ ਲਵੋ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">ਅਸੀਂ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹਾਂ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -601,7 +628,9 @@ <!-- Preference for language --> <string name="preferences_language">ਭਾਸ਼ਾ</string> <!-- Preference for translation --> - <string name="preferences_translation">ਉਲੱਥਾ</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">ਉਲੱਥਾ</string> + <!-- Preference for translations --> + <string name="preferences_translations">ਅਨੁਵਾਦ</string> <!-- Preference for data choices --> <string name="preferences_data_choices">ਡਾਟਾ ਚੋਣਾਂ</string> <!-- Preference for data collection --> @@ -675,10 +704,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">ਲੋੜੀਂਦਾ</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">ਚੋਣਵਾਂ</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">ਵੈੱਬਸਾਈਟ ਡਾਟਾ ਪੜ੍ਹਨ ਅਤੇ ਬਦਲਣ</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">ਵੈੱਬਸਾਈਟ ਨੂੰ ਹਟਾਉਣ</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">ਸਭ ਸਾਈਟਾਂ ਲਈ ਮਨਜ਼ੂਰੀ</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -805,8 +830,6 @@ <string name="preferences_sync_history">ਅਤੀਤ</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">ਬੁੱਕਮਾਰਕ</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">ਪਾਸਵਰਡ</string> <!-- Preference for syncing tabs --> @@ -834,8 +857,6 @@ and the third is the device model. --> <string name="default_device_name_2">%2$s %3$s ਉੱਤੇ %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕਰੈਡਿਟ ਕਾਰਡ</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">ਭੁਗਤਾਨ ਦੇ ਢੰਗ</string> <!-- Preference for syncing addresses --> @@ -851,6 +872,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s ਤੋਂ ਟੈਬ</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s ਟੈਬਾਂ ਬੰਦ ਕੀਤੀਆਂ: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text"> ਤਾਜ਼ਾ ਬੰਦ ਕੀਤੀਆਂ ਟੈਬਾਂ ਨੂੰ ਵੇਖੋ</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">ਛੋਟਾਂ</string> @@ -1788,12 +1817,8 @@ ਮੁੱਖ ਸਕਰੀਨ ਉੱਤੇ ਸੌਖੀ ਤਰ੍ਹਾਂ ਜੋੜ ਸਕਦੇ ਹੋ।</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਅਤੇ ਪਾਸਵਰਡ</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">ਪਾਸਵਰਡ</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਅਤੇ ਪਾਸਵਰਡ ਸੰਭਾਲੋ</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">ਪਾਸਵਰਡਾਂ ਨੂੰ ਸੰਭਾਲੋ</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save"> ਸੰਭਾਲਣ ਲਈ ਪੁੱਛੋ</string> @@ -1808,46 +1833,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਉੱਤੇ ਹੋਰ ਐਪਾਂ ਵਿੱਚ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਅਤੇ ਪਾਸਵਰਡ ਭਰੋ।</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਜੋੜੋ</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">ਪਾਸਵਰਡ ਜੋੜੋ</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਸਿੰਕ ਕਰੋ</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">ਪਾਸਵਰਡ ਸਿੰਕ ਕਰੋ</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਲਾਗਇਨਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">ਪਾਸਵਰਡ ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਸਿੰਕ ਕਰੋ</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸੰਭਾਲੇ ਹੋਏ ਲਾਗਇਨ</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">ਸੰਭਾਲੇ ਹੋਏ ਪਾਸਵਰਡ</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">ਤੁਹਾਡੇ ਵਲੋਂ ਸੰਭਾਲੇ ਲਾਗਇਨ ਜਾਂ %s ਨਾਲ ਸਿੰਕ ਕੀਤੇ ਇੱਥੇ ਵੇਖਾਏ ਜਾਣਗੇ।</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">ਤੁਹਾਡੇ ਵਲੋਂ %s ਵਿੱਚ ਸੰਭਾਲੇ ਜਾਂ ਸਿੰਕ ਕੀਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਇੱਥੇ ਦਿਖਾਇਆ ਜਾਵੇਗਾ। ਤੁਹਾਡੇ ਸਾਰੇ ਸੰਭਾਲੇ ਪਾਸਵਰਡ ਇੰਕ੍ਰਿਪਟ ਕੀਤੇ ਹੁੰਦੇ ਹਨ।</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸਿੰਕ ਬਾਰੇ ਹੋਰ ਜਾਣੋ।</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">ਸਿੰਕ ਬਾਰੇ ਹੋਰ ਜਾਣੋ</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">ਛੋਟਾਂ</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">ਨਾ ਸੰਭਾਲੇ ਹੋਏ ਲਾਗਇਨ ਅਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਇੱਥੇ ਸੰਭਾਲਿਆ ਜਾਵੇਗਾ।</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s ਇੱਥੇ ਦਿੱਤੀਆਂ ਹੋਈਆਂ ਸਾਈਟਾਂ ਲਈ ਪਾਸਵਰਡ ਨਹੀਂ ਸੰਭਾਲੇਗਾ।</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ਇਹਨਾਂ ਸਾਈਟਾਂ ਲਈ ਲਾਗਇਨ ਅਤੇ ਪਾਸਵਰਡ ਨਹੀਂ ਸੰਭਾਲੇ ਜਾਣਗੇ।</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s ਇਹਨਾਂ ਸਾਈਟਾਂ ਲਈ ਪਾਸਵਰਡ ਨਹੀਂ ਸੰਭਾਲੇਗਾ।</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">ਸਾਰੀਆਂ ਛੋਟਾਂ ਹਟਾ ਦਿਓ</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਖੋਜੋ</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">ਪਾਸਵਰਡ ਖੋਜੋ</string> <!-- The header for the site that a login is for --> @@ -1876,17 +1883,11 @@ <string name="saved_login_reveal_password">ਪਾਸਵਰਡ ਵੇਖਾਓ</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">ਪਾਸਵਰਡ ਲੁਕਾਓ</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਆਪਣੇ ਸੰਭਾਲੇ ਲਾਗਇਨ ਵੇਖਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਪਾਸਵਰਡ ਵੇਖਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ਆਪਣੇ ਲਾਗਇਨ ਅਤੇ ਪਾਸਵਰਡ ਸੁਰੱਖਿਅਤ ਕਰੋ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਪਾਸਵਰਡਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਆਪਣੇ ਲਾਗਇਨਾਂ ਅਤੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਨੂੰ ਰੱਖਣ ਵਾਲੇ ਕਿਸੇ ਦੀ ਪਹੁੰਚ ਤੋਂ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ ਡਿਵਾਈਸ ਲਾਕ ਪੈਟਰਨ, ਪਿੰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈਟ ਅੱਪ ਕਰੋ।</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਪਾਸਵਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਉੱਤੇ ਕਿਸੇ ਹੋਰ ਵੱਲੋਂ ਪਹੁੰਚ ਕਰਨ ਤੋਂ ਬਚਾਉਣ ਤੋਂ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ ਡਿਵਾਈਸ ਲਾਕ ਪੈਟਰਨ, ਪਿੰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ।</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">ਬਾਅਦ \'ਚ</string> @@ -1904,8 +1905,6 @@ <string name="saved_logins_sort_strategy_alphabetically">ਨਾਂ (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">ਆਖਰੀ ਵਰਤੋਂ</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਲੜੀਬਧ ਮੇਨੂ</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">ਪਾਸਵਰਡ ਮੇਨੂ ਨੂੰ ਲੜੀਬੱਧ ਕਰੋ</string> @@ -1915,40 +1914,26 @@ <string name="preferences_autofill">ਆਪੇ-ਭਰੋ</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">ਸਿਰਨਾਵੇਂ</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕਰੈਡਿਟ ਕਾਰਡ</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">ਭੁਗਤਾਨ ਦੇ ਢੰਗ</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕਾਰਡ ਸੰਭਾਲੋ ਅਤੇ ਆਪਣੇ-ਆਪ ਭਰੋ</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">ਭੁਗਤਾਨ ਦੇ ਢੰਗ ਸੰਭਾਲੋ ਅਤੇ ਭਰੋ</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">ਡਾਟਾ ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਹੈ</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s ਤੁਹਾਡੇ ਵਲੋਂ ਸੰਭਾਲੇ ਸਾਰੇ ਭੁਗਤਾਨ ਢੰਗਾਂ ਨੂੰ ਇੰਕ੍ਰਿਪਟ ਕਰਦਾ ਹੈ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">ਡਿਵਾਈਸਾਂ ਵਿਚਾਲੇ ਕਾਰਡਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">ਕਾਰਡ ਸਿੰਕ ਕਰੋ</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕਰੈਡਿਟ ਕਾਰਡ ਜੋੜੋ</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">ਕਾਰਡ ਜੋੜੋ</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸੰਭਾਲੇ ਹੋਏ ਕਾਰਡਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">ਕਾਰਡਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">ਸਿਰਨਾਵਾਂ ਜੋੜੋ</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">ਸਿਰਨਾਵਿਆਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸਿਰਨਾਵੇਂ ਸੰਭਾਲੋ ਅਤੇ ਆਪਣੇ-ਆਪ ਭਰੋ</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">ਸਿਰਨਾਵਿਆਂ ਨੂੰ ਸੰਭਾਲੋ ਅਤੇ ਭਰੋ</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">ਨੰਬਰ, ਈਮੇਲ ਅਤੇ ਭੇਜਣ ਵਾਲੇ ਸਿਰਨਾਵਿਆਂ ਸਮੇਤ ਜਾਣਕਾਰੀ</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">ਫ਼ੋਨ ਨੰਬਰਾਂ ਅਤੇ ਈਮੇਲ ਸਿਰਨਾਵਿਆਂ ਸਮੇਤ</string> @@ -1972,8 +1957,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">ਕਾਰਡ ਨੂੰ ਹਟਾਓ</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕੀ ਤੁਸੀਂ ਇਹ ਕਰੈਡਿਟ ਕਾਰਡ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">ਕਾਰਡ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">ਹਟਾਓ</string> @@ -1987,24 +1970,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">ਸੰਭਾਲੇ ਹੋਏ ਕਾਰਡ</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਵਾਜਬ ਕਰੈਡਿਟ ਕਾਰਡ ਨੰਬਰ ਦਿਓ ਜੀ</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">ਵਾਜਬ ਕਾਰਡ ਨੰਬਰ ਭਰੋ</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਇਹ ਖੇਤਰ ਭਰੋ</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">ਨਾਂ ਜੋੜੋ</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਕਾਰਡ ਵੇਖਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ਆਪਣੇ ਕਰੈਡਿਟ ਕਾਰਡ ਸੁਰੱਖਿਅਤ ਕਰੋ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਭੁਗਤਾਨ ਢੰਗਾਂ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰੋ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਆਪਣੀ ਡਿਵਾਇਸ ਲਈ ਲਾਕ ਪੈਟਰਨ, ਪਿੰਨ, ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ ਤਾਂ ਜੋ ਕਿਸੇ ਹੋਰ ਹੱਥ ਤੁਹਾਡਾ ਡਿਵਾਇਸ ਹੋਣ ਉੱਤੇ ਤੁਹਾਡੇ ਸੰਭਾਲੇ ਪਾਸਵਰਡ ਸੁਰੱਖਿਅਤ ਰਹਿਣ।</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">ਆਪਣੇ ਸੰਭਾਲੇ ਹੋਏ ਪਾਸਵਰਡ ਢੰਗਾਂ ਨੂੰ ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਉੱਤੇ ਕਿਸੇ ਹੋਰ ਵੱਲੋਂ ਪਹੁੰਚ ਕਰਨ ਤੋਂ ਬਚਾਉਣ ਤੋਂ ਸੁਰੱਖਿਅਤ ਕਰਨ ਲਈ ਡਿਵਾਈਸ ਲਾਕ ਪੈਟਰਨ, ਪਿੰਨ ਜਾਂ ਪਾਸਵਰਡ ਸੈੱਟ ਕਰੋ।</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">ਹੁਣੇ ਸੈਟ ਅੱਪ ਕਰੋ</string> @@ -2012,8 +1986,6 @@ <string name="credit_cards_warning_dialog_later">ਬਾਦ \'ਚ</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">ਆਪਣਾ ਡਿਵਾਇਸ ਅਣ-ਲਾਕ ਕਰੋ</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸੰਭਾਲੀ ਕਰੈਡਿਟ ਕਾਰਡ ਜਾਣਕਾਰੀ ਵਰਤਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">ਸੰਭਾਲੇ ਹੋਏ ਭੁਗਤਾਨ ਢੰਗਾਂ ਨੂੰ ਵਰਤਣ ਲਈ ਅਣ-ਲਾਕ ਕਰੋ</string> @@ -2023,12 +1995,6 @@ <string name="addresses_edit_address">ਸਿਰਨਾਵੇਂ ਨੂੰ ਸੋਧੋ</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">ਸਿਰਨਾਵਿਆਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰੋ</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">ਨਾਂ ਦਾ ਪਹਿਲਾਂ ਹਿੱਸਾ</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">ਮੱਧ ਨਾਂ</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">ਨਾਂ ਦਾ ਆਖਰੀ ਹਿੱਸਾ</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">ਨਾਂ</string> <!-- The header for the street address of an address --> @@ -2055,8 +2021,6 @@ <string name="addressess_delete_address_button">ਸਿਰਨਾਵੇਂ ਨੂੰ ਹਟਾਓ</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕੀ ਤੁਸੀਂ ਇਹ ਸਿਰਨਾਵੇਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">ਇਹ ਸਿਰਨਾਵੇਂ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">ਹਟਾਓ</string> @@ -2154,8 +2118,6 @@ <string name="login_menu_delete_button">ਹਟਾਓ</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">ਸੋਧੋ</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">ਕੀ ਤੁਸੀਂ ਇਹ ਲਾਗਇਨ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">ਕੀ ਤੁਸੀਂ ਇਸ ਪਾਸਵਰਡ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string> <!-- Positive action of a dialog asking to delete --> @@ -2163,41 +2125,23 @@ <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">ਰੱਦ ਕਰੋ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਚੋਣਾਂ</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">ਪਾਸਵਰਡ ਚੋਣਾਂ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਦੇ ਵੈੱਬ ਐਡਰੈਸ ਲਈ ਸੋਧਣਯੋਗ ਲਿਖਤ ਖੇਤਰ ਹੈ।</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">ਵੈੱਬਸਾਈਟ ਸਿਰਨਾਵਿਆਂ ਲਈ ਸੋਧ ਕਰਨ ਯੋਗ ਲਿਖਤ ਖੇਤਰ।</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਦੇ ਵਰਤੋਂਕਾਰ-ਨਾਂ ਲਈ ਸੋਧਣਯੋਗ ਲਿਖਤ ਖੇਤਰ ਹੈ।</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">ਵਰਤੋਂਕਾਰ-ਨਾਂ ਲਈ ਸੋਧ ਕਰਨ ਯੋਗ ਲਿਖਤ ਖੇਤਰ।</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ਲਾਗਇਨ ਦੇ ਪਾਸਵਰਡ ਲਈ ਸੋਧਣਯੋਗ ਲਿਖਤ ਖੇਤਰ ਹੈ।</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">ਪਾਸਵਰਡ ਲਈ ਸੋਧ ਕਰਨ ਯੋਗ ਲਿਖਤ ਖੇਤਰ।</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗਇਨ ਲਈ ਸੰਭਾਲੋ।</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">ਤਬਦੀਲੀਆਂ ਨੂੰ ਸੰਭਾਲੋ।</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">ਸੋਧੋ</string> <!-- The page title for editing a saved password. --> <string name="edit_2">ਪਾਸਵਰਡ ਨੂੰ ਸੋਧੋ</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ਨਵਾਂ ਲਾਗਇਨ ਜੋੜੋ</string> <!-- The page title for adding new password. --> <string name="add_login_2">ਪਾਸਵਰਡ ਜੋੜੋ</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ਪਾਸਵਰਡ ਚਾਹੀਦਾ ਹੈ</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">ਪਾਸਵਰਡ ਦਿਓ</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ਵਰਤੋਂਕਾਰ-ਨਾਂ ਚਾਹੀਦਾ ਹੈ</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">ਵਰਤੋਂਕਾਰ-ਨਾਂ ਦਿਓ</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">ਹੋਸਟ-ਨਾਂ ਚਾਹੀਦਾ ਹੈ</string> @@ -2545,6 +2489,8 @@ <string name="translations_bottom_sheet_negative_button">ਹਾਲੇ ਨਹੀਂ</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">ਅਸਲ ਵੇਖਾਓ</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">ਅਸਲ ਨਾ-ਅਨੁਵਾਦ ਕੀਤਾ ਸਫ਼ਾ ਲੋਡ ਕੀਤਾ</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">ਮੁਕੰਮਲ</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2602,6 +2548,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">ਉਲੱਥਾ ਸ਼ੀਟ ਬੰਦ ਕਰੋ</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">ਕੁਝ ਸੈਟਿੰਗਾਂ ਆਰਜ਼ੀ ਤੌਰ ਉੱਤੇ ਮੌਜੂਦ ਨਹੀਂ ਹਨ।</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">ਉਲੱਥੇ</string> @@ -2624,6 +2573,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">”ਹਮੇਸ਼ਾ ਟਰਾਂਸਲੇਟ ਕਰੋ“ ਅਤੇ "ਕਦੇ ਟਰਾਂਸਲੇਟ ਨਾ ਕਰੋ" ਪਸੰਦਾਂ ਦਾ ਇੰਤਜ਼ਾਮ ਕਰਨ ਲਈ ਭਾਸ਼ਾ ਚੁਣੋ।</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">ਭਾਸ਼ਾਵਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਬਾਅਦ ਵਿੱਚ ਮੁੜ ਜਾਂਚੋ।</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">ਟਰਾਂਸਲੇਸ਼ਨ ਲਈ ਪੇਸ਼ਕਸ਼ ਕਰੋ (ਮੂਲ)</string> @@ -2646,6 +2598,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s ਨੂੰ ਹਟਾਓ</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">ਸਾਈਟਾਂ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਬਾਅਦ ਵਿੱਚ ਮੁੜ ਜਾਂਚੋ।</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</string> @@ -2725,13 +2679,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">ਪਿੱਛੇ ਜਾਓ</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">ਡੀਬੱਗ ਦਰਾਜ ਨੂੰ ਖੋਲ੍ਹੋ</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">ਟੈਬ ਟੂਲ</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">ਟੈਬ ਗਿਣਤੀ</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">ਸਰਗਰਮ</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">ਸਰਗਰਮ</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">ਸਰਗਰਮ</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">ਨਾ-ਸਰਗਰਮ</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2742,6 +2701,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">ਟੈਬ ਬਣਾਉਣ ਵਾਲਾ ਟੂਲ</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">bਣਾਉਣ ਲਈ ਟੈਬਾਂ ਦੀ ਗਿਣਤੀ</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">ਲਿਖਤ ਖੇਤਰ ਖਾਲੀ ਹੈ</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">ਸਿਰਫ਼ ਸਕਰਾਤਮਕ ਮੁੱਲ ਹੀ ਭਰੋ</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">ਸਿਫ਼ਰ ਤੋਂ ਵੱਡਾ ਨੰਬਰ ਭਰੋ</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">ਇੱਕ ਕਾਰਵਾਈ ਰਾਹੀਂ ਵੱਧ ਤੋਂ ਵੱਧ ਤਿਆਰ ਹੋਣ ਵਾਲੀਆਂ ਟੈਬਾਂ (%1$s) ਦੀ ਗਿਣਤੀ ਅੱਪੜ ਗਈ ਹੈ</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">ਸਰਗਰਮ ਟੈਬਾਂ ਵਿੱਚ ਜੋੜੋ</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2758,11 +2727,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">ਭੇਜੋ</string> + <string name="micro_survey_submit_button_label">ਭੇਜੋ</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">ਬੰਦ ਕਰੋ</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">ਬੰਦ ਕਰੋ</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">ਤੁਹਾਡੀ ਫ਼ੀਡਬੈਕ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ ਹੈ!</string> + <string name="micro_survey_feedback_confirmation">ਤੁਹਾਡੀ ਫ਼ੀਡਬੈਕ ਲਈ ਤੁਹਾਡਾ ਧੰਨਵਾਦ ਹੈ!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">ਬਹੁਤ ਸੰਤੁਸ਼ਟ</string> <!-- Option for likert scale --> @@ -2774,6 +2743,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">ਬਹੁਤ ਅਸੰਤੁਸ਼ਟ</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">ਸਰਵੇਖਣ ਨੂੰ ਖੋਲ੍ਹੋ</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">ਸਰਵੇਖਣ ਨੂੰ ਬੰਦ ਕਰੋ</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">ਬੰਦ ਕਰੋ</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">ਲਾਗਇਨ</string> diff --git a/mobile/android/fenix/app/src/main/res/values-pl/strings.xml b/mobile/android/fenix/app/src/main/res/values-pl/strings.xml index 0ba564a816..bbf9f2122d 100644 --- a/mobile/android/fenix/app/src/main/res/values-pl/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-pl/strings.xml @@ -49,12 +49,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Ostatnio zachowane</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Ostatnio zachowane</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Wyświetl wszystkie dodane zakładki</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Wyświetl wszystkie dodane zakładki</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Usuń</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Usuń</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Zakładki</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Wyświetl wszystkie zakładki</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Usuń</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s jest tworzony przez Mozillę.</string> @@ -143,8 +151,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Nowa karta prywatna</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Skrót do haseł</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Hasła</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Skrót do haseł</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -213,6 +223,8 @@ <string name="resync_button_content_description">Synchronizuj ponownie</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Znajdź na stronie</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Znajdź na stronie…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Przetłumacz stronę</string> <!-- Browser menu button that saves the current tab to a collection --> @@ -248,9 +260,29 @@ <string name="browser_menu_customize_home_1">Dostosuj stronę startową</string> <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> - <string name="browser_menu_sign_in" tools:ignore="UnusedResources">Zaloguj się</string> - <!-- Browser menu caption label for the "Sign in" browser menu item described in browser_menu_sign_in --> - <string name="browser_menu_sign_in_caption" tools:ignore="UnusedResources">Synchronizuj hasła, karty i nie tylko</string> + <string name="browser_menu_sign_in">Zaloguj się</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Synchronizuj hasła, karty i nie tylko</string> + + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Ponownie zaloguj się do synchronizacji</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Wstrzymano synchronizację</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Nowa karta prywatna</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Hasła</string> + + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Nowości w przeglądarce %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Wersja na komputery</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Narzędzia</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Zachowaj</string> <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> @@ -558,6 +590,8 @@ <string name="preferences_account_sync_error">Połącz ponownie, aby wznowić synchronizację</string> <!-- Preference for language --> <string name="preferences_language">Język</string> + <!-- Preference for translation --> + <string name="preferences_translation">Tłumaczenie</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Udostępniane dane</string> <!-- Preference for data collection --> @@ -626,6 +660,20 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Niedozwolone</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Wymagane</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcjonalne</string> + <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> + <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Odczytywanie i zmienianie danych na witrynach</string> + <!-- The description of the icon that can delete one of the websites displayed --> + <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Usuń witrynę</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Zezwalaj na wszystkich witrynach</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Jeśli ufasz temu rozszerzeniu, możesz udzielić mu pozwolenia na każdej witrynie.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Inna kolekcja dodatków</string> @@ -650,7 +698,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Wskocz z powrotem</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Ostatnio dodane zakładki</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Ostatnio dodane zakładki</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Zakładki</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Ostatnio odwiedzone</string> @@ -2317,10 +2367,14 @@ <string name="translations_bottom_sheet_translate_from">Język źródłowy:</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Język docelowy:</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Wypróbuj inny język źródłowy</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Nie teraz</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Wyświetl w oryginale</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Wczytano oryginalną nieprzetłumaczoną stronę</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">OK</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2340,7 +2394,7 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">Nie obsługujemy jeszcze tego języka (%1$s).</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Więcej informacji</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Więcej informacji</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> @@ -2354,7 +2408,9 @@ <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Opcje tłumaczenia</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Opcje tłumaczenia</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Opcje tłumaczenia</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Zawsze proponuj tłumaczenie</string> <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> @@ -2372,6 +2428,9 @@ <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">Informacje o tłumaczeniach w przeglądarce %1$s</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Zamknij funkcję tłumaczenia</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Tłumaczenia</string> @@ -2494,6 +2553,8 @@ <string name="debug_drawer_title">Narzędzia do debugowania</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Przejdź wstecz</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Narzędzia kart</string> <!-- The title of the tab count section in Tab Tools. --> @@ -2516,4 +2577,40 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Dodaj do nieaktywnych kart</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Dodaj do prywatnych kart</string> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Kontynuuj</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Wypełnij tę ankietę</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Zasady ochrony prywatności</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Wyślij</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label">Zamknij</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Dziękujemy za opinię!</string> + + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Bardzo zadowolony</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Zadowolony</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Obojętny</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Niezadowolony</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Bardzo niezadowolony</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Dane logowania</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Obecna domena: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Dodaj fałszywe dane logowania do tej domeny</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Usuń dane logowania z nazwą użytkownika „%s”</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-pt-rBR/strings.xml b/mobile/android/fenix/app/src/main/res/values-pt-rBR/strings.xml index ec824d3eaa..c8b4cdf923 100644 --- a/mobile/android/fenix/app/src/main/res/values-pt-rBR/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-pt-rBR/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Extensões</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensões</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gerenciar extensões</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descobrir mais extensões</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informações da conta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir em aba normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Adicionar à tela do dispositivo</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Adicionar à tela do dispositivo…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,10 +236,14 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduzir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Salvar em coleção…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Salvar em coleção</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Compartilhar</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Compartilhar…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir no %1$s</string> @@ -287,6 +297,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Salvar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Adicionar aos favoritos</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar favorito</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Salvar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Ativar modo de leitura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desativar modo de leitura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traduzir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traduzido para %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nenhuma extensão aqui</string> @@ -384,8 +412,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Aviso de privacidade do Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Saiba mais em nosso aviso de privacidade</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Adoramos manter você seguro</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -594,7 +620,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Tradução</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tradução</string> + <!-- Preference for translations --> + <string name="preferences_translations">Tradução</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Escolha de dados</string> <!-- Preference for data collection --> @@ -667,10 +695,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Obrigatório</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Ler e alterar dados de sites</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Excluir site</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir em todos os sites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -798,8 +822,6 @@ <string name="preferences_sync_history">Histórico</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Favoritos</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Contas de acesso</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Senhas</string> <!-- Preference for syncing tabs --> @@ -826,8 +848,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s no %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartões de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pagamento</string> <!-- Preference for syncing addresses --> @@ -843,6 +863,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Aba de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Abas do %1$s fechadas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver abas fechadas recentemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceções</string> @@ -1773,12 +1801,8 @@ <string name="add_to_homescreen_description_2">Você pode facilmente adicionar este site à tela inicial do dispositivo para ter acesso imediato e navegar mais rápido com uma experiência semelhante a um aplicativo.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Contas e senhas</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Senhas</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar contas e senhas</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Salvar senhas</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Perguntar se deve salvar</string> @@ -1793,46 +1817,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Preencher nomes de usuário e senhas em outros aplicativos no dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar conta</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Adicionar senha</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar contas</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar senhas</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar contas entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronizar senhas entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Contas salvas</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Senhas salvas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">As contas que você salvar ou sincronizar no %s aparecem aqui.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">As senhas que você salva ou sincroniza no %s aparecem aqui. Todas as senhas que você salva são criptografadas.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Saiba mais sobre sincronização.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Saiba mais sobre sincronização</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceções</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Contas e senhas que não são salvas são mostradas aqui.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">O %s não salva senhas dos sites desta lista.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Contas e senhas desses sites não serão salvas.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">O %s não salva senhas desses sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Excluir todas as exceções</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Pesquisar contas</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Procurar senhas</string> <!-- The header for the site that a login is for --> @@ -1861,18 +1866,12 @@ <string name="saved_login_reveal_password">Exibir senha</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar senha</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloqueie para ver suas contas salvas</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloqueie para ver as senhas salvas</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteja suas contas e senhas</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Proteja as senhas salvas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure um método de bloqueio do dispositivo (desenho, código PIN ou senha) para proteger o acesso a suas contas e senhas salvas, caso outras pessoas usem seu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configure um método de bloqueio do dispositivo (desenho, código PIN ou senha) para proteger o acesso a suas senhas salvas, caso outras pessoas usem seu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Mais tarde</string> @@ -1889,8 +1888,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nome (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Data de uso</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menu de ordenação de contas</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menu de ordenação de senhas</string> @@ -1900,41 +1897,27 @@ <string name="preferences_autofill">Preenchimento automático</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Endereços</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartões de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pagamento</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar e preencher cartões automaticamente</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Salvar e preencher métodos de pagamento</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Os dados são criptografados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">O %s criptografa todos os métodos de pagamento que você salva</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar cartões entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar cartões</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar cartão de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Adicionar cartão</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gerenciar cartões salvos</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gerenciar cartões</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adicionar endereço</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gerenciar endereços</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar e preencher endereços automaticamente</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Salvar e preencher endereços</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluir informações como números, email e endereços de entrega</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Incluir números de telefone e endereços de email</string> @@ -1958,8 +1941,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Excluir cartão</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem certeza que quer excluir este cartão de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Excluir cartão?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Excluir</string> @@ -1973,24 +1954,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartões salvos</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Digite um número de cartão de crédito válido</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Digite um número de cartão válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Preencha este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Adicionar um nome</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloqueie para ver seus cartões salvos</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteja seus cartões de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Proteja seus métodos de pagamento salvos</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure um método de bloqueio do dispositivo (desenho, código PIN ou senha) para proteger o acesso a seus cartões de crédito salvos, caso outras pessoas usem seu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configure um método de bloqueio do dispositivo (desenho, código PIN ou senha) para proteger o acesso a seus métodos de pagamento salvos, caso outras pessoas usem seu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar agora</string> @@ -1999,9 +1971,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquear dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloqueie para usar informações armazenadas de cartões de crédito</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloqueie para usar formas de pagamento salvas</string> <!-- Title of the "Add address" screen --> @@ -2011,12 +1980,6 @@ <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gerenciar endereços</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Primeiro nome</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Nome do meio</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Sobrenome</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nome</string> <!-- The header for the street address of an address --> @@ -2043,8 +2006,6 @@ <string name="addressess_delete_address_button">Excluir endereço</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem certeza que quer excluir este endereço?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Excluir este endereço?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Excluir</string> @@ -2142,49 +2103,29 @@ <string name="login_menu_delete_button">Excluir</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem certeza que quer excluir esta conta?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Tem certeza que quer excluir esta senha?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Excluir</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opções da conta</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opções de senhas</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável do endereço web da conta.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">O campo de texto editável do endereço do site.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável do nome de usuário da conta.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">O campo de texto editável do nome de usuário.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável da senha da conta.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">O campo de texto editável da senha.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Salvar alterações na conta.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Salvar alterações.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar senha</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar conta</string> <!-- The page title for adding new password. --> <string name="add_login_2">Adicionar senha</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Senha é obrigatória</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Digite uma senha</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Nome de usuário é obrigatório</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Digite um nome de usuário</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Nome de servidor é obrigatório</string> @@ -2597,6 +2538,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Fechar painel de tradução</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algumas configurações estão temporariamente indisponíveis.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Tradução</string> @@ -2619,6 +2563,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecione um idioma para gerenciar as preferências de ”sempre traduzir“ e ”nunca traduzir“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Não foi possível carregar idiomas. Tente novamente mais tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Oferecer tradução (padrão)</string> @@ -2641,6 +2588,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Remover %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Não foi possível carregar sites. Tente novamente mais tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Excluir %1$s?</string> @@ -2719,13 +2668,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Voltar à página anterior</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir painel de depuração</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Ferramentas de abas</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Número de abas</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Ativas</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Ativas</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Ativo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inativas</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2736,6 +2690,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Ferramenta de criação de abas</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Número de abas a criar</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">O campo de texto está vazio</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Insira apenas números inteiros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Insira um número maior que zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Excedido o número máximo de abas (%1$s) que podem ser geradas em uma operação</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Adicionar às abas ativas</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2752,11 +2716,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Aviso de privacidade</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Enviar</string> + <string name="micro_survey_submit_button_label">Enviar</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Fechar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Fechar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Obrigado por sua opinião!</string> + <string name="micro_survey_feedback_confirmation">Obrigado por sua opinião!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muito satisfeito</string> <!-- Option for likert scale --> @@ -2768,6 +2732,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muito insatisfeito</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir pesquisa de opinião</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Fechar pesquisa de opinião</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Fechar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Contas de acesso</string> diff --git a/mobile/android/fenix/app/src/main/res/values-pt-rPT/strings.xml b/mobile/android/fenix/app/src/main/res/values-pt-rPT/strings.xml index 35a61211fc..3a9bbb4c9a 100644 --- a/mobile/android/fenix/app/src/main/res/values-pt-rPT/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-pt-rPT/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Extras</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensões</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gerir extensões</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Descubra mais extensões</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informações da conta</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Abrir num separador normal</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Adicionar ao ecrã Inicial</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Adicionar ao ecrã inicial…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instalar</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,9 +236,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Traduzir página</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Guardar na coleção…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Guardar na coleção</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Partilhar</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Partilhar…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Abrir no %1$s</string> @@ -285,6 +295,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Guardar</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Adicionar página aos marcadores</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Editar marcador</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Guardar como PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Ativar Vista de leitura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Desativar a Vista de leitura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Traduzir página…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traduzido para %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprimir…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Sem extensões aqui</string> @@ -382,8 +410,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Política de privacidade do Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Saiba mais nas nossas informações de privacidade</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Adoramos mantê-lo(a) seguro(a)</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -592,7 +618,9 @@ <!-- Preference for language --> <string name="preferences_language">Idioma</string> <!-- Preference for translation --> - <string name="preferences_translation">Tradução</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tradução</string> + <!-- Preference for translations --> + <string name="preferences_translations">Traduções</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Opções de dados</string> <!-- Preference for data collection --> @@ -665,10 +693,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Necessário</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Opcional</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Ler e alterar dados de websites</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Eliminar site</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permitir para todos os sites</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -774,7 +798,7 @@ <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Experimente reiniciar as extensões</string> <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> - <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Tente reiniciar as extensões</string> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Experimentar reiniciar as extensões</string> <!-- The user will continue with all add-ons disabled --> <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Continuar com as extensões desativadas</string> @@ -794,8 +818,6 @@ <string name="preferences_sync_history">Histórico</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Marcadores</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciais</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Palavras-passe</string> <!-- Preference for syncing tabs --> @@ -822,8 +844,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s no %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartões de crédito</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Métodos de pagamento</string> <!-- Preference for syncing addresses --> @@ -839,6 +859,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Separador de %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s separadores fechados: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ver separadores fechados recentemente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceções</string> @@ -1770,11 +1798,7 @@ <string name="add_to_homescreen_description_2">Pode adicionar facilmente este site ao ecrã inicial do seu dispositivo para ter acesso instantâneo e navegar mais rápido, com uma experiência semelhante ao de uma aplicação.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciais e palavras-passe</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Palavras-passe</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar credenciais e palavras-passe</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Guardar palavras-passe</string> @@ -1791,47 +1815,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Preencher nomes de utilizador e palavras-passe noutras aplicações no seu dispositivo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar credenciais</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Adicionar palavra-passe</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronização de credenciais</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sincronizar palavras-passe</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sincronizar credenciais entre dispositivos</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sincronize palavras-passe entre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Credenciais guardadas</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Palavras-passe guardadas</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">As credenciais que guardar ou sincronizar com o %s serão apresentadas aqui.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">As palavras-passe que guardar ou sincronizar com o %s serão listadas aqui. Todas as palavras-passe que guarda são encriptadas. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Saber mais sobre a sincronização.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Saber mais sobre a sincronização</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Exceções</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">As credenciais e palavras-passe que não estão guardadas serão mostradas aqui.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">O %s não irá guardar palavras-passe para sites listados aqui.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">As credenciais e palavras-passe não serão guardadas para estes sites.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">O %s não irá guardar as palavras-passe para estes sites.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Eliminar todas as exceções</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Pesquisar credenciais</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Procurar palavras-passe</string> <!-- The header for the site that a login is for --> @@ -1861,17 +1866,11 @@ <string name="saved_login_reveal_password">Mostrar palavra-passe</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ocultar palavra-passe</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloqueie para ver as credenciais guardadas</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Desbloqueie para ver as palavras-passe guardadas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteja as suas credenciais e palavras-passe</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Proteja as suas palavras-passe guardadas</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure um padrão, PIN ou palavra-passe de bloqueio do dispositivo para impedir que as suas credenciais e palavras-passe guardadas sejam acedidas por outra pessoa que tenha acesso ao seu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Configure um padrão, PIN ou palavra-passe de bloqueio do dispositivo para impedir que as suas palavras-passe guardadas sejam acedidas por outra pessoa que tenha acesso ao seu dispositivo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Mais tarde</string> @@ -1888,8 +1887,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Nome (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Última utilização</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Menu de ordenação de credenciais</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menu de ordenação de palavras-passe</string> @@ -1899,29 +1896,19 @@ <string name="preferences_autofill">Preenchimento automático</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Endereços</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Cartões de crédito</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Métodos de pagamento</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar e preencher automaticamente cartões</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Guardar e preencher métodos de pagamento</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Os dados são encriptados</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">O %s encripta todos os métodos de pagamento que guarda</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizar cartões entre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizar cartões</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar cartão de crédito</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Adicionar cartão</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Gerir cartões guardados</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Gerir cartões</string> <!-- Preference option for adding an address --> @@ -1929,12 +1916,8 @@ <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gerir endereços</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar e preencher automaticamente endereços</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Guardar e preencher endereços</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Incluir informações como números, e-mail e endereços de entrega</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inclui números de telefone e endereços de e-mail</string> @@ -1958,8 +1941,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Eliminar cartão</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem a certeza de que quer apagar este cartão de crédito?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Eliminar cartão?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Apagar</string> @@ -1973,23 +1954,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartões guardados</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor, introduza um número de cartão de crédito válido</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Insira um número de cartão válido</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Por favor preencha este campo</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Adicionar um nome</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Desbloquear para ver os cartões guardados</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Proteja os seus cartões de crédito</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Proteja os seus métodos de pagamento guardados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Configure um padrão, PIN ou palavra-passe de bloqueio do dispositivo para impedir que os seus cartões de crédito guardados sejam acedidos por outra pessoa que tenha acesso ao seu dispositivo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Configure um padrão, PIN ou palavra-passe de bloqueio do dispositivo para impedir que os seus métodos de pagamento guardados sejam acedidos por outra pessoa que tenha acesso ao seu dispositivo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Configurar agora</string> @@ -1997,8 +1970,6 @@ <string name="credit_cards_warning_dialog_later">Mais tarde</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Desbloquear o seu dispositivo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Desbloquear para utilizar as informações de cartão de crédito armazenadas</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Desbloquear para utilizar métodos de pagamento guardados</string> @@ -2008,12 +1979,6 @@ <string name="addresses_edit_address">Editar endereço</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gerir endereços</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Primeiro nome</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Nome do meio</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Último nome</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Nome</string> <!-- The header for the street address of an address --> @@ -2040,8 +2005,6 @@ <string name="addressess_delete_address_button">Apagar endereço</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem a certeza de que quer eliminar este endereço?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Eliminar este endereço?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Apagar</string> @@ -2140,49 +2103,29 @@ <string name="login_menu_delete_button">Eliminar</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Editar</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Tem a certeza que deseja eliminar esta credencial?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Tem a certeza que quer eliminar esta palavra-passe?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Eliminar</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Cancelar</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Opções de credenciais</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Opções de palavra-passe</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável para o endereço de Internet da credencial.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">O campo de texto editável para o endereço do site.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável para o nome de utilizador da credencial.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">O campo de texto editável para o nome de utilizador.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">O campo de texto editável para a palavra-passe da credencial.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">O campo de texto editável para a palavra-passe.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Guardar alterações na credencial.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Guardar alterações.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Editar</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Editar palavra-passe</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Adicionar nova credencial</string> <!-- The page title for adding new password. --> <string name="add_login_2">Adicionar palavra-passe</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">É necessária uma palavra-passe</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Introduza uma palavra-passe</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">É necessário um nome de utilizador</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Introduza um nome de utilizador</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">É necessário um nome de servidor</string> @@ -2525,13 +2468,13 @@ <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Traduzir para</string> <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> - <string name="translations_bottom_sheet_translate_from_unsupported_language">Tente outro idioma fonte</string> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Tentar outro idioma fonte</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Agora não</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Mostrar original</string> <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> - <string name="translations_bottom_sheet_restore_accessibility_announcement">Carregada página original não traduzida</string> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Carregada a página original não traduzida</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Feito</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2588,6 +2531,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Fechar folha de traduções</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Algumas definições estão temporariamente indisponíveis.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Traduções</string> @@ -2610,6 +2556,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Selecione um idioma para gerir as preferências “traduzir sempre” e “nunca traduzir”.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Não foi possível carregar os idiomas. Por favor, volte mais tarde.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Oferecer para traduzir (predefinição)</string> @@ -2632,6 +2581,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Remover %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Não foi possível carregar os sites. Por favor, volte mais tarde.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Eliminar %1$s?</string> @@ -2709,13 +2660,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navegar de volta</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Abrir caixa de depuração</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Ferramentas de separadores</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Contagem de separadores</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Ativo</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Ativo</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Ativo</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inativo</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2726,6 +2682,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Ferramenta de criação de separadores</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Quantidade de separadores a criar</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">O campo de texto está vazio</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Introduza apenas inteiros positivos</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Introduza um número maior que zero</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Excedido o número máximo de (%1$s) separadores que podem ser gerados numa operação</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Adicionar aos separadores ativos</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2740,24 +2706,32 @@ <!-- The survey header --> <string name="micro_survey_survey_header">Concluir este questionário</string> <!-- The privacy notice link --> - <string name="micro_survey_privacy_notice">Política de privacidade</string> + <string name="micro_survey_privacy_notice">Informação de privacidade</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Submeter</string> + <string name="micro_survey_submit_button_label">Submeter</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Fechar</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Fechar</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Obrigado pela sua opinião!</string> + <string name="micro_survey_feedback_confirmation">Obrigado pela sua opinião!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Muito satisfeito(a)</string> <!-- Option for likert scale --> - <string name="likert_scale_option_2" tools:ignore="UnusedResources">Satisfeito</string> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Satisfeito(a)</string> <!-- Option for likert scale --> - <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neutro</string> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neutro(a)</string> <!-- Option for likert scale --> - <string name="likert_scale_option_4" tools:ignore="UnusedResources">Insatisfeito</string> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Insatisfeito(a)</string> <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Muito insatisfeito(a)</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir inquérito</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Fechar inquérito</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Fechar</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Credenciais</string> diff --git a/mobile/android/fenix/app/src/main/res/values-rm/strings.xml b/mobile/android/fenix/app/src/main/res/values-rm/strings.xml index 84687df723..da3bde562b 100644 --- a/mobile/android/fenix/app/src/main/res/values-rm/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-rm/strings.xml @@ -386,6 +386,8 @@ <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_description_nimbus_4" tools:ignore="UnusedResources">Dapli che 100 milliuns persunas protegian lur sfera privata cun tscherner in navigatur dad ina organisaziun senza finamira da profit.</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_5" tools:ignore="UnusedResources">Ils fastizaders enconuschents? Bloccads automaticamain. Extensiuns? Emprova tuttas 700. PDFs? Noss lectur integrà als administrescha senza problems.</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_description_nimbus_2" moz:RemovedIn="124" tools:ignore="UnusedResources">Noss navigatur dad in\'organisaziun senza finamira da profit, gida ad evitar che interpresas ta persequiteschian a la zuppada en il web.\n \nLegia dapli dal tema en nossas infurmaziuns davart la protecziun da datas.</string> <!-- Text for the link to the privacy notice webpage for set as firefox default browser screen. diff --git a/mobile/android/fenix/app/src/main/res/values-ru/strings.xml b/mobile/android/fenix/app/src/main/res/values-ru/strings.xml index 1fe07b765d..7f2b52db90 100644 --- a/mobile/android/fenix/app/src/main/res/values-ru/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-ru/strings.xml @@ -206,6 +206,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Дополнения</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Расширения</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Управление расширениями</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Откройте для себя больше расширений</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Ваш аккаунт</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -224,6 +228,8 @@ <string name="browser_menu_open_in_regular_tab">Открыть в обычной вкладке</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">На домашний экран</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Добавить на домашний экран…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Установить</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -235,9 +241,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Перевести страницу</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Сохранить в коллекцию…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">В сборник</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Поделиться</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Поделиться…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Открыть в %1$s</string> @@ -292,6 +302,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Сохранить</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Добавить страницу в закладки</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Изменить закладку</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Сохранить как PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Включить Вид для чтения</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Отключить Вид для чтения</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Перевести страницу…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Переведено на %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Печать…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Здесь нет расширений</string> @@ -389,8 +417,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Уведомление о конфиденциальности Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Узнайте больше в нашем уведомлении о конфиденциальности</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Нам нравится обеспечивать вашу безопасность</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -599,7 +625,9 @@ <!-- Preference for language --> <string name="preferences_language">Язык</string> <!-- Preference for translation --> - <string name="preferences_translation">Перевод</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Перевод</string> + <!-- Preference for translations --> + <string name="preferences_translations">Переводы</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Выбор данных</string> <!-- Preference for data collection --> @@ -672,12 +700,8 @@ <!-- The title of the required permissions section from addon's permissions screen --> <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Обязательно</string> <!-- The title of the optional permissions section from addon's permissions screen --> - <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Необязательно</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Чтение и изменение данных веб-сайтов</string> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Необязательные</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Удалить веб-сайт</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Разрешить для всех сайтов</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -803,8 +827,6 @@ <string name="preferences_sync_history">Историю</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Закладки</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Пароли</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Пароли</string> <!-- Preference for syncing tabs --> @@ -831,8 +853,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s на %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Банковские карты</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Способы оплаты</string> <!-- Preference for syncing addresses --> @@ -848,6 +868,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Вкладка с %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Закрыто %1$s вкладок: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Просмотр недавно закрытых вкладок</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Исключения</string> @@ -1796,12 +1824,8 @@ <string name="add_to_homescreen_description_2">Вы можете легко добавить этот сайт на домашний экран вашего устройства, чтобы иметь к нему мгновенный доступ.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Пароли</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Пароли</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Сохранение паролей</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Сохранять пароли</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Предлагать сохранить</string> @@ -1816,47 +1840,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Заполнять имена пользователей и пароли в других приложениях на вашем устройстве.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавить логин</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Добавить пароль</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронизация логинов</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Синхронизировать пароли</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронизировать логины между устройствами</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Синхронизировать пароли между устройствами</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Сохранённые пароли</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Сохранённые пароли</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Пароли, которые вы сохраняете или синхронизируете в %s, появятся тут.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Пароли, которые вы сохраните или синхронизируете в %s, будут показаны здесь. Все сохраняемые вами пароли зашифрованы. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Узнайте больше о синхронизации.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Узнайте больше о синхронизации</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Исключения</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Здесь будут показаны не сохраняемые логины и пароли.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s не будет сохранять пароли для перечисленных здесь сайтов.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Логины и пароли для этих сайтов сохраняться не будут.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s не будет сохранять пароли для этих сайтов.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Удалить все исключения</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Поиск логинов</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Поиск паролей</string> <!-- The header for the site that a login is for --> @@ -1885,17 +1890,11 @@ <string name="saved_login_reveal_password">Показать пароль</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Скрыть пароль</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Разблокируйте, чтобы просмотреть сохранённые пароли</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Разблокируйте, чтобы просмотреть сохранённые пароли</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Защитите свои логины и пароли</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Защитите сохранённые пароли</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройте графический ключ, Пин-код или пароль для блокировки устройства, чтобы защитить сохранённые пароли, если кто-либо ещё получит доступ к вашему устройству.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Настройте графический ключ, пин-код или пароль для разблокировки устройства, чтобы защитить сохранённые пароли на случай, если кто-либо ещё получит доступ к вашему устройству.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Позже</string> @@ -1912,8 +1911,6 @@ <string name="saved_logins_sort_strategy_alphabetically">По имени (А-Я)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">По последнему использованию</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Меню сортировки логинов</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Меню сортировки паролей</string> @@ -1923,41 +1920,27 @@ <string name="preferences_autofill">Автозаполнение</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Адреса</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Банковские карты</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Способы оплаты</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Сохранять и автоматически заполнять данные карт</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Сохранить и заполнять способы оплаты</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Данные зашифрованы</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s шифрует все сохраняемые вами способы оплаты</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Синхронизировать карты между различными устройствами</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Синхронизировать карты</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавить банковскую карту</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Добавить карту</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Управление сохранёнными картами</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Управление картами</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Добавить адрес</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Управление адресами</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Сохранять и автоматически заполнять адреса</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Сохранять и заполнять адреса</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Включая такие сведения, как номера, адреса эл. почты и доставок</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Включает номера телефонов и адреса электронной почты</string> @@ -1981,8 +1964,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Удалить карту</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы уверены, что хотите удалить эту банковскую карту?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Удалить карту?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Удалить</string> @@ -1995,24 +1976,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Сохранённые карты</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Пожалуйста, введите правильный номер карты</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Введите корректный номер карты</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Пожалуйста, заполните это поле</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Добавьте имя</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Разблокируйте, чтобы просмотреть сохранённые карты</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Защитите свои банковские карты</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Защитите сохранённые способы оплаты</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройте графический ключ, Пин-код или пароль для блокировки устройства, чтобы защитить сохранённые банковские карты, если кто-либо ещё получит доступ к вашему устройству.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Настройте графический ключ, Пин-код или пароль для разблокировки устройства, чтобы защитить сохранённые способы оплаты, на случай, если кто-либо ещё получит доступ к вашему устройству.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Настроить сейчас</string> @@ -2020,8 +1992,6 @@ <string name="credit_cards_warning_dialog_later">Позже</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Разблокируйте своё устройство</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Разблокируйте, чтобы использовать сохранённые данные банковской карты</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Разблокируйте, чтобы использовать сохранённые способы оплаты</string> @@ -2031,12 +2001,6 @@ <string name="addresses_edit_address">Изменить адрес</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Управление адресами</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Имя</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Отчество</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Фамилия</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Название</string> <!-- The header for the street address of an address --> @@ -2062,8 +2026,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Удалить адрес</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы уверены, что хотите удалить этот адрес?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Удалить этот адрес?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Удалить</string> @@ -2161,49 +2123,29 @@ <string name="login_menu_delete_button">Удалить</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Править</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Вы уверены, что хотите удалить этот пароль?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Вы уверены, что хотите удалить этот пароль?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Удалить</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Отмена</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Настройки логина</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Настройки пароля</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Редактируемое текстовое поле для веб-адреса логина.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Редактируемое текстовое поле для адреса веб-сайта.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Редактируемое текстовое поле для имени пользователя логина.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Редактируемое текстовое поле для имени пользователя.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Редактируемое текстовое поле для пароля логина.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Редактируемое текстовое поле для пароля.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Сохранить изменения в логине.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Сохранить изменения.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Правка</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Изменить пароль</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Добавить новый логин</string> <!-- The page title for adding new password. --> <string name="add_login_2">Добавить пароль</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Требуется пароль</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Введите пароль</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Требуется имя пользователя</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Введите имя пользователя</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Введите имя сервера</string> @@ -2611,6 +2553,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Закрыть область переводов</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Некоторые настройки временно недоступны.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Переводы</string> @@ -2633,6 +2578,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Выберите язык для управления настройками «всегда переводить» и «никогда не переводить».</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Не удалось загрузить языки. Пожалуйста, проверьте позже.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Предлагать перевод (по умолчанию)</string> @@ -2655,6 +2603,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Удалить %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Не удалось загрузить сайты. Пожалуйста, проверьте позже.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Удалить %1$s?</string> @@ -2732,13 +2682,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Перейти назад</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Открыть панель отладки</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Инструменты вкладок</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Число вкладок</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Активных</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Активных</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Активные</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Неактивных</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2749,6 +2704,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Инструмент создания вкладок</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Количество вкладок для создания</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Текстовое поле пусто</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Пожалуйста, введите только положительные целые числа</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Пожалуйста, введите число больше нуля</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Превышено максимальное число вкладок (%1$s), которое может быть сгенерировано за одну операцию</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Добавить в активные вкладки</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2765,11 +2730,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Уведомление о конфиденциальности</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Отправить</string> + <string name="micro_survey_submit_button_label">Отправить</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Закрыть</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Закрыть</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Спасибо за ваш отзыв!</string> + <string name="micro_survey_feedback_confirmation">Спасибо за ваш отзыв!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Полностью удовлетворяет</string> <!-- Option for likert scale --> @@ -2781,6 +2746,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Совсем не удовлетворяет</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Открыть опрос</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Закрыть опрос</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Закрыть</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Логины</string> diff --git a/mobile/android/fenix/app/src/main/res/values-sat/strings.xml b/mobile/android/fenix/app/src/main/res/values-sat/strings.xml index 45ab837aed..4b085d93f8 100644 --- a/mobile/android/fenix/app/src/main/res/values-sat/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sat/strings.xml @@ -45,12 +45,21 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">ᱱᱤᱛ ᱥᱟᱺᱪᱟᱣᱟᱜ</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">ᱱᱤᱛ ᱥᱟᱺᱪᱟᱣᱟᱜ</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">ᱡᱷᱚᱛᱚ ᱥᱟᱺᱪᱟᱣ ᱠᱟᱱ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">ᱡᱷᱚᱛᱚ ᱥᱟᱺᱪᱟᱣ ᱠᱟᱱ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">ᱚᱪᱚᱜᱽ ᱢᱮ</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">ᱚᱪᱚᱜᱽ ᱢᱮ</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ</string> + + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">ᱡᱷᱚᱛᱚ ᱵᱩᱠᱢᱟᱨᱠᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">ᱚᱪᱚᱜᱽ ᱢᱮ</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s ᱛᱮᱭᱟᱨ ᱦᱩᱭ ᱠᱟᱱᱟ ᱢᱳᱡᱤᱞᱟ ᱫᱟᱨᱟᱭᱛᱮ ᱾</string> @@ -144,8 +153,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵᱽ</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱥᱚᱴᱠᱚᱴ</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱥᱚᱴᱠᱚᱴ</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -190,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">ᱮᱰ-ᱟᱸᱱᱥ</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">ᱮᱠᱥᱴᱮᱱᱥᱚᱱᱠᱚ</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">ᱮᱠᱮᱴᱮᱱᱮᱚᱱ ᱠᱚ ᱢᱮᱱᱟᱡᱽ ᱢᱮ</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">ᱟᱨᱦᱚᱸ ᱰᱷᱮᱨ ᱮᱠᱥᱴᱮᱱᱥᱚᱱ ᱯᱟᱱᱛᱮ ᱢᱮ</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">ᱠᱷᱟᱛᱟ ᱵᱤᱵᱨᱚᱬ</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -208,18 +223,26 @@ <string name="browser_menu_open_in_regular_tab">ᱱᱟᱶᱟ ᱴᱮᱵᱽ ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">ᱚᱲᱟᱜ ᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">ᱚᱲᱟᱜ ᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">ᱵᱚᱦᱟᱞ ᱢᱮ</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">ᱨᱤᱥᱭᱝᱠ</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">ᱥᱟᱦᱴᱟ ᱨᱮ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">ᱥᱟᱦᱴᱟ ᱨᱮ ᱯᱟᱱᱛᱮ ᱢᱮ…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">ᱥᱟᱦᱴᱟ ᱛᱚᱨᱡᱚᱢᱟᱭ ᱢᱮ</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱺᱪᱟᱣ ᱢᱮ…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">ᱛᱩᱢᱟᱹᱞ ᱨᱮ ᱥᱟᱺᱪᱟᱣ ᱢᱮ</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">ᱦᱟᱹᱴᱤᱧ</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">ᱦᱟᱹᱴᱤᱧ ᱢᱮ…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s ᱨᱮ ᱡᱷᱤᱡᱽ ᱢᱮ</string> @@ -247,9 +270,46 @@ <string name="browser_menu_customize_home_1">ᱚᱲᱟᱜᱥᱟᱦᱴᱟ ᱠᱩᱥᱤᱛᱮ ᱫᱚᱦᱚᱭ ᱢᱮ</string> <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> - <string name="browser_menu_sign_in" tools:ignore="UnusedResources">ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ</string> - <!-- Browser menu caption label for the "Sign in" browser menu item described in browser_menu_sign_in --> - <string name="browser_menu_sign_in_caption" tools:ignore="UnusedResources">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ, ᱴᱮᱵᱽ ᱟᱨ ᱟᱨᱦᱚᱸ ᱟᱭᱢᱟ ᱡᱤᱱᱤᱥᱠᱚ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱢᱮ</string> + <string name="browser_menu_sign_in">ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ, ᱴᱮᱵᱽ ᱟᱨ ᱟᱨᱦᱚᱸ ᱟᱭᱢᱟ ᱡᱤᱱᱤᱥᱠᱚ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱢᱮ</string> + + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">ᱥᱭᱝᱠ ᱞᱟᱹᱜᱤᱫ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱢᱮ</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱛᱷᱩᱢ ᱠᱟᱱᱟ</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱠ ᱴᱮᱵᱽ</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">%1$s ᱨᱮ ᱱᱟᱶᱟ</string> + + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">ᱰᱮᱥᱠᱴᱚᱯ ᱥᱟᱭᱤᱴ ᱛᱮ ᱪᱟᱞᱟᱜ ᱢᱮ</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">ᱦᱟᱹᱛᱤᱭᱟᱹᱨ ᱠᱚ</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">ᱥᱟᱺᱪᱟᱣ ᱢᱮ</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱵᱩᱩᱠᱢᱟᱨᱠ ᱢᱮ</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">ᱵᱩᱠᱢᱟᱨᱠ ᱥᱟᱯᱲᱟᱣ ᱢᱮ</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF ᱞᱮᱠᱷᱟ ᱥᱟᱺᱪᱟᱣ ᱢᱮ…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">ᱯᱟᱲᱦᱟᱣ ᱧᱮᱞᱡᱚᱝ ᱞᱮᱠᱷᱟ ᱮᱢ ᱪᱷᱚᱭ ᱢᱮ</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">ᱯᱟᱲᱦᱟᱣ ᱧᱮᱞᱡᱚᱝ ᱞᱮᱠᱷᱟ ᱵᱚᱸᱫᱚᱭ ᱢᱮ</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">ᱥᱟᱦᱴᱟ ᱛᱚᱨᱡᱚᱢᱟᱭ ᱢᱮ…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s ᱛᱮ ᱛᱚᱨᱡᱚᱢᱟ ᱠᱟᱱᱟ</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">ᱪᱷᱟᱯᱟ…</string> <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> @@ -347,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">ᱯᱷᱚᱭᱟᱨᱯᱷᱚᱠᱥ ᱡᱟᱹᱯᱛᱤ ᱠᱷᱚᱵᱚᱨ ᱾</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">ᱟᱞᱮᱭᱟᱜ ᱱᱤᱥᱚᱱ ᱠᱷᱚᱵᱚᱨ ᱨᱮ ᱰᱷᱮᱨ ᱡᱤᱱᱤᱥ ᱥᱮᱬᱟᱭ ᱢᱮ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">ᱟᱢ ᱴᱷᱤᱠ ᱨᱮ ᱫᱚᱦᱚᱢᱮᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱥᱤᱭᱟᱜᱼᱟ ᱞᱮ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -556,6 +614,10 @@ <string name="preferences_account_sync_error">ᱥᱭᱝᱠ ᱠᱚ ᱪᱟᱹᱞᱩ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱫᱩᱦᱲᱟᱹ ᱡᱩᱰᱟᱹᱣ</string> <!-- Preference for language --> <string name="preferences_language">ᱯᱟᱹᱨᱥᱤ</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">ᱛᱚᱨᱡᱚᱢᱟ</string> + <!-- Preference for translations --> + <string name="preferences_translations">ᱛᱚᱨᱡᱚᱢᱟᱠᱚ</string> <!-- Preference for data choices --> <string name="preferences_data_choices">ᱥᱟᱹᱠᱷᱤᱭᱟᱹᱛ ᱠᱩᱥᱤᱭᱟᱜ ᱠᱚ</string> <!-- Preference for data collection --> @@ -623,6 +685,16 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">ᱢᱟᱱᱟ ᱜᱮᱭᱟ</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">ᱞᱟᱹᱠᱛᱤ</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">ᱢᱚᱱᱮᱛᱮᱭᱟᱜ</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">ᱡᱷᱚᱛᱚ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱮᱢᱪᱷᱚᱭ ᱢᱮ</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">ᱟᱢ ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱮᱠᱥᱴᱮᱱᱥᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱷᱚᱨᱥᱟ ᱮᱫ ᱠᱷᱟᱱ, ᱟᱢ ᱫᱚ ᱡᱷᱚᱛᱚ ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱨᱮ ᱦᱚᱠᱮᱢ ᱮᱢ ᱫᱟᱲᱮ ᱟᱭᱟ ᱾</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">ᱠᱟᱹᱥᱴᱚᱢ ᱮᱰᱰᱼᱚᱱ ᱛᱩᱢᱟᱹᱞ</string> @@ -646,7 +718,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">ᱦᱮᱡ ᱨᱩᱣᱟᱹᱲᱚᱜ ᱢᱮ</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">ᱱᱤᱛᱚᱜᱼᱟᱜ ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">ᱵᱩᱠᱢᱟᱨᱠᱠᱚ</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">ᱱᱤᱛᱚᱜᱟᱜ ᱦᱤᱨᱤᱭᱟᱜ</string> @@ -741,8 +815,6 @@ <string name="preferences_sync_history">ᱱᱟᱜᱟᱢ</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱚᱞᱚᱱ ᱠᱚ</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ</string> <!-- Preference for syncing tabs --> @@ -768,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s on %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">ᱜᱚᱱᱚᱝ ᱦᱚᱨᱟᱠᱚ</string> <!-- Preference for syncing addresses --> @@ -786,6 +856,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s ᱠᱷᱚᱱ ᱴᱮᱵᱽ</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s ᱴᱮᱵᱽᱠᱚ ᱵᱚᱸᱫ ᱠᱟᱱᱟ : %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">ᱱᱤᱛᱚᱜᱽᱼᱟᱜ ᱵᱚᱸᱫᱚᱼᱟᱜ ᱴᱮᱵᱽ ᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">ᱪᱷᱟᱰᱟ ᱠᱚ</string> @@ -1719,12 +1797,8 @@ <string name="add_to_homescreen_description_2">ᱟᱢ ᱞᱚᱜᱚᱱ ᱵᱽᱨᱟᱣᱩᱡᱽ ᱟᱨ ᱮᱯ ᱞᱮᱠᱷᱟᱱ ᱢᱟᱨᱠᱷᱤ ᱤᱫᱤ ᱞᱟᱹᱜᱤᱫ ᱣᱮᱵᱥᱟᱭᱤᱴ ᱫᱚ ᱥᱟᱫᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱚᱲᱟᱜ ᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱫᱟᱲᱮᱟᱜᱼᱟᱢ ᱾</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱚᱞᱚᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱥᱟᱺᱪᱟᱣ ᱢᱮ</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱥᱟᱺᱪᱟᱣ ᱢᱮ</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">ᱥᱟᱺᱪᱟᱣ ᱞᱟᱹᱜᱤᱫᱛᱮ ᱠᱩᱠᱞᱤ</string> @@ -1740,46 +1814,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱨᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱯᱩᱨᱟᱹᱣ ᱢᱮ ᱾</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱚᱞᱚ ᱥᱮᱞᱮᱫ ᱢᱮ</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱥᱮᱞᱮᱫ ᱢᱮ</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱠᱚ ᱥᱭᱝᱠ ᱢᱮ</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽᱠᱚ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱢᱮ</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱡᱷᱚᱛᱚ ᱥᱟᱫᱷᱚᱱ ᱵᱷᱤᱛᱨᱤ ᱨᱮ ᱵᱚᱞᱚ ᱠᱚ ᱥᱭᱝᱠ ᱢᱮ</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">ᱡᱷᱚᱛᱚ ᱥᱟᱫᱷᱚᱱ ᱵᱷᱤᱛᱨᱤ ᱨᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱢᱮ</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱺᱪᱟᱣᱟᱠᱟᱱ ᱞᱚᱜᱤᱱ ᱠᱚ</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">ᱥᱟᱧᱪᱟᱣ ᱠᱟᱱ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱠᱚ</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱚᱠᱟ %s ᱨᱮ ᱥᱟᱺᱪᱟᱣ ᱟᱨ ᱥᱭᱝᱠ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱱᱚᱰᱮ ᱫᱮᱠᱷᱟᱣᱜᱼᱟ ᱾</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">ᱟᱢ %s ᱨᱮ ᱚᱞ ᱟᱠᱟᱱ ᱥᱮ ᱟᱹᱭᱩᱨ ᱢᱤᱫ ᱟᱠᱟᱱ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱱᱚᱸᱰᱮ ᱞᱤᱥᱴᱤ ᱟ ᱾ ᱟᱢ ᱡᱟᱦᱟᱸᱱ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱮᱢ ᱥᱟᱧᱪᱟᱣ ᱟ ᱚᱱᱟ ᱠᱚᱫᱚ ᱫᱟᱱᱟᱝᱟᱜᱼᱟ ᱾</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱭᱝᱠ ᱵᱟᱵᱚᱛ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱰᱟᱭ ᱢᱮ ᱾</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">ᱥᱭᱝᱠ ᱵᱟᱵᱚᱛ ᱰᱷᱮᱨ ᱵᱟᱰᱟᱭ ᱢᱮ</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">ᱪᱷᱟᱰᱟ ᱠᱚ</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱡᱟ ᱵᱟᱝ ᱥᱟᱺᱪᱟᱣ ᱠᱟᱱᱟ ᱚᱱᱟᱠᱩ ᱱᱚᱰᱮ ᱩᱫᱩᱜᱚᱣᱟ ᱾</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s ᱫᱚ ᱱᱚᱰᱮ ᱞᱤᱥᱴᱤ ᱠᱟᱱ ᱥᱟᱭᱤᱴᱠᱚᱨᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱭ ᱥᱟᱧᱪᱟᱣ ᱟ ᱾</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱᱥ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱫᱚ ᱱᱚᱶᱟ ᱥᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱥᱟᱺᱪᱟᱣᱜᱼᱟ ᱾</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s ᱫᱚ ᱱᱚᱰᱮ ᱢᱮᱱᱟᱜ ᱞᱤᱥᱴᱤ ᱠᱟᱱ ᱥᱟᱭᱤᱴᱠᱚᱨᱮ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱵᱟᱭ ᱥᱟᱧᱪᱟᱣ ᱟ ᱾</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">ᱡᱷᱚᱛᱚ ᱪᱷᱟᱰᱟᱠᱚ ᱢᱮᱴᱟᱣ ᱢᱮ</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> <!-- The header for the site that a login is for --> @@ -1808,17 +1863,11 @@ <string name="saved_login_reveal_password">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱫᱮᱠᱷᱟᱣ</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱩᱠᱩ</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱺᱪᱟᱣᱠᱟᱱ ᱵᱚᱞᱚᱱ ᱥᱩᱦᱤ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱚᱱᱞᱚᱠ ᱢᱮ</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">ᱥᱟᱧᱪᱟᱣᱟᱠᱟᱱ ᱠᱟᱰ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱟᱢᱟᱜ ᱞᱚᱜᱤᱱ ᱠᱚ ᱟᱨ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱡᱟᱯᱛᱤ ᱢᱮ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">ᱟᱢᱟᱜ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱫᱷᱚᱱ ᱠᱩᱞᱩᱯ ᱪᱤᱱᱦᱟᱹ, ᱯᱤᱱ, ᱟᱨ ᱵᱟᱝ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱞᱟᱜᱟᱣᱢᱮ ᱟᱢᱟᱜ ᱥᱟᱺᱪᱟᱣ ᱞᱚᱜᱤᱱ ᱠᱚ ᱮᱢᱟᱱ ᱨᱩᱠᱷᱭᱟ ᱞᱟᱹᱜᱤᱫ ᱡᱩᱫᱤ ᱚᱞᱜᱟ ᱦᱚᱲ ᱴᱷᱮᱱ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱾</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">ᱥᱟᱫᱷᱚᱱ ᱠᱩᱞᱩᱯ ᱪᱤᱱᱦᱟᱹ, ᱯᱤᱱ, ᱟᱨ ᱵᱟᱝ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱢᱟᱜ ᱥᱟᱧᱪᱟᱣ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱠᱚ ᱮᱢᱟᱱ ᱨᱩᱠᱷᱭᱟ ᱞᱟᱹᱜᱤᱫ ᱡᱩᱫᱤ ᱚᱞᱜᱟ ᱦᱚᱲ ᱴᱷᱮᱱ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱾</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">ᱛᱟᱭᱚᱢ ᱛᱮ</string> @@ -1835,8 +1884,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">ᱢᱟᱲᱟᱝ ᱵᱮᱵᱷᱟᱨᱟᱜ</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱢᱮᱱᱭᱩ ᱥᱟᱞᱟᱭ ᱢᱮ</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱢᱮᱱᱩ ᱥᱮᱴ ᱢᱮ</string> @@ -1846,17 +1893,11 @@ <string name="preferences_autofill">ᱟᱡ ᱛᱮ ᱯᱩᱨᱟᱹᱣ</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">ᱴᱷᱤᱠᱬᱟᱤᱭᱟᱹ</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">ᱜᱚᱱᱚᱝ ᱦᱚᱨᱟᱠᱚ</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱺᱪᱟᱣ ᱟᱨ ᱠᱟᱰ ᱠᱚ ᱟᱡ ᱛᱮ ᱯᱮᱨᱮᱡᱽ ᱢᱮ</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">ᱯᱮᱢᱮᱱᱴ ᱦᱚᱨᱟ ᱥᱟᱧᱪᱟᱣ ᱢᱮ ᱟᱨ ᱯᱮᱨᱮᱪ ᱢᱮ</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱰᱟᱴᱟ ᱫᱚ ᱮᱱᱠᱨᱤᱯᱴᱮᱰ ᱠᱟᱱᱟ</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s ᱫᱚ ᱟᱢ ᱡᱟᱦᱟᱸ ᱥᱟᱧᱪᱟᱣ ᱮᱫ ᱡᱷᱚᱛᱚ ᱛᱚᱨᱠᱟᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱟ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> @@ -1864,25 +1905,16 @@ <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">ᱠᱟᱰ ᱥᱭᱝᱠ ᱢᱮ</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string> - <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">ᱠᱟᱰ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱺᱪᱟᱣ ᱠᱟᱰ ᱠᱚ ᱢᱮᱱᱮᱡᱽ ᱢᱮ</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">ᱠᱟᱰ ᱢᱮᱱᱮᱡᱽ ᱢᱮ</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">ᱴᱷᱤᱠᱬᱟᱹ ᱥᱮᱞᱮᱫ ᱢᱮ</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">ᱴᱷᱤᱠᱬᱟᱹᱤᱭᱟᱹ ᱡᱚᱛᱚᱱ ᱮᱢ</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱴᱷᱤᱬᱟᱹᱤᱭᱟᱹ ᱥᱟᱺᱪᱟᱣ ᱟᱨ ᱟᱡ ᱛᱮ ᱯᱮᱨᱮᱡ ᱢᱮ</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">ᱴᱷᱤᱬᱟᱹᱤᱭᱟᱹ ᱥᱟᱧᱪᱟᱣ ᱟᱨ ᱟᱡ ᱛᱮ ᱯᱮᱨᱮᱡ ᱢᱮ</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱮᱞ, ᱤᱢᱮᱞ ᱟᱨ ᱵᱷᱮᱡᱟ ᱴᱷᱤᱠᱬᱟᱹ ᱞᱮᱠᱷᱟ ᱵᱤᱵᱨᱚᱬ ᱢᱮᱥᱟᱭ ᱢᱮ</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">ᱯᱷᱚᱱ ᱱᱚᱢᱵᱚᱨ ᱟᱨ ᱤᱼᱢᱮᱞ ᱴᱷᱤᱠᱬᱟᱹ ᱥᱮᱞᱮᱫ ᱢᱮᱱᱟᱜᱼᱟ</string> @@ -1907,8 +1939,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">ᱠᱟᱰ ᱢᱮᱴᱟᱣ ᱢᱮ</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱛ ᱛᱮ?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">ᱠᱟᱰ ᱢᱮᱴᱟᱣᱟᱢ ᱥᱮ ?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">ᱢᱮᱴᱟᱣ ᱢᱮ</string> @@ -1920,44 +1950,34 @@ <string name="credit_cards_cancel_button">ᱵᱟᱹᱰᱨᱟᱹ</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">ᱥᱟᱺᱪᱟᱣ ᱠᱟᱱ ᱠᱟᱰ</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱴᱷᱤᱠ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱮᱞ ᱟᱫᱮᱨ ᱢᱮ</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">ᱢᱤᱫᱴᱟᱝ ᱴᱷᱤᱠ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱮᱞ ᱟᱫᱮᱨ ᱢᱮ</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱱᱚᱶᱟ ᱡᱟᱭᱜᱟ ᱯᱮᱨᱮᱡᱽ ᱢᱮ</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">ᱧᱩᱛᱩᱢ ᱥᱮᱞᱮᱫ ᱢᱮ</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">ᱥᱟᱺᱪᱟᱣᱟᱠᱟᱱ ᱠᱟᱰ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱟᱢᱟᱜ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">ᱟᱢᱟᱜ ᱥᱟᱧᱪᱟᱣ ᱠᱟᱱ ᱜᱚᱱᱚᱝ ᱛᱚᱨᱠᱟᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱫᱷᱚᱱ ᱠᱩᱞᱩᱯ ᱪᱤᱱᱦᱟᱹ, ᱯᱤᱱ, ᱟᱨ ᱵᱟᱝ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱢᱟᱜ ᱥᱟᱺᱪᱟᱣ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱠᱚ ᱮᱢᱟᱱ ᱨᱩᱠᱷᱭᱟ ᱞᱟᱹᱜᱤᱫ ᱡᱩᱫᱤ ᱚᱞᱜᱟ ᱦᱚᱲ ᱴᱷᱮᱱ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱾</string> + <string name="credit_cards_warning_dialog_message_3">ᱥᱟᱫᱷᱚᱱ ᱠᱩᱞᱩᱯ ᱪᱤᱱᱦᱟᱹ, ᱯᱤᱱ, ᱟᱨ ᱵᱟᱝ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱟᱢᱟᱜ ᱥᱟᱧᱪᱟᱣ ᱜᱚᱱᱚᱝ ᱛᱚᱨᱠᱟᱠᱚ ᱮᱢᱟᱱ ᱨᱩᱠᱷᱭᱟ ᱞᱟᱹᱜᱤᱫ ᱡᱩᱫᱤ ᱚᱞᱜᱟ ᱦᱚᱲ ᱴᱷᱮᱱ ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱾</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">ᱱᱤᱛᱚᱜ ᱥᱟᱡᱟᱣ ᱢᱮ</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_later">ᱛᱟᱭᱚᱢ ᱛᱮ</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">ᱟᱢᱟᱜ ᱥᱟᱫᱷᱚᱱ ᱚᱱᱞᱚᱠ ᱢᱮ</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱫᱚᱦᱚ ᱠᱟᱱ ᱠᱨᱮᱰᱤᱴ ᱠᱟᱰ ᱵᱤᱵᱨᱚᱬ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string> + <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> + <string name="credit_cards_biometric_prompt_unlock_message_2">ᱥᱟᱧᱪᱟᱣ ᱠᱟᱱ ᱜᱚᱱᱚᱝ ᱛᱚᱨᱠᱟ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱤᱩᱞᱟᱹᱭ ᱢᱮ</string> <!-- Title of the "Add address" screen --> <string name="addresses_add_address">ᱴᱷᱤᱠᱬᱟᱹ ᱥᱮᱞᱮᱫ ᱢᱮ</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">ᱴᱷᱤᱠᱬᱟᱹ ᱥᱟᱯᱲᱟᱣ ᱢᱮ</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">ᱴᱷᱤᱠᱬᱟᱹᱤᱭᱟᱹ ᱡᱚᱛᱚᱱ ᱮᱢ</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">ᱯᱩᱭᱞᱩ ᱧᱩᱛᱩᱢ</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">ᱛᱟᱞᱟ ᱧᱩᱛᱩᱢ</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">ᱢᱩᱪᱟᱹᱫ ᱧᱩᱛᱩᱢ</string> + <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> + <string name="addresses_name">ᱧᱩᱛᱩᱢ</string> <!-- The header for the street address of an address --> <string name="addresses_street_address">ᱥᱚᱰᱚᱠ ᱴᱷᱤᱠᱬᱟᱹ</string> <!-- The header for the city of an address --> @@ -1982,7 +2002,7 @@ <string name="addressess_delete_address_button">ᱴᱷᱤᱠᱬᱟᱹ ᱢᱮᱴᱟᱣ ᱢᱮ</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱴᱷᱤᱠᱬᱟᱹ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱛ ᱛᱮ?</string> + <string name="addressess_confirm_dialog_message_2">ᱱᱚᱶᱟ ᱴᱷᱤᱠᱬᱟᱹ ᱢᱮᱴᱟᱣᱟ ᱥᱮ ?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">ᱢᱮᱴᱟᱣ ᱢᱮ</string> <!-- The text for the negative button on "Delete address" dialog --> @@ -2080,32 +2100,34 @@ <string name="login_menu_delete_button">ᱢᱮᱴᱟᱣ ᱢᱮ</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">ᱥᱟᱯᱲᱟᱣ</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱞᱚᱜᱤᱱ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱫ ᱛᱮ?</string> + <!-- Message in delete confirmation dialog for password --> + <string name="login_deletion_confirmation_2">ᱪᱮᱫ ᱟᱢ ᱜᱚᱴᱟ ᱛᱮ ᱢᱮᱱᱟᱢᱼᱟ ᱱᱚᱶᱟ ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱢᱮᱴᱟᱣ ᱞᱟ.ᱜᱤᱛ ᱛᱮ?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">ᱢᱮᱴᱟᱣ ᱢᱮ</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">ᱵᱟᱹᱰᱨᱟᱹ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱮᱴᱟᱜᱟᱜ ᱠᱚ ᱞᱚᱜᱤᱱ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱣᱤᱵ ᱴᱷᱤᱠᱬᱟᱹ ᱞᱚᱜᱤᱱ ᱵᱚᱞᱚ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱞᱚᱜᱤᱱ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> + <!-- The saved password options menu description. --> + <string name="login_options_menu_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱨᱮᱭᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱠᱚ</string> + <!-- The editable text field for a website address. --> + <string name="saved_login_hostname_description_3">ᱣᱤᱵᱽ ᱴᱷᱤᱠᱬᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> + <!-- The editable text field for a username. --> + <string name="saved_login_username_description_3">ᱵᱤᱵᱷᱟᱨᱤᱭᱟᱹᱧᱩᱛᱩᱢ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱞᱚᱜᱤᱱ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱞᱚᱜᱤᱱ ᱵᱚᱫᱚᱞ ᱠᱚ ᱥᱟᱺᱪᱟᱣ ᱢᱮ ᱾</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱥᱟᱯᱲᱟᱣ</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱱᱟᱶᱟ ᱵᱚᱞᱚ ᱥᱮᱞᱮᱫ ᱢᱮ</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱨᱮᱭᱟᱜ ᱫᱚᱨᱠᱟᱨ ᱢᱮᱱᱟᱜ-ᱟ</string> + <string name="saved_login_password_description_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱚᱞ ᱡᱟᱭᱜᱟ ᱾</string> + <!-- The button description to save changes to an edited password. --> + <string name="save_changes_to_login_2">ᱵᱚᱫᱚᱞ ᱠᱚ ᱥᱟᱺᱪᱟᱣ ᱢᱮ ᱾</string> + <!-- The page title for editing a saved password. --> + <string name="edit_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱥᱟᱯᱲᱟᱣ ᱢᱮ</string> + <!-- The page title for adding new password. --> + <string name="add_login_2">ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱥᱮᱞᱮᱫ ᱢᱮ</string> + <!-- Error text displayed underneath the password field when it is in an error case. --> + <string name="saved_login_password_required_2">ᱢᱤᱫᱴᱟᱹᱝ ᱥᱟᱵᱟᱫ ᱟᱫᱮᱨ ᱢᱮ</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱫᱚᱨᱠᱟᱨ</string> + <string name="saved_login_username_required_2">ᱢᱤᱫᱴᱟᱹᱝ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ ᱟᱫᱮᱨ ᱢᱮ</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">ᱦᱚᱥᱴᱧᱩᱛᱩᱢ ᱫᱚᱨᱠᱟᱨ ᱠᱟᱱᱟ</string> + <!-- The error message in add login view when hostname field is blank. --> + <string name="saved_login_hostname_required_2" tools:ignore="UnusedResources">ᱢᱤᱫᱴᱟᱹᱝ ᱣᱮᱵᱽ ᱴᱷᱤᱠᱬᱟᱹ ᱟᱫᱮᱨ ᱢᱮ</string> <!-- Voice search button content description --> <string name="voice_search_content_description">ᱨᱚᱲ ᱥᱮᱸᱫᱽᱨᱟ</string> @@ -2200,6 +2222,9 @@ <!-- Title for search suggestions when the default search suggestion engine is anything other than Google. The first parameter is default search engine name. --> <string name="other_default_search_engine_suggestion_header">%s ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ</string> + <!-- Default browser experiment --> + <!-- Default browser card title --> + <string name="default_browser_experiment_card_title">ᱟᱢᱟᱜ ᱢᱩᱞ ᱵᱽᱨᱟᱣᱡᱚᱨ ᱛᱮ ᱩᱪᱟᱹᱲᱚᱜ ᱢᱮ</string> <!-- Default browser card text --> <string name="default_browser_experiment_card_text">Firefox ᱟᱡ ᱛᱮ ᱠᱷᱩᱞᱟᱹ ᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱣᱮᱵᱥᱟᱭᱤᱴ, ᱤᱢᱮᱞ, ᱟᱨ ᱢᱮᱥᱮᱡᱽ ᱨᱮᱭᱟᱜ ᱞᱤᱝᱠ ᱥᱮᱴ ᱢᱮ ᱾ </string> @@ -2237,6 +2262,85 @@ <!-- Snackbar button text to navigate to telemetry settings.--> <string name="experiments_snackbar_button">ᱥᱟᱡᱟᱣ ᱴᱷᱮᱱ ᱪᱟᱞᱟᱜ ᱢᱮ</string> + <!-- Review quality check feature--> + <!-- Name for the review quality check feature used as title for the panel. --> + <string name="review_quality_check_feature_name_2">ᱫᱩᱦᱲᱟᱹ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣᱤᱭᱟᱹ</string> + <!-- Summary for grades A and B for review quality check adjusted grading. --> + <string name="review_quality_check_grade_a_b_description">ᱴᱷᱤᱠ ᱵᱟᱛᱟᱣᱟᱜᱠᱚ</string> + <!-- Summary for grade C for review quality check adjusted grading. --> + <string name="review_quality_check_grade_c_description">ᱴᱷᱤᱠ ᱵᱟᱛᱟᱣᱟᱜ ᱟᱨ ᱵᱤᱱᱥᱨᱚᱛ ᱢᱮᱥᱟᱢᱤᱥᱤ ᱧᱮᱞᱵᱤᱲᱟᱹᱣᱟᱜᱠᱚ</string> + <!-- Summary for grades D and F for review quality check adjusted grading. --> + <string name="review_quality_check_grade_d_f_description">ᱵᱤᱱᱥᱨᱚᱛ ᱧᱮᱞᱵᱤᱲᱟᱹᱣ</string> + <!-- Text for title presenting the reliability of a product's reviews. --> + <string name="review_quality_check_grade_title">ᱱᱚᱶᱟ ᱧᱮᱞᱵᱤᱲᱟᱹᱣᱠᱚ ᱛᱤᱱᱟᱹᱜ ᱵᱷᱚᱨᱥᱟ ᱫᱮᱲᱮᱭᱟᱜᱼᱟᱢ ?</string> + <!-- Title for when the rating has been updated by the review checker --> + <string name="review_quality_check_adjusted_rating_title">ᱨᱮᱴᱤᱝ ᱥᱚᱢᱚᱡᱚᱥ ᱮᱱᱟ</string> + <!-- Description for a product's adjusted star rating. The text presents that the product's reviews which were evaluated as unreliable were removed from the adjusted rating. --> + <string name="review_quality_check_adjusted_rating_description_2">ᱵᱷᱚᱨᱥᱟᱡᱚᱱᱚᱠ ᱧᱮᱞᱵᱤᱲᱟᱹᱣ ᱪᱮᱛᱟᱱ ᱨᱮ</string> + <!-- Title for list of highlights from a product's review emphasizing a product's important traits. --> + <string name="review_quality_check_highlights_title">ᱱᱤᱛᱚᱜᱟᱜ ᱧᱮᱞᱵᱤᱲᱟᱹᱣ ᱠᱷᱚᱱ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱪᱤᱱᱦᱟᱹᱦᱟᱜ</string> + <!-- Title for section explaining how we analyze the reliability of a product's reviews. --> + <string name="review_quality_check_explanation_title">ᱟᱞᱮ ᱫᱚ ᱧᱮᱞᱵᱤᱲᱟᱹᱣᱟᱜ ᱜᱩᱱ ᱫᱚ ᱪᱮᱫ ᱞᱮᱠᱷᱟ ᱞᱮ ᱵᱟᱲᱟᱭ ᱮᱫᱟ</string> + <!-- Paragraph explaining how we analyze the reliability of a product's reviews. First parameter is the Fakespot product name. In the phrase "Fakespot by Mozilla", "by" can be localized. Does not need to stay by. --> + <string name="review_quality_check_explanation_body_reliability">Mozilla ᱯᱟᱦᱴᱟ ᱠᱷᱚᱱ %s ᱠᱷᱚᱱ AI ᱴᱮᱠᱱᱚᱞᱚᱡᱤ ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮᱜ ᱟᱞᱮ ᱯᱨᱚᱰᱚᱠᱴ ᱨᱤᱵᱷᱤᱭᱩ ᱨᱮᱱᱟᱜ ᱥᱟᱹᱨᱤᱜᱟᱱᱤ ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣᱜ ᱮᱫᱟ ᱞᱮ ᱾ ᱱᱚᱶᱟ ᱫᱚ ᱧᱮᱞ ᱵᱤᱰᱟᱣᱜ ᱜᱩᱱ ᱵᱟᱲᱟᱭ ᱪᱷᱚ ᱨ ᱜᱚᱲᱚ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱢᱟ, ᱯᱨᱚᱰᱚᱠᱴ ᱨᱮᱭᱟᱜ ᱢᱩᱞ ᱜᱩᱱ ᱵᱟᱵᱚᱛ ᱫᱚ ᱵᱟᱝᱟ ᱾</string> + <!-- Paragraph explaining the grading system we use to classify the reliability of a product's reviews. --> + <string name="review_quality_check_info_review_grade_header"><![CDATA[ᱟᱞᱮ ᱫᱚ ᱯᱨᱚᱰᱚᱠᱴ ᱨᱮᱭᱟᱜ ᱧᱮᱞ ᱵᱤᱰᱟᱣᱜ ᱫᱚ <b>ᱪᱤᱠᱤ ᱜᱽᱨᱮᱰ</b> A ᱠᱷᱚᱱ F ᱫᱷᱟᱹᱵᱤᱡ ᱞᱮ ᱮᱢ ᱮᱫᱟ ᱾]]></string> + <!-- Text for learn more caption presenting a link with information about review quality. First parameter is for clickable text defined in review_quality_check_info_learn_more_link. --> + <string name="review_quality_check_info_learn_more">%s ᱵᱟᱵᱚᱛ ᱰᱷᱮᱨ ᱵᱟᱰᱟᱭ ᱢᱮ ᱾</string> + <!-- Clickable text that links to review quality check SuMo page. First parameter is the Fakespot product name. --> + <string name="review_quality_check_info_learn_more_link_2">%s ᱫᱚ ᱧᱮᱞᱵᱤᱲᱟᱹᱣᱟᱜ ᱜᱩᱱ ᱫᱚ ᱪᱮᱫ ᱞᱮᱠᱷᱟ ᱵᱟᱲᱟᱭ ᱮᱫᱟ</string> + <!-- Text for title of settings section. --> + <string name="review_quality_check_settings_title">ᱥᱟᱡᱟᱣᱠᱚ</string> + <!-- Text for label for switch preference to show recommended products from review quality check settings section. --> + <string name="review_quality_check_settings_recommended_products">ᱫᱩᱦᱲᱟᱹ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣᱤᱭᱟᱹ ᱨᱮ ᱫᱷᱟᱶᱨᱟ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> + <!-- Clickable text that links to review quality check recommended products support article. --> + <string name="review_quality_check_settings_recommended_products_learn_more" tools:ignore="UnusedResources">ᱰᱷᱮᱨ ᱥᱮᱬᱟᱭ ᱢᱮ</string> + <!-- Text for turning sidebar off button from review quality check settings section. --> + <string name="review_quality_check_settings_turn_off">ᱫᱩᱦᱲᱟᱹ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣᱤᱭᱟᱹ ᱵᱚᱸᱫᱚᱭ ᱢᱮ</string> + <!-- Text for title of recommended product section. This is displayed above a product image, suggested as an alternative to the product reviewed. --> + <string name="review_quality_check_ad_title" tools:ignore="UnusedResources">ᱰᱷᱮᱨ ᱮᱢ ᱧᱮᱞᱟ</string> + <!-- Caption for recommended product section indicating this is an ad by Fakespot. First parameter is the Fakespot product name. --> + <string name="review_quality_check_ad_caption" tools:ignore="UnusedResources">ᱰᱷᱟᱶᱨᱟᱤᱭᱟᱹ ᱫᱚ %s</string> + <!-- Caption for review quality check panel. First parameter is for clickable text defined in review_quality_check_powered_by_link. --> + <string name="review_quality_check_powered_by_2">ᱫᱩᱦᱲᱟᱹ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣᱤᱭᱟᱹ ᱫᱚ %s ᱜᱚᱲᱚ ᱥᱟᱦᱚᱫ ᱮᱢ ᱠᱟᱜᱼᱟᱭ</string> + <!-- Clickable text that links to Fakespot.com. First parameter is the Fakespot product name. In the phrase "Fakespot by Mozilla", "by" can be localized. Does not need to stay by. --> + <string name="review_quality_check_powered_by_link" tools:ignore="UnusedResources">%s Mozilla ᱛᱮ</string> + <!-- Text for title of warning card informing the user that the current analysis is outdated. --> + <string name="review_quality_check_outdated_analysis_warning_title" tools:ignore="UnusedResources">ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱤᱵᱨᱚᱬ</string> + <!-- Text for button from warning card informing the user that the current analysis is outdated. Clicking this should trigger the product's re-analysis. --> + <string name="review_quality_check_outdated_analysis_warning_action" tools:ignore="UnusedResources">ᱱᱤᱛᱚᱜ ᱧᱮᱞ ᱢᱮ</string> + <!-- Title for warning card informing the user that the current product does not have enough reviews for a review analysis. --> + <string name="review_quality_check_no_reviews_warning_title">ᱩᱱᱟᱹᱜ ᱧᱮᱞᱵᱤᱲᱟᱹᱣ ᱵᱟᱹᱱᱩᱜ ᱠᱟᱫᱟ</string> + <!-- Text for body of warning card informing the user that the current product does not have enough reviews for a review analysis. --> + <string name="review_quality_check_no_reviews_warning_body">ᱛᱤᱧ ᱡᱷᱚᱜ ᱡᱤᱱᱤᱥ ᱨᱮ ᱡᱟᱹᱥᱛᱤ ᱧᱮᱞᱵᱤᱲᱟᱹᱣ ᱛᱟᱦᱮᱸᱱᱟ, ᱟᱞᱮ ᱫᱚ ᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱜᱩᱱ ᱵᱚᱵᱚᱛ ᱞᱮ ᱢᱮᱱ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string> + <!-- Title for warning card informing the user that the current product is currently not available. --> + <string name="review_quality_check_product_availability_warning_title">ᱡᱤᱱᱤᱥ ᱫᱚ ᱵᱟᱹᱱᱩᱜ ᱠᱟᱫᱟ</string> + <!-- Text for the body of warning card informing the user that the current product is currently not available. --> + <string name="review_quality_check_product_availability_warning_body">ᱡᱩᱫᱤ ᱥᱴᱚᱠ ᱛᱮ ᱡᱤᱱᱤᱥ ᱦᱮᱡ ᱞᱮᱠᱷᱟᱢ ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫ ᱠᱷᱟᱱ, ᱟᱞᱮ ᱴᱷᱮᱱ ᱠᱷᱚᱵᱚᱨ ᱮᱢ ᱠᱟᱜ ᱢᱮ ᱟᱞᱮ ᱫᱚ ᱧᱮᱞᱵᱤᱲᱟᱹᱣᱠᱚᱞᱮ ᱧᱮᱞ ᱟ ᱾</string> + <!-- Clickable text for warning card informing the user that the current product is currently not available. Clicking this should inform the server that the product is available. --> + <string name="review_quality_check_product_availability_warning_action_2">ᱠᱷᱚᱵᱚᱨ ᱢᱮ ᱡᱮ ᱡᱤᱱᱤᱥ ᱫᱚ ᱥᱴᱚᱠ ᱨᱮ ᱦᱮᱡ ᱦᱩᱭ ᱮᱱᱟ</string> + <!-- Title for warning card informing the user that the current product's analysis is still processing. The parameter is the percentage progress (0-100%) of the analysis process (e.g. 56%). --> + <string name="review_quality_check_analysis_in_progress_warning_title_2">ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱜᱩᱱ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱮᱫᱟ (%s)</string> + <!-- Text for body of warning card informing the user that the current product's analysis is still processing. --> + <string name="review_quality_check_analysis_in_progress_warning_body">ᱱᱚᱶᱟ ᱫᱚ 60 ᱴᱤᱡ ᱜᱟᱱ ᱚᱠᱛᱚ ᱤᱫᱤᱭᱟᱭ ᱾</string> + <!-- Title for info card displayed after the user reports a product is back in stock. --> + <string name="review_quality_check_analysis_requested_info_title">ᱠᱷᱚᱵᱚᱨ ᱮᱢ ᱞᱟᱹᱜᱤᱫ ᱟᱹᱰᱤ ᱥᱟᱯᱲᱟᱣ!</string> + <!-- Text for body of info card displayed after the user reports a product is back in stock. --> + <string name="review_quality_check_analysis_requested_info_body">ᱟᱞᱮ ᱴᱷᱮᱱ ᱫᱚ ᱱᱚᱶᱟ ᱡᱤᱱᱤᱥ ᱵᱚᱵᱛ ᱧᱮᱞ ᱵᱤᱰᱟᱣᱜ 24 ᱴᱟᱲᱟᱝ ᱜᱟᱱ ᱞᱟᱣᱟ ᱞᱮᱭᱟ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱢᱮ ᱾</string> + <!-- Title for info card displayed when the user review checker while on a product that Fakespot does not analyze (e.g. gift cards, music). --> + <string name="review_quality_check_not_analyzable_info_title">ᱟᱞᱮ ᱫᱚ ᱱᱚᱶᱟ ᱵᱟᱞᱮ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ </string> + <!-- Title for info card displayed when another user reported the displayed product is back in stock. --> + <string name="review_quality_check_analysis_requested_other_user_info_title" tools:ignore="UnusedResources">ᱵᱤᱵᱨᱚᱬ ᱞᱚᱜᱚᱱ ᱜᱮ ᱦᱟᱹᱡᱩᱜ ᱠᱟᱱᱟ</string> + <!-- Text for body of info card displayed when another user reported the displayed product is back in stock. --> + <string name="review_quality_check_analysis_requested_other_user_info_body" tools:ignore="UnusedResources">ᱟᱞᱮ ᱴᱷᱮᱱ ᱫᱚ ᱱᱚᱶᱟ ᱡᱤᱱᱤᱥ ᱵᱚᱵᱛ ᱧᱮᱞ ᱵᱤᱰᱟᱣᱜ 24 ᱴᱟᱲᱟᱝ ᱜᱟᱱ ᱞᱟᱣᱟ ᱞᱮᱭᱟ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱧᱮᱞ ᱵᱤᱲᱟᱹᱣ ᱢᱮ ᱾</string> + <!-- Title for info card displayed to the user when analysis finished updating. --> + <string name="review_quality_check_analysis_updated_confirmation_title" tools:ignore="UnusedResources">ᱯᱚᱨᱚᱠ ᱨᱮᱭᱟᱜ ᱦᱟᱹᱞᱤᱭᱟᱹᱠ ᱴᱷᱤᱠ ᱜᱭᱟ</string> + <!-- Text for the action button from info card displayed to the user when analysis finished updating. --> + <string name="review_quality_check_analysis_updated_confirmation_action" tools:ignore="UnusedResources">ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫᱟ</string> + <!-- Title for error card displayed to the user when an error occurred. --> + <string name="review_quality_check_generic_error_title">ᱱᱤᱛᱚᱜ ᱪᱮᱫ ᱦᱚᱸ ᱵᱤᱵᱨᱚᱬ ᱵᱟᱹᱱᱩᱜ ᱠᱟᱫᱼᱟ</string> + <!-- Text for body of error card displayed to the user when an error occurred. --> + <string name="review_quality_check_generic_error_body">ᱱᱚᱶᱟ ᱮᱴᱠᱮᱴᱚᱬᱮ ᱥᱩᱫᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱠᱟᱹᱢᱤ ᱪᱟᱹᱞᱩ ᱠᱟᱱᱟ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱛᱟᱭᱚᱢ ᱛᱮ ᱫᱩᱦᱲᱟᱹ ᱧᱮᱞ ᱦᱟᱹᱡᱩᱜ ᱢᱮ ᱾</string> <!-- Text for minimize button from highlights card. When clicked the highlights card should reduce its size. --> <string name="review_quality_check_highlights_show_less">ᱠᱚᱢ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string> <!-- Text for maximize button from highlights card. When clicked the highlights card should expand to its full size. --> @@ -2265,6 +2369,20 @@ <!-- Translations feature--> + <!-- Button text on the translations dialog to begin a translation of the website. --> + <string name="translations_bottom_sheet_positive_button">ᱛᱚᱨᱡᱚᱢᱟ</string> + <!-- Button text on the translations dialog when a translation error appears. --> + <string name="translations_bottom_sheet_positive_button_error">ᱫᱩᱦᱲᱟᱹ ᱠᱩᱨᱩᱢᱩᱴᱩᱭ ᱢᱮ</string> + <!-- Inactive button text on the translations dialog that indicates a translation is currently in progress. This button will be accompanied by a loading icon. --> + <string name="translations_bottom_sheet_translating_in_progress">ᱛᱚᱨᱡᱚᱢᱟᱜ ᱠᱟᱱᱟ</string> + <!-- Button content description (not visible, for screen readers etc.) for the translations dialog translate button that indicates a translation is currently in progress. --> + <string name="translations_bottom_sheet_translating_in_progress_content_description">ᱛᱚᱨᱡᱚᱢᱟ ᱞᱟᱦᱟ ᱨᱮ ᱢᱮᱱᱟᱜ ᱠᱟᱫᱟ</string> + <!-- Default dropdown option when initially selecting a language from the translations dialog language selection dropdown. --> + <string name="translations_bottom_sheet_default_dropdown_selection">ᱢᱤᱫᱴᱟᱝ ᱯᱟᱹᱨᱥᱤ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string> + <!-- The title of the warning card informs the user that a translation could not be completed. --> + <string name="translation_error_could_not_translate_warning_text">ᱛᱚᱨᱡᱚᱢᱟ ᱡᱷᱚᱜ ᱵᱷᱩᱞ ᱮᱴᱠᱮᱴᱚᱬᱮ ᱦᱩᱭᱮᱱᱟ ᱾ ᱫᱟᱭᱟᱠᱟᱛᱮ ᱫᱩᱦᱲᱟᱹ ᱪᱮᱥᱴᱟᱭ ᱢᱮ ᱾</string> + + <!-- The total tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_total">ᱢᱳᱴ</string> <!-- The title of the tab creation tool section in Tab Tools. --> @@ -2277,4 +2395,7 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">ᱵᱟᱝ ᱠᱟᱹᱢᱤ ᱴᱮᱵᱽᱠᱚᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">ᱱᱤᱡᱮᱨᱟᱜ ᱴᱮᱵᱽ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string> -</resources> + + <!-- Micro survey --> + + </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-sc/strings.xml b/mobile/android/fenix/app/src/main/res/values-sc/strings.xml index 799f6bb624..b126355172 100644 --- a/mobile/android/fenix/app/src/main/res/values-sc/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sc/strings.xml @@ -36,6 +36,8 @@ <string name="tab_tray_add_new_collection_name">Nòmine</string> <!-- Label of button in save to collection dialog for selecting a current collection --> <string name="tab_tray_select_collection">Seletziona una colletzione</string> + <!-- Content description for close button while in multiselect mode in tab tray --> + <string name="tab_tray_close_multiselect_content_description">Essi de sa modalidade de seletzione mùltiple</string> <!-- Content description for save to collection button while in multiselect mode in tab tray --> <string name="tab_tray_collection_button_multiselect_content_description">Sarva is ischedas seletzionadas a sa colletzione</string> <!-- Content description on checkmark while tab is selected in multiselect mode in tab tray --> @@ -43,11 +45,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Sarvadas de reghente</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Sarvadas de reghente</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Ammustra totu is sinnalibros sarvados</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Ammustra totu is sinnalibros sarvados</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Boga</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Boga</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Sinnalibros</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Ammustra totu is sinnalibros</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Boga</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s est prodotu dae Mozilla.</string> @@ -101,6 +111,8 @@ <!-- Text for the negative action button to dismiss the dialog. --> <string name="camera_permissions_needed_negative_button_text">Iscarta</string> + <!-- Text for the banner message to tell users about our auto close feature. --> + <string name="tab_tray_close_tabs_banner_message">Cunfigura sa serrada in automàticu de is ischedas abertas chi non siant istadas visualizadas in s\'ùrtima die, chida o mese.</string> <!-- Text for the positive action button to go to Settings for auto close tabs. --> <string name="tab_tray_close_tabs_banner_positive_button_text">Ammustra is optziones</string> <!-- Text for the negative action button to dismiss the Close Tabs Banner. --> @@ -127,8 +139,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Ischeda privada noa</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Curtzadòrgiu pro is craes</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Craes</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Curtzadòrgiu pro is craes</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -168,11 +182,17 @@ <!-- Content description (not visible, for screen readers etc.): Stop loading current website --> <string name="browser_menu_stop">Firma</string> <!-- Browser menu button that opens the addon manager --> - <string name="browser_menu_add_ons">Cumplementos</string> + <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Cumplementos</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_extensions">Estensiones</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Gesti is estensiones</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Iscoberi àteras estensiones</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informatziones de su contu</string> <!-- Text displayed when there are no add-ons to be shown --> - <string name="no_add_ons">Nissunu cumplementu inoghe</string> + <string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Nissunu cumplementu inoghe</string> <!-- Browser menu button that sends a user to help articles --> <string name="browser_menu_help">Agiudu</string> <!-- Browser menu button that sends a to a the what's new article --> @@ -187,18 +207,26 @@ <string name="browser_menu_open_in_regular_tab">Aberi in un’ischeda normale</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Agiunghe a s’ischermu printzipale</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Agiunghe a s’ischermu printzipale…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> - <string name="browser_menu_install_on_homescreen">Installa</string> + <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installa</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Torra a sincronizare</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Chirca in sa pàgina</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Chirca in sa pàgina…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Tradue sa pàgina</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Sarva in una colletzione…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Sarva in una colletzione</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Cumpartzi</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Cumpartzi…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Aberi in %1$s</string> @@ -224,6 +252,50 @@ <string name="browser_menu_customize_home_1">Personaliza sa pàgina printzipale</string> + <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> + <string name="browser_menu_sign_in">Identìfica·ti</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Sincroniza craes, ischedas e àteru</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Torra·ti a identificare pro sincronizare</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Sincronizatzione in pàusa</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Ischeda privada noa</string> + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Craes</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Nou in %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Càmbia a situ de iscrivania</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Istrumentos</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Sarva</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Agiunghe custa pàgina a is sinnalibros</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Modìfica su sinnalibru</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Sarva comente PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Ativa sa visualizatzione de letura</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Disativa sa visualizatzione de letura</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Tradue sa pàgina…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Traduidu in %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Imprenta…</string> + + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">Nissuna estensione inoghe</string> + <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> <string name="browser_toolbar_home">Ischermu printzipale</string> @@ -234,6 +306,11 @@ <!-- Content description for the translate page toolbar button that opens the translations dialog when no translation has occurred. --> <string name="browser_toolbar_translate">Tradue sa pàgina</string> + <!-- Content description (not visible, for screen readers etc.) for the translate page toolbar button that opens the translations dialog when the page is translated successfully. + The first parameter is the name of the language that is displayed in the original page. (For example: English) + The second parameter is the name of the language which the page was translated to. (For example: French) --> + <string name="browser_toolbar_translated_successfully">Pàgina traduida in %2$s dae: %1$s</string> + <!-- Locale Settings Fragment --> <!-- Content description for tick mark on selected language --> <string name="a11y_selected_locale_content_description">Lìngua seletzionada</string> @@ -297,7 +374,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Avisu de riservadesa de Firefox</string> - <!-- Text for the button to set firefox as default browser on the device --> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Nos praghet a t’amparare</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> @@ -467,6 +543,10 @@ <string name="preferences_account_sync_error">Torra a connètere pro sighire cun sa sincronizatzione</string> <!-- Preference for language --> <string name="preferences_language">Lìngua</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tradutzione</string> + <!-- Preference for translations --> + <string name="preferences_translations">Tradutziones</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Sèberu de is datos</string> <!-- Preference for data collection --> @@ -493,6 +573,9 @@ <string name="preferences_enable_autocomplete_urls">Cumpletamentu de URL in automàticu</string> <!-- Preference title for switch preference to show sponsored Firefox Suggest search suggestions --> <string name="preferences_show_sponsored_suggestions">Cussìgios dae is ispònsors</string> + <!-- Summary for preference to show sponsored Firefox Suggest search suggestions. + The first parameter is the name of the application. --> + <string name="preferences_show_sponsored_suggestions_summary">Sustene %1$s cun propostas isponsorizadas in manera ocasionale</string> <!-- Preference title for switch preference to show Firefox Suggest search suggestions for web content. The first parameter is the name of the application. --> <string name="preferences_show_nonsponsored_suggestions">Cussìgios dae %1$s</string> @@ -515,9 +598,13 @@ <string name="quit_application">Serrende s’aplicatzione pro aplicare is modìficas…</string> <!-- Preference for add_ons --> - <string name="preferences_addons">Cumplementos</string> + <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Cumplementos</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Estensiones</string> <!-- Preference for installing a local add-on --> - <string name="preferences_install_local_addon">Installa unu cumplementu dae un’archìviu</string> + <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Installa unu cumplementu dae un’archìviu</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Installa un\'estensione dae un’archìviu</string> <!-- Preference for notifications --> <string name="preferences_notifications">Notìficas</string> @@ -526,9 +613,17 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Non permìtidu</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Rechestu</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Optzionale</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Permite pro totu is sitos</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> - <string name="preferences_customize_amo_collection">Colletzione de cumplementos personalizada</string> + <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Colletzione de cumplementos personalizada</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">AB</string> <!-- Button caption to abort the add-on collection configuration --> @@ -541,10 +636,14 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Torra a s’ischeda</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Sinnalibros reghentes</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Sinnalibros reghentes</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Sinnalibros</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Bisitadas de reghente</string> + <!-- Title for the customize home screen section with Pocket. --> + <string name="customize_toggle_pocket_2">Istòrias chi faghent pensare</string> <!-- Summary for the customize home screen section with Pocket. The first parameter is product name Pocket --> <string name="customize_toggle_pocket_summary">Artìculos seletzionados dae %s</string> <!-- Title for the customize home screen section with sponsored Pocket stories. --> @@ -571,6 +670,8 @@ <string name="wallpaper_learn_more">Àteras informatziones</string> <!-- Text for classic wallpapers title. The first parameter is the Firefox name. --> <string name="wallpaper_classic_title">%s clàssicu</string> + <!-- Text for artist series wallpapers title. "Artist series" represents a collection of artist collaborated wallpapers. --> + <string name="wallpaper_artist_series_title">Sèrie de artista</string> <!-- Description text for the artist series wallpapers with learn more link. The first parameter is the learn more string defined in wallpaper_learn_more. "Independent voices" is the name of the wallpaper collection --> <string name="wallpaper_artist_series_description_with_learn_more">Sa colletzione Boghes indipendentes. %s</string> <!-- Description text for the artist series wallpapers. "Independent voices" is the name of the wallpaper collection --> @@ -586,19 +687,31 @@ <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> - <string name="addon_ga_message_title" tools:ignore="UnusedResources">Cumplementos noos a disponimentu</string> + <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Cumplementos noos a disponimentu</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Estensiones noas a disponimentu</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">Controlla is prus de chentu estensiones noas chi ti permitint de personalizare Firefox.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> - <string name="addon_ga_message_button" tools:ignore="UnusedResources">Esplora cumplementos</string> + <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Esplora cumplementos</string> + + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Esplora is estensiones</string> - <!-- Add-on process crash dialog to user --> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> - <string name="addon_process_crash_dialog_title" tools:ignore="UnusedResources">Is cumplementos sunt istados disativados in manera temporànea</string> + <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Is cumplementos sunt istados disativados in manera temporànea</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">Is estensiones sunt disativadas in manera temporànea</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> - <string name="addon_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Proa torrende a aviare is cumplementos</string> + <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Proa torrende a aviare is cumplementos</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Proa torrende a aviare is estensiones</string> <!-- The user will continue with all add-ons disabled --> - <string name="addon_process_crash_dialog_disable_addons_button_text" tools:ignore="UnusedResources">Sighi cun is cumplementos disativados</string> + <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Sighi cun is cumplementos disativados</string> + + <!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. --> + <string name="extension_process_crash_dialog_disable_extensions_button_text">Sighi cun is estensiones disativadas</string> <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> @@ -613,10 +726,8 @@ <string name="preferences_sync_history">Cronologia</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Sinnalibros</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins">Credentziales</string> <!-- Preference for syncing passwords --> - <string name="preferences_sync_logins_2" tools:ignore="UnusedResources">Craes</string> + <string name="preferences_sync_logins_2">Craes</string> <!-- Preference for syncing tabs --> <string name="preferences_sync_tabs_2">Ischedas abertas</string> <!-- Preference for signing out --> @@ -641,10 +752,8 @@ The first parameter is the application name, the second is the device manufacturer name and the third is the device model. --> <string name="default_device_name_2">%1$s in %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards">Cartas de crèditu</string> <!-- Preference for syncing payment methods --> - <string name="preferences_sync_credit_cards_2" tools:ignore="UnusedResources">Mètodos de pagamentu</string> + <string name="preferences_sync_credit_cards_2">Mètodos de pagamentu</string> <!-- Preference for syncing addresses --> <string name="preferences_sync_address">Indiritzos</string> @@ -658,11 +767,21 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Ischeda dae %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Ischedas de %1$s serradas: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Ammustra ischedas serradas de reghente</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Etzetziones</string> <!-- Button in Exceptions Preference to turn on tracking protection for all sites (remove all exceptions) --> <string name="preferences_tracking_protection_exceptions_turn_on_for_all">Ativa pro totu is sitos</string> + <!-- Text displayed when there are no exceptions --> + <string name="exceptions_empty_message_description">Is estensiones ti permitint de disativare s\'amparu contra a sa sighidura in tzertos sitos.</string> <!-- Text displayed when there are no exceptions, with learn more link that brings users to a tracking protection SUMO page --> <string name="exceptions_empty_message_learn_more_link">Àteras informatziones</string> @@ -1444,13 +1563,9 @@ <string name="add_to_homescreen_text_placeholder">Nòmine de su curtzadòrgiu</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords">Credentziales e craes</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords_2" tools:ignore="UnusedResources">Craes</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins">Sarva credentziales e craes</string> + <string name="preferences_passwords_logins_and_passwords_2">Craes</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins_2" tools:ignore="UnusedResources">Sarva is craes</string> + <string name="preferences_passwords_save_logins_2">Sarva is craes</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Pregunta·mi·ddu</string> <!-- Preference option for never saving passwords in Fenix --> @@ -1463,42 +1578,24 @@ <string name="preferences_android_autofill">Cumpletamentu automàticu in àteras aplicatziones</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Cumpleta nòmines de utente e craes in àteras aplicatziones de su dispositivu tuo.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login">Agiunghe credentziale</string> <!-- Preference option for adding a password --> - <string name="preferences_logins_add_login_2" tools:ignore="UnusedResources">Agiunghe crae</string> + <string name="preferences_logins_add_login_2">Agiunghe crae</string> - <!-- Preference for syncing saved logins in Fenix --> - <string name="preferences_passwords_sync_logins">Sincronizatzione de credentziales</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins_2" tools:ignore="UnusedResources">Sincroniza is craes</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices">Sincronizatzione de credentziales intre dispositivos</string> + <string name="preferences_passwords_sync_logins_2">Sincroniza is craes</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices_2" tools:ignore="UnusedResources">Sincroniza is craes intre dispositivos</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins">Credentziales sarvadas</string> + <string name="preferences_passwords_sync_logins_across_devices_2">Sincroniza is craes intre dispositivos</string> <!-- Preference to access list of saved passwords --> - <string name="preferences_passwords_saved_logins_2" tools:ignore="UnusedResources">Craes sarvadas</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text">Is credentziales chi as a sarvare o sincronizare cun %s ant a èssere ammustradas inoghe.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link">Leghe àteru subra de Sync.</string> + <string name="preferences_passwords_saved_logins_2">Craes sarvadas</string> <!-- Clickable text for opening an external link for more information about Sync. --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2" tools:ignore="UnusedResources">Àteras informatziones in pitzus de sa sincronizatzione</string> + <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Àteras informatziones in pitzus de sa sincronizatzione</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Etzetziones</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty">Is credentziales e is craes non sarvadas ant a èssere ammustradas inoghe.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description">No ant a èssere sarvadas is credentziales e is craes de custos sitos.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Cantzella totu is etzetziones</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search">Chirca credentziales</string> <!-- Hint for search box in passwords list --> - <string name="preferences_passwords_saved_logins_search_2" tools:ignore="UnusedResources">Chirca craes</string> + <string name="preferences_passwords_saved_logins_search_2">Chirca craes</string> <!-- The header for the site that a login is for --> <string name="preferences_passwords_saved_logins_site">Situ</string> <!-- The header for the username for a login --> @@ -1523,12 +1620,6 @@ <string name="saved_login_reveal_password">Ammustra sa crae</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Cua sa crae</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message">Isbloca pro bìdere is credentziales sarvadas tuas</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title">Ampara is credentziales e is craes tuas</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message">Cunfigura una secuèntzia de blocu, PIN o crae pro amparare is credentziales e is craes tuas de s’atzessu de àtera gente chi tèngiat su dispositivu tuo.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">A pustis</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1545,44 +1636,30 @@ <string name="preferences_autofill">Cumpletamentu automàticu</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Indiritzos</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards">Cartas de crèditu</string> <!-- Preference and title for managing the settings for payment methods --> - <string name="preferences_credit_cards_2" tools:ignore="UnusedResources">Mètodos de pagamentu</string> - <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards">Sarva e cumpleta in automàticu is cartas</string> + <string name="preferences_credit_cards_2">Mètodos de pagamentu</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards_2" tools:ignore="UnusedResources">Sarva e cumpleta cun is mètodos de pagamentu</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary">Is datos sunt tzifrados</string> + <string name="preferences_credit_cards_save_and_autofill_cards_2">Sarva e cumpleta cun is mètodos de pagamentu</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary_2" tools:ignore="UnusedResources">%s tzifrat totu is mètodos de pagamentu chi sarves</string> + <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s tzifrat totu is mètodos de pagamentu chi sarves</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sincronizatzione de cartas intre dispositivos</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sincronizatzione de cartas</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card">Agiunghe una carta de crèditu</string> <!-- Preference option for adding a card --> - <string name="preferences_credit_cards_add_credit_card_2" tools:ignore="UnusedResources">Agiunghe una carta</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards">Gesti is cartas</string> + <string name="preferences_credit_cards_add_credit_card_2">Agiunghe una carta</string> <!-- Preference option for managing saved cards --> - <string name="preferences_credit_cards_manage_saved_cards_2" tools:ignore="UnusedResources">Gesti is cartas</string> + <string name="preferences_credit_cards_manage_saved_cards_2">Gesti is cartas</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Agiunghe un’indiritzu</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Gesti is indiritzos</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses">Sarva e cumpleta in automàticu is indiritzos</string> <!-- Preference for saving and filling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses_2" tools:ignore="UnusedResources">Sarva e cumpleta cun is indiritzos</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary">Include datos comente nùmeros, indiritzos eletrònicos e indiritzos de ispeditzione</string> + <string name="preferences_addresses_save_and_autofill_addresses_2">Sarva e cumpleta cun is indiritzos</string> <!-- Preference summary for saving and filling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary_2" tools:ignore="UnusedResources">Includet nùmeros de telèfonu e indiritzos eletrònicos</string> + <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Includet nùmeros de telèfonu e indiritzos eletrònicos</string> <!-- Title of the "Add card" screen --> <string name="credit_cards_add_card">Agiunghe una carta</string> @@ -1603,9 +1680,7 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Cantzella sa carta</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation">Seguru chi boles cantzellare custa carta de crèditu?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation_2" tools:ignore="UnusedResources">Boles cantzellare sa carta?</string> + <string name="credit_cards_delete_dialog_confirmation_2">Boles cantzellare sa carta?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Cantzella</string> <!-- The title for the "Save" menu item for saving a credit card --> @@ -1616,46 +1691,30 @@ <string name="credit_cards_cancel_button">Annulla</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Cartas sarvadas</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message">Inserta unu nùmeru de carta vàlidu</string> <!-- Error message for card number validation --> - <string name="credit_cards_number_validation_error_message_2" tools:ignore="UnusedResources">Inserta unu nùmeru de carta vàlidu</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message">Cumpila custu campu</string> + <string name="credit_cards_number_validation_error_message_2">Inserta unu nùmeru de carta vàlidu</string> <!-- Error message for card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message_2" tools:ignore="UnusedResources">Agiunghe unu nòmine</string> + <string name="credit_cards_name_on_card_validation_error_message_2">Agiunghe unu nòmine</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Isbloca pro bìdere is cartas sarvadas tuas</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title">Ampara is cartas de crèditu tuas</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title_2" tools:ignore="UnusedResources">Ampara is mètodos de pagamentu sarvados</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message">Cunfigura una secuèntzia de blocu, PIN o crae pro amparare is cartas de crèditu sarvadas tuas de s’atzessu de àtera gente chi tèngiat su dispositivu tuo.</string> + <string name="credit_cards_warning_dialog_title_2">Ampara is mètodos de pagamentu sarvados</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message_3" tools:ignore="UnusedResources">Cunfigura una secuèntzia de blocu, PIN o crae pro amparare is mètodos de pagamentu sarvados de s’atzessu de àtera gente chi tèngiat su dispositivu tuo.</string> + <string name="credit_cards_warning_dialog_message_3">Cunfigura una secuèntzia de blocu, PIN o crae pro amparare is mètodos de pagamentu sarvados de s’atzessu de àtera gente chi tèngiat su dispositivu tuo.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Cunfigura immoe</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_later">A pustis</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Isbloca su disposivitu tuo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message">Isbloca pro impreare informatzione sarvada de una carta de crèditu</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> - <string name="credit_cards_biometric_prompt_unlock_message_2" tools:ignore="UnusedResources">Isbloca pro impreare is mètodos de pagamentu sarvados</string> + <string name="credit_cards_biometric_prompt_unlock_message_2">Isbloca pro impreare is mètodos de pagamentu sarvados</string> <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Agiunghe un’indiritzu</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Modìfica s’indiritzu</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Gesti is indiritzos</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name">Nòmine</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name">Segundu nòmine</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name">Sangunadu</string> <!-- The header for the street address of an address --> <string name="addresses_street_address">Indiritzu postale</string> <!-- The header for the city of an address --> @@ -1679,9 +1738,7 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">Cantzella s’indiritzu</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message">Seguru chi boles cantzellare custu indiritzu?</string> - <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message_2" tools:ignore="UnusedResources">Boles cantzellare custu indiritzu?</string> + <string name="addressess_confirm_dialog_message_2">Boles cantzellare custu indiritzu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Cantzella</string> <!-- The text for the negative button on "Delete address" dialog --> @@ -1776,38 +1833,24 @@ <string name="login_menu_delete_button">Cantzella</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Modìfica</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation">Seguru chi boles cantzellare custa credentziale?</string> <!-- Message in delete confirmation dialog for password --> - <string name="login_deletion_confirmation_2" tools:ignore="UnusedResources">Seguru chi boles cantzellare custa crae?</string> + <string name="login_deletion_confirmation_2">Seguru chi boles cantzellare custa crae?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Cantzella</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Annulla</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu">Optziones de credentziales</string> <!-- The saved password options menu description. --> - <string name="login_options_menu_2" tools:ignore="UnusedResources">Optziones de is craes</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login">Sarva is modìficas a sa credentziale.</string> + <string name="login_options_menu_2">Optziones de is craes</string> <!-- The button description to save changes to an edited password. --> - <string name="save_changes_to_login_2" tools:ignore="UnusedResources">Sarva is modìficas.</string> - <!-- The page title for editing a saved login. --> - <string name="edit">Modìfica</string> + <string name="save_changes_to_login_2">Sarva is modìficas.</string> <!-- The page title for editing a saved password. --> - <string name="edit_2" tools:ignore="UnusedResources">Modìfica sa crae</string> - <!-- The page title for adding new login. --> - <string name="add_login">Agiunghe una credentziale noa</string> + <string name="edit_2">Modìfica sa crae</string> <!-- The page title for adding new password. --> - <string name="add_login_2" tools:ignore="UnusedResources">Agiunghe una crae</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required">Crae rechesta</string> + <string name="add_login_2">Agiunghe una crae</string> <!-- Error text displayed underneath the password field when it is in an error case. --> - <string name="saved_login_password_required_2" tools:ignore="UnusedResources">Inserta una crae</string> - <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required">Nòmine de utente rechestu</string> + <string name="saved_login_password_required_2">Inserta una crae</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required_2" tools:ignore="UnusedResources">Inserta unu nòmine de utente</string> + <string name="saved_login_username_required_2">Inserta unu nòmine de utente</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required_2" tools:ignore="UnusedResources">Inserta un’indiritzu web</string> <!-- Voice search button content description --> @@ -1885,7 +1928,7 @@ <!-- Title for search suggestions when the default search suggestion engine is anything other than Google. The first parameter is default search engine name. --> <string name="other_default_search_engine_suggestion_header">Chirca cun %s</string> - <!-- Default browser experiment --> + <!-- Default browser card text --> <string name="default_browser_experiment_card_text">Aberi in Firefox in manera automàtica is ligòngios de sitos web, de posta eletrònica e de messàgios.</string> <!-- Content description for close button in collection placeholder. --> @@ -1895,7 +1938,7 @@ <string name="radio_preference_info_content_description">Incarca inoghe pro àteros detàllios</string> <!-- Content description for the action bar "up" button --> - <string name="action_bar_up_description">Nàviga in artu</string> + <string name="action_bar_up_description" moz:removedIn="124" tools:ignore="UnusedResources">Nàviga in artu</string> <!-- Content description for privacy content close button --> <string name="privacy_content_close_button_content_description">Serra</string> @@ -2080,12 +2123,12 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">Custa lìngua no est ancora atzetada: %1$s.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Àteras informatziones</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Àteras informatziones</string> <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Optziones de tradutzione</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Optziones de tradutzione</string> <!-- Button text for the button that will take the user to the translation settings dialog. --> <string name="translation_option_bottom_sheet_translation_settings">Cunfiguratzione de sa tradutzione</string> @@ -2169,4 +2212,6 @@ <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to cancel the action and not perform a download of the language file. --> <string name="download_language_file_dialog_negative_button_text">Annulla</string> + <!-- Micro survey --> + </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-si/strings.xml b/mobile/android/fenix/app/src/main/res/values-si/strings.xml index a90119065d..1f5dd3908d 100644 --- a/mobile/android/fenix/app/src/main/res/values-si/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-si/strings.xml @@ -46,11 +46,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">මෑතදී සුරැකි</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">මෑතදී සුරැකි</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">සුරැකි සියළු පොත්යොමු පෙන්වන්න</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">සුරැකි සියළු පොත්යොමු පෙන්වන්න</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">ඉවත් කරන්න</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">ඉවත් කරන්න</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">පොත්යොමු</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">සියලුම පොත්යොමු පෙන්වන්න</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">ඉවත් කරන්න</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">මොසිල්ලා හරහා %1$s නිෂ්පාදනය කෙරේ.</string> @@ -245,14 +253,28 @@ <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> <string name="browser_menu_sign_in">පිවිසෙන්න</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">මුරපද, පටිති සහ තවත් දෑ සමමුහූර්ත කරන්න</string> + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">සමමුහූර්තයට පිවිසෙන්න</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">සමමුහූර්ත විරාමයකි</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">නව පෞද්. පටිත්ත</string> <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">මුරපද</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">වැඩතල අඩවිය</string> <!-- Browser menu label that navigates to the page tools sub-menu --> <string name="browser_menu_tools">මෙවලම්</string> <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">සුරකින්න</string> + <!-- Extensions management fragment --> + <!-- Text displayed when there are no extensions to be shown --> + <string name="extensions_management_no_extensions">මෙතැන දිගු නැත</string> + <!-- Browser Toolbar --> <!-- Content description for the Home screen button on the browser toolbar --> <string name="browser_toolbar_home">මුල් තිරය</string> @@ -264,6 +286,11 @@ <!-- Content description for the translate page toolbar button that opens the translations dialog when no translation has occurred. --> <string name="browser_toolbar_translate">පිටුව පරිවර්තනය</string> + <!-- Content description (not visible, for screen readers etc.) for the translate page toolbar button that opens the translations dialog when the page is translated successfully. + The first parameter is the name of the language that is displayed in the original page. (For example: English) + The second parameter is the name of the language which the page was translated to. (For example: French) --> + <string name="browser_toolbar_translated_successfully">%1$s වෙතින් %2$s වෙත පිටුව පරිවර්තනය වී ඇත.</string> + <!-- Locale Settings Fragment --> <!-- Content description for tick mark on selected language --> <string name="a11y_selected_locale_content_description">තෝරාගත් භාෂාව</string> @@ -342,6 +369,8 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">ෆයර්ෆොක්ස් රහස්යතා දැන්වීම</string> + <!-- Description for learning more about our privacy notice. --> + <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">රහස්යතා දැන්වීම ගැන තව දැනගන්න</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">ඔබට ආරක්ෂාව සලසන්නෙමු</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> @@ -533,6 +562,8 @@ <string name="preferences_account_sync_error">සමමුහූර්තය යළි ඇරඹීමට නැවත සබඳින්න</string> <!-- Preference for language --> <string name="preferences_language">භාෂාව</string> + <!-- Preference for translation --> + <string name="preferences_translation">පරිවර්තනය</string> <!-- Preference for data choices --> <string name="preferences_data_choices">දත්ත තේරීම්</string> <!-- Preference for data collection --> @@ -584,8 +615,12 @@ <!-- Preference for add_ons --> <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">එක්කහු</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">දිගු</string> <!-- Preference for installing a local add-on --> <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">ගොනුවකින් එක්කහුවක් ස්ථාපනය…</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">ගොනුවකින් දිගුවක් ස්ථාපනය</string> <!-- Preference for notifications --> <string name="preferences_notifications">දැනුම්දීම්</string> @@ -594,9 +629,22 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">ඉඩ නොදේ</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">වුවමනාය</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">විකල්පයකි</string> + <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> + <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">අඩවියේ දත්ත කියවා වෙනස් කිරීම</string> + + <!-- The description of the icon that can delete one of the websites displayed --> + <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">අඩවිය මකන්න</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">අභිරුචි එක්කහු එකතුව</string> + <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> + <string name="preferences_customize_extension_collection">අභිරුචි දිගු එකතුව</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">හරි</string> <!-- Button caption to abort the add-on collection configuration --> @@ -613,7 +661,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">ආපසු පනින්න</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">මෑත පොත්යොමු</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">මෑත පොත්යොමු</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">පොත්යොමු</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">මෑතදී ගොඩවැදුණු</string> @@ -664,6 +714,8 @@ <!-- Add-ons general availability nimbus message--> <!-- Title of the Nimbus message for add-ons general availability--> <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">දැන් නව එක්කහු තිබේ</string> + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">දැන් නව දිගු තිබේ</string> <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> <string name="addon_ga_message_body" tools:ignore="UnusedResources">ෆයර්ෆොක්ස් අභිරුචිකරණයට උපකාරී වන නව දිගු 100 කට වඩා බලන්න.</string> <!-- Button text of the Nimbus message for add-ons general availability. --> diff --git a/mobile/android/fenix/app/src/main/res/values-sk/strings.xml b/mobile/android/fenix/app/src/main/res/values-sk/strings.xml index b5795659e3..75648fb199 100644 --- a/mobile/android/fenix/app/src/main/res/values-sk/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sk/strings.xml @@ -201,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Doplnky</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Rozšírenia</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Spravovať rozšírenia</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Objavte ďalšie rozšírenia</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Informácie o účte</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -219,6 +223,8 @@ <string name="browser_menu_open_in_regular_tab">Otvoriť na bežnej karte</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Pridať na úvodnú obrazovku</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Pridať na úvodnú obrazovku…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Nainštalovať</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -230,9 +236,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Preložiť stránku</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Uložiť do kolekcie…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Uložiť do kolekcie</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Zdieľať</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Zdieľať…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Otvoriť v aplikácii %1$s</string> @@ -289,6 +299,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Uložiť</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Pridať stránku medzi záložky</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Upraviť záložku</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Uložiť ako PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Zapnúť zobrazenie Čítačka</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Ukončiť zobrazenie Čítačka</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Preložiť stránku…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Preložená do jazyka %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Tlačiť…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Nie sú tu žiadne rozšírenia</string> @@ -388,8 +416,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Vyhlásenie o ochrane osobných údajov Firefoxu</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Ďalšie informácie nájdete v našom Vyhlásení o ochrane osobných údajov</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Radi vás držíme v bezpečí</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -600,7 +626,9 @@ <!-- Preference for language --> <string name="preferences_language">Jazyk</string> <!-- Preference for translation --> - <string name="preferences_translation">Preklady</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Preklady</string> + <!-- Preference for translations --> + <string name="preferences_translations">Preklady</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Odosielanie údajov</string> <!-- Preference for data collection --> @@ -674,10 +702,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Vyžadované</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Voliteľné</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Čítanie a zmena údajov webových stránok</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Odstrániť webovú stránku</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Povoliť pre všetky stránky</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -804,8 +828,6 @@ <string name="preferences_sync_history">História</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Záložky</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Prihlasovacie údaje</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Heslá</string> <!-- Preference for syncing tabs --> @@ -832,8 +854,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s na %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Platobné karty</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Spôsoby platby</string> <!-- Preference for syncing addresses --> @@ -850,6 +870,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Karta z %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Zatvorené karty %1$su: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Zobraziť nedávno zatvorené karty</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Výnimky</string> @@ -1779,12 +1807,8 @@ <string name="add_to_homescreen_description_2">Túto webovú stránku si môžete jednoducho pridať na svoju domovskú obrazovku a mať tak okamžitý prístup k prehliadaniu.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Prihlasovacie údaje</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Heslá</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukladanie prihlasovacích údajov</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Ukladanie hesiel</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Pred uložením sa opýtať</string> @@ -1799,46 +1823,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Vypĺňa používateľské mená a heslá v iných aplikáciách vo vašom zariadení.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Pridať prihlasovacie údaje</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Pridať heslo</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronizácia prihlasovacích údajov</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synchronizácia hesiel</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synchronizovať prihlasovacie údaje medzi zariadeniami</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synchronizovať heslá naprieč zariadeniami</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložené prihlasovacie údaje</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Uložené heslá</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložené alebo synchronizované údaje v aplikácii %s sa zobrazia tu.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Heslá, ktoré uložíte alebo synchronizujete do %su budú zobrazené tu. Všetky heslá sú šifrované.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Ďalšie informácie o službe Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Ďalšie informácie o synchronizácii</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Výnimky</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Tu sa zobrazia prihlasovacie údaje, ktoré sa nebudú ukladať.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s nebude ukladať heslá pre tu uvedené stránky.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Pre nasledujúce stránky sa nebudú ukladať prihlasovacie údaje.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s nebude ukladať heslá pre tieto stránky.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Odstrániť všetky výnimky</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Hľadať</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Hľadať v heslách</string> <!-- The header for the site that a login is for --> @@ -1867,17 +1872,11 @@ <string name="saved_login_reveal_password">Zobraziť heslo</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Skryť heslo</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Pre zobrazenie prihlasovacích údajov odomknite zariadenie</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Ak chcete zobraziť uložené heslá, odomknite zariadenie</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zabezpečte svoje prihlasovacie údaje</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Zabezpečte svoje heslá</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavte si vzor, kód alebo heslo, ktorým ochránite svoje uložené prihlasovacie údaje v prípade, že vaše zariadenie bude používať niekto iný.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Nastavte si vzor, kód alebo heslo, ktorým ochránite svoje uložené heslá v prípade, že vaše zariadenie bude používať niekto iný.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Neskôr</string> @@ -1894,8 +1893,6 @@ <string name="saved_logins_sort_strategy_alphabetically">názvu (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">posledného použitia</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Zoradiť ponuku prihlasovacích údajov</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Ponuka pre zoradenie hesiel</string> @@ -1905,41 +1902,27 @@ <string name="preferences_autofill">Automatické dopĺňanie</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresy</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Platobné karty</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Spôsoby platby</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukladať a automaticky dopĺňať údaje o platobných kartách</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Ukladať a dopĺňať spôsoby platby</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Údaje sú šifrované</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s zašifruje všetky spôsoby platby, ktoré uložíte</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synchronizovať platobné karty naprieč zariadeniami</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synchronizovať platobné karty</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Pridať platobnú kartu</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Pridať kartu</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Spravovať uložené karty</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Spravovať karty</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Pridať adresu</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Spravovať adresy</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Ukladať a automaticky dopĺňať adresy</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Ukladať a dopĺňať adresy</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Zahŕňa informácie ako sú čísla, e‑mailové adresy a dodacie adresy</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Zahŕňa telefónne čísla a e‑mailové adresy</string> @@ -1963,8 +1946,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Odstrániť kartu</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Naozaj chcete odstrániť túto kreditnú kartu?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Odstrániť kartu?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Odstrániť</string> @@ -1977,24 +1958,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Uložené karty</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Prosím, zadajte platné číslo platobnej karty</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Zadajte platné číslo karty</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vyplňte toto pole</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Zadajte meno</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Odomknutím zobrazíte svoje uložené kreditné karty</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zabezpečte svoje kreditné karty</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Zabezpečte svoje uložené spôsoby platby</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavte si vzor, kód alebo heslo, ktorým ochránite svoje uložené kreditné karty v prípade, že vaše zariadenie bude používať niekto iný.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Nastavte si vzor, kód alebo heslo, ktorým ochránite svoje uložené spôsoby platby v prípade, že vaše zariadenie bude používať niekto iný.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Nastaviť teraz</string> @@ -2002,8 +1974,6 @@ <string name="credit_cards_warning_dialog_later">Neskôr</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Odomknite svoje zariadenie</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Odomknutím použijete uložené informácie o kreditnej karte</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Ak chcete použiť uložené spôsoby platby, odomknite zariadenie</string> @@ -2013,12 +1983,6 @@ <string name="addresses_edit_address">Úprava adresy</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Spravovať adresy</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Krstné meno</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Stredné meno</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Priezvisko</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Meno</string> <!-- The header for the street address of an address --> @@ -2045,8 +2009,6 @@ <string name="addressess_delete_address_button">Odstrániť adresu</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Naozaj chcete odstrániť túto adresu?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Chcete odstrániť túto adresu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Odstrániť</string> @@ -2144,49 +2106,29 @@ <string name="login_menu_delete_button">Odstrániť</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Upraviť</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Naozaj chcete odstrániť tieto prihlasovacie údaje?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Naozaj chcete odstrániť toto heslo?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Odstrániť</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Zrušiť</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Možnosti prihlásenia</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Možnosti hesiel</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Upraviteľné textové pole pre webovú adresu.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Upraviteľné textové pole pre webovú adresu.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Upraviteľné textové pole pre používateľské meno.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Upraviteľné textové pole pre používateľské meno.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Upraviteľné textové pole pre heslo.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Upraviteľné textové pole pre heslo.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Uložiť zmeny prihlasovacích údajov.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Uložiť zmeny</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Upraviť</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Upraviť heslo</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Pridať nové prihlasovacie údaje</string> <!-- The page title for adding new password. --> <string name="add_login_2">Pridať heslo</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Vyžaduje sa heslo</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Zadajte heslo</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Vyžaduje sa používateľské meno</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Zadajte používateľské meno</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Vyžaduje sa názov hostiteľa</string> @@ -2594,6 +2536,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Zavrieť hárok Preklady</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Niektoré nastavenia sú dočasne nedostupné.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Preklady</string> @@ -2617,6 +2562,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Vyberte jazyk, pre ktorý chcete spravovať predvoľby „Vždy prekladať“ a „Nikdy neprekladať“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Nepodarilo sa načítať jazyky. Skúste to neskôr.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ponúkať preklad (predvolené)</string> @@ -2640,6 +2588,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Odstrániť %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Stránky sa nepodarilo načítať. Skúste to neskôr.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Odstrániť %1$s?</string> @@ -2717,13 +2667,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Prejsť dozadu</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Otvoriť zásuvku na ladenie</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Nástroje pre karty</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Počet kariet</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktívne</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktívne</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktívne</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Neaktívne</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2734,6 +2689,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Nástroj na vytváranie kariet</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Počet kariet, ktorý chcete vytvoriť</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Textové pole je prázdne</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Zadajte iba kladné celé čísla</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Zadajte číslo väčšie ako nula</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Prekročili ste maximálny počet kariet (%1$s), ktoré je možné vygenerovať v rámci jednej operácie</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Pridať medzi aktívne karty</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2750,11 +2715,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Vyhlásenie o ochrane osobných údajov</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Odoslať</string> + <string name="micro_survey_submit_button_label">Odoslať</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Zavrieť</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Zavrieť</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Ďakujeme za vašu spätnú väzbu.</string> + <string name="micro_survey_feedback_confirmation">Ďakujeme za vašu spätnú väzbu.</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">veľmi spokojný</string> <!-- Option for likert scale --> @@ -2766,6 +2731,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">veľmi nespokojný</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Otvoriť prieskum</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Zavrieť prieskum</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Zavrieť</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Prihlasovacie údaje</string> diff --git a/mobile/android/fenix/app/src/main/res/values-skr/strings.xml b/mobile/android/fenix/app/src/main/res/values-skr/strings.xml index bec0a1a1c1..7461c7baa6 100644 --- a/mobile/android/fenix/app/src/main/res/values-skr/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-skr/strings.xml @@ -55,6 +55,9 @@ <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">ہٹاؤ</string> + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">نشانیاں</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> <string name="home_bookmarks_menu_item_remove">ہٹاؤ</string> @@ -371,8 +374,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">فائرفوکس رازداری نوٹس</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">ساݙے رازداری نوٹس وچ ٻیا سکھو</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">اَساکوں تُہاکوں محفوظ رکّھݨ بھان٘دا ہِے</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -581,7 +582,7 @@ <string name="preferences_language">زبان</string> <!-- Preference for translation --> - <string name="preferences_translation">ترجمہ</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">ترجمہ</string> <!-- Preference for data choices --> <string name="preferences_data_choices">ڈیٹا چوائس</string> <!-- Preference for data collection --> @@ -654,10 +655,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">ضروری ہے</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">آپشنل</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">ویب سائٹ ڈیٹا پڑھو تے تبدیلی کرو</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">ویب سائٹ مٹاؤ</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">ساریاں سائٹاں کیتے اجازت ݙیوو</string> @@ -789,8 +786,6 @@ <string name="preferences_sync_bookmarks">نشانیاں</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان آں</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">پاس ورڈز</string> <!-- Preference for syncing tabs --> @@ -815,8 +810,6 @@ The first parameter is the application name, the second is the device manufacturer name and the third is the device model. --> <string name="default_device_name_2">%3$s %2$s تے %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">کریڈٹ کارڈز</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">ادائیگی طریقے</string> <!-- Preference for syncing addresses --> @@ -1773,12 +1766,8 @@ <string name="add_to_homescreen_description_2">تساں ایں ویب سائٹ کوں آسانی نال آپݨی ڈیوائس دی ہوم سکرین وچ شامل کر سڳدے ہو تاں جو فوری رسائی حاصل تھیوے تے ایپ جیہے تجربے نال تیزی نال براؤز کرو۔</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان تے پاس ورڈ</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">پاس ورڈز</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان تے پاس ورڈ محفوظ کرو</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">پاس ورڈ محفوظ کرو</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">محفوظ کرݨ کیتے پُچھو</string> @@ -1792,46 +1781,28 @@ <string name="preferences_android_autofill">ٻیاں ایپاں وچ آٹوفل کرو</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">آپݨی ڈیوائس تے موجود ٻیاں ایپاں وچ ورتݨ ناں تے پاس ورڈ بھرو۔</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان شامل کرو</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">پاس ورڈ شامل کرو</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ اناں کوں ہم وقت کرو</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">پاس ورڈ ہم وقت کرو</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">ڈیوائساں دے مابین لاگ ان ہم وقت کرو</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">ڈیوائساں دے وِچالے پاس ورڈز کوں ہم وقت کرو</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">محفوظ تھئے لاگ ان</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">محفوظ تھئے پاس ورڈ</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">تساں جہڑے لاگ ان محفوظ کریندے ہو یا %s نال ہم وقت کریندے ہو او اِتھاں ݙکھائے ویسن۔</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">تُساں جہڑے پاس ورڈز محفوظ کرین٘دے ہِیوے یا %s نال ہم وقت کرین٘دے ہِیوے اُوہ اِتّھاں درج ہوسِن۔ تُہاݙے محفوظ کِیتا ڳئے سبّھے پاس ورڈز کوں انکرپٹ کِیتا ڳِیا ہِے۔</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">ہم وقت کرݨ بارے ٻیا سِکھو۔</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">ہم وقت کرݨ بارے ٻیا سِکھو۔</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">استثنیات</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">جہڑے لاگ ان تے پاس ورڈ محفوظ کائنی کیتے ڳئے او اِتھ ݙکھائے ویسن۔</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s اِتّھاں درج سائٹاں دے پاس ورڈز محفوظ نہ کریسی۔</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">انہاں سائٹاں کیتے لاگ تے پاس ورڈ محفوظ کائناں تھیسن۔</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s اِنّھاں سائٹاں دے پاس ورڈز محفوظ نہ کریسی۔</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">سارے استثناء مٹاؤ</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان ڳولو</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">پاس ورڈز ڳولو</string> <!-- The header for the site that a login is for --> @@ -1862,17 +1833,11 @@ <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">پاس ورڈ لکاؤ</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">آپݨے محفوظ کیتے لاگ اناں کوں ݙیکھݨ کیتے اݨ لاک کرو</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">آپݨے محفوظ تھئے پاس ورڈاں کوں ݙیکھݨ کیتے اݨ لاک کرو</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان تے پاس ورڈ دی محفوظ بݨاؤ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">آپݨے محفوظ تھئے ہوئے پاس ورڈز کوں محفوظ بݨاؤ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">جے تہاݙے کول کوئی ٻئی ڈیوائس ہے تاں آپݨے محفوظ کیتے لاگ ان تے پاس ورڈ تائیں پہنچ کنوں بچݨ سانگے ڈیوائس لاگ ان پیٹرن، پن پاس ورڈ قائم کرو۔</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">ڄیکر تُہاݙی ڈیوائس کہیں ٻئے کول ہِے تاں آپݨے محفوظ کِیتے ڳئے پاس ورڈز تئیں پہنچ کنوں بچاوݨ کِیتے ڈیوائس لاک پیٹرن، PIN، یا پاس ورڈ مُرتّب کرو۔</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">بعد وچ</string> @@ -1889,8 +1854,6 @@ <string name="saved_logins_sort_strategy_alphabetically">ناں(A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">چھیکڑی ورتاوا</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان مینیو کوں ترتیب ݙیوو</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">پاس ورڈز مینیو کوں مُرتّب کرو</string> @@ -1900,40 +1863,26 @@ <string name="preferences_autofill">خودبخود بھرݨ</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">پتے</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">کریڈٹ کارڈز</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">ادائیگی طریقے</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">کارڈ محفوظ کرو تے آپݨے آپ بھرو</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">ادائیگی دے طریقے محفوظ اَتے پُر کرو</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">ڈیٹا مخفی ہے۔</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%sتُہاݙے محفوظ کِیتے ڳئے ادائیگی دے سبّھے طریقیاں کوں انکرپٹ کرین٘دا ہِے</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">ڈیوائساں دے مابین کارڈ ہم وقت کرو</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">کارڈ ہم وقت کرو</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">کریڈٹ کارڈ شامل کرو</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">کارڈ شامل کرو</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">محفوظ تھئے کارڈ منیج کرو</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">کارڈز منیج کرو</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">پتہ شامل کرو</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">پتے منیج کرو</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">محفوظ کرو تے پتے خودبخود بھرو</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">محفوظ کرو تے پتے پُر کرو</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">معلومات شامل کرو، مثلاً تعداد، ای میل تے شپنگ پتے</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">فون لمبرز اَتے ای میل پتے شامل ہِن</string> @@ -1957,8 +1906,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">کارڈ مٹاؤ</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">بھلا تہاکوں پک ہے جو تساں ایہ کریڈٹ کارڈ مٹاوݨ چاہندے ہو؟</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">کارڈ مٹاؤں؟</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">مٹاؤ</string> @@ -1970,23 +1917,15 @@ <string name="credit_cards_cancel_button">منسوخ کرو</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">محفوظ تھئے کارڈ</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">سوہݨا، ٹھیک کریڈٹ کارڈ نمبر درج کرو</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">ہک درست کارڈ نمبر درج کرو۔</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">سوہݨا، ایہ خانہ پُر کرو</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">ناں شامل کرو</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">آپݨے محفوظ تھئے کارڈاں کوں ݙیکھݨ کیتے اݨ لاک کرو</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">آپݨے کریڈٹ کارڈاں کوں محفوظ بݨاؤ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">آپݨے محفوظ کِیتے ڳئے ادائیگی دے طریقیاں کوں محفوظ بݨاؤ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">جے تہاݙے کول کوئی ٻئی ڈیوائس ہے تاں آپݨے محفوظ کیتے کریڈٹ کارڈ تائیں پہنچ کنوں بچݨ سانگے ڈیوائس لاگ ان پیٹرن، پن پاس ورڈ قائم کرو۔</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">ڄیکر تُہاݙی ڈیوائس کہیں ٻئے کول ہِے تاں آپݨے محفوظ کِیتے ڳئے ادائیگی دے طریقیاں تئیں پہنچ کنوں بچاوݨ کِیتے ڈیوائس لاک پیٹرن، PIN، یا پاس ورڈ مُرتّب کرو۔</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">بݨ قائم کرو</string> @@ -1994,8 +1933,6 @@ <string name="credit_cards_warning_dialog_later">بعد وچ</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">آپݨی ڈیوائس اݨ لاک کرو</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ذخیرہ تھئی کریڈٹ کارڈ ڄاݨکاری کوں ورتݨ کیتے اݨ لاک کرو</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">محفوظ کِیتے ڳئے ادائیگی دے طریقے استعمال کرݨ کِیتے غیر مقفّل کرو</string> <!-- Title of the "Add address" screen --> @@ -2004,12 +1941,6 @@ <string name="addresses_edit_address">پتے وچ تبدیلی کرو</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">پتے منیج کرو</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">پہلا ناں</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">وچلا ناں</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">چھیکڑی ناں</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">ناں</string> <!-- The header for the street address of an address --> @@ -2038,8 +1969,6 @@ <string name="addressess_delete_address_button">پتہ مٹاؤ</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">بھلا تہاکوں پک ہے جو تساں ایہ پتہ مٹاوݨ چاہندے ہو؟</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">ایہ پتہ مٹاؤں؟</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">مٹاؤ</string> @@ -2141,49 +2070,29 @@ <string name="login_menu_delete_button">مٹاؤ</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">تبدیلی کرو</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">بھلا تہاکوں پک ہے جو تساں ایہ لاگ ان مٹاوݨ چاہندے ہو؟</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">بَھلا تُہاکُوں پَک ہِے جو تُساں اِیں پاس ورڈ کوں مٹاوݨ چاہن٘دے ہِیوے؟</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">مٹاؤ</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">منسوخ کرو</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان آپشناں</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">پاس ورڈ آپشناں</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان دے ویب پتے کیتے عبارت تبدیل کرݨ دے قابل خانہ۔</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">ویب سائٹ ایڈریس کِیتے قابلِ تدوین ٹیکسٹ فیلڈ۔</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان دے ورتݨ ناں کیتے عبارت تبدیل کرݨ دے قابل خانہ۔</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">صارف ناں کیتے عبارت تبدیل کرݨ دے قابل خانہ۔</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان دے پاس ورڈ کیتے عبارت تبدیل کرݨ دے قابل خانہ۔</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">پاس ورڈ کیتے عبارت تبدیل کرݨ دے قابل خانہ۔</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">لاگ ان وچ تبدیلیاں محفوظ کرو۔</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">تبدیلیاں محفوظ کرو۔</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">تبدیلی کرو</string> <!-- The page title for editing a saved password. --> <string name="edit_2">پاس ورڈ وچ تبدیلی کرو</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">نواں لاگ ان شامل کرو</string> <!-- The page title for adding new password. --> <string name="add_login_2">پاس ورڈ شامل کرو</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">پاس ورڈ ضروری ہے</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">پاس ورڈ درج کرو</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ورتݨ ناں ضروری ہے</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">ورتݨ ناں درج کرو</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">ہوسٹ ناں ضروری ہے</string> @@ -2718,7 +2627,7 @@ <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">ٹیب شمار</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">فعال</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">فعال</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">غیر فعال</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2745,11 +2654,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">رازداری نوٹس</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">جمع کرواؤ</string> + <string name="micro_survey_submit_button_label">جمع کرواؤ</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">بند کرو</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">بند کرو</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">تہاݙے فیڈبیک تے تھورائت ہیں!</string> + <string name="micro_survey_feedback_confirmation">تہاݙے فیڈبیک تے تھورائت ہیں!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">ݙاڈھا تسلی بخش</string> <!-- Option for likert scale --> diff --git a/mobile/android/fenix/app/src/main/res/values-sl/strings.xml b/mobile/android/fenix/app/src/main/res/values-sl/strings.xml index 9207394e10..96cc2722ca 100644 --- a/mobile/android/fenix/app/src/main/res/values-sl/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sl/strings.xml @@ -49,12 +49,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Nedavno shranjeno</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Nedavno shranjeno</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Prikaži vse shranjene zaznamke</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Prikaži vse shranjene zaznamke</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Odstrani</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Odstrani</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Zaznamki</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Prikaži vse zaznamke</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Odstrani</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s izdeluje Mozilla.</string> @@ -145,8 +153,10 @@ <!-- Shortcut action to open new private tab --> <string name="home_screen_shortcut_open_new_private_tab_2">Nov zasebni zavihek</string> - <!-- Shortcut action to open Passwords screens --> - <string name="home_screen_shortcut_open_password_screen">Bližnjica do gesel</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_passwords">Gesla</string> + <!-- Shortcut action to open Passwords screen --> + <string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Bližnjica do gesel</string> <!-- Recent Tabs --> <!-- Header text for jumping back into the recent tab in the home screen --> @@ -191,6 +201,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Dodatki</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Razširitve</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Upravljanje razširitev</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Odkrijte več razširitev</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Podatki o računu</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -209,18 +223,26 @@ <string name="browser_menu_open_in_regular_tab">Odpri v navadnem zavihku</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Dodaj na domač zaslon</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Dodaj na domači zaslon …</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Namesti</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Znova sinhroniziraj</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Najdi na strani</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Najdi na strani …</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Prevedi stran</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Shrani v zbirko …</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Shrani v zbirko</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Deli</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Deli …</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Odpri v %1$su</string> @@ -248,9 +270,47 @@ <string name="browser_menu_customize_home_1">Prilagodi domačo stran</string> <!-- Browser menu label to sign in to sync on the device using Mozilla accounts --> - <string name="browser_menu_sign_in" tools:ignore="UnusedResources">Prijava</string> - <!-- Browser menu caption label for the "Sign in" browser menu item described in browser_menu_sign_in --> - <string name="browser_menu_sign_in_caption" tools:ignore="UnusedResources">Sinhronizirajte gesla, zavihke in druge podatke</string> + <string name="browser_menu_sign_in">Prijava</string> + <!-- Browser menu caption label for the "Sign in" browser menu item described in `browser_menu_sign_in` --> + <string name="browser_menu_sign_in_caption">Sinhronizirajte gesla, zavihke in druge podatke</string> + + <!-- Browser menu label to sign back in to sync on the device when the user's account needs to be reauthenticated --> + <string name="browser_menu_sign_back_in_to_sync">Znova se prijavite za sinhronizacijo</string> + <!-- Browser menu caption label for the "Sign back in to sync" browser menu item described in `browser_menu_sign_back_in_to_sync` when there is an error in syncing --> + <string name="browser_menu_syncing_paused_caption">Sinhroniziranje ustavljeno</string> + <!-- Browser menu label that creates a private tab --> + <string name="browser_menu_new_private_tab">Nov zasebni zavihek</string> + + <!-- Browser menu label that navigates to the Password screen --> + <string name="browser_menu_passwords">Gesla</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">Novo v %1$su</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Preklop na stran za računalnike</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Orodja</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Shrani</string> + + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Dodaj stran med zaznamke</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Uredi zaznamek</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Shrani kot PDF …</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Vklopi bralni pogled</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Izklopi bralni pogled</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Prevedi stran …</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Prevedeno v jezik %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Natisni …</string> <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> @@ -348,8 +408,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Obvestilo o zasebnosti za Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Preberite več v obvestilu o zasebnosti</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Z veseljem skrbimo za vašo varnost</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -556,6 +614,10 @@ <string name="preferences_account_sync_error">Ponovno se povežite za nadaljevanje sinhronizacije</string> <!-- Preference for language --> <string name="preferences_language">Jezik</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Prevajanje</string> + <!-- Preference for translations --> + <string name="preferences_translations">Prevajanje</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Podatkovne možnosti</string> <!-- Preference for data collection --> @@ -624,6 +686,16 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Ni dovoljeno</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Zahtevano</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Izbirno</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Dovoli za vsa spletna mesta</string> + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Če tej razširitvi zaupate, ji lahko dodelite dovoljenje za vsako spletno mesto.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Zbirka dodatkov po meri</string> @@ -648,7 +720,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Skoči nazaj</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Nedavni zaznamki</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Nedavni zaznamki</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Zaznamki</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Nedavno obiskano</string> @@ -743,8 +817,6 @@ <string name="preferences_sync_history">Zgodovina</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Zaznamki</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Gesla</string> <!-- Preference for syncing tabs --> @@ -772,8 +844,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s na %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne kartice</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Plačilna sredstva</string> <!-- Preference for syncing addresses --> @@ -790,6 +860,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Zavihek iz naprave %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Zaprtih %1$s zavihkov: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Prikaži nedavno zaprte zavihke</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Izjeme</string> @@ -1365,6 +1443,8 @@ <!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. --> <string name="notification_pbm_delete_text_2">Zapri zasebne zavihke</string> + <!-- Text shown in the notification that pops up to remind the user that a private browsing session is active for Android 14+ --> + <string name="notification_erase_title_android_14">Zaprem zasebne zavihke?</string> <string name="notification_erase_text_android_14">Tapnite to obvestilo ali ga povlecite vstran, da zaprete zasebne zavihke.</string> <!-- Name of the marketing notification channel. Displayed in the "App notifications" system settings for the app --> @@ -1725,12 +1805,8 @@ <string name="add_to_homescreen_description_2">To stran lahko preprosto dodate na svoj domači zaslon naprave za lažji dostop in hitrejše brskanje v načinu, podobnem aplikaciji.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave in gesla</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Gesla</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Shranjevanje prijav in gesel</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Shranjuj gesla</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Vprašaj pred shranjevanjem</string> @@ -1747,46 +1823,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Izpolnjuj uporabniška imena in gesla v drugih aplikacijah na napravi.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj prijavo</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Dodaj geslo</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sinhronizacija prijav</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Sinhroniziraj gesla</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Sinhroniziraj prijave med napravami</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Sinhroniziraj gesla med napravami</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Shranjene prijave</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Shranjena gesla</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Tu se prikažejo prijave, ki jih shranite ali sinhronizirate v %s.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Gesla, ki jih boste shranili ali sinhronizirali v %su, bodo našteta tukaj. Vsa gesla so shranjena v šifrirani obliki.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Več o Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Več o sinhronizaciji</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Izjeme</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Tu bodo prikazane prijave in gesla, ki niso shranjena.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">Za tukaj navedena mesta %s ne bo shranjeval gesel.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Prijave in gesla za te strani ne bodo shranjene.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">Za ta spletna mesta %s ne bo shranjeval gesel.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Izbriši vse izjeme</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Iskanje prijav</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Iskanje gesel</string> <!-- The header for the site that a login is for --> @@ -1815,17 +1872,11 @@ <string name="saved_login_reveal_password">Prikaži geslo</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Skrij geslo</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Odklenite za ogled shranjenih prijav</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Odklenite za ogled shranjenih gesel</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zavarujte svoje prijave in gesla</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Zavarujte shranjena gesla</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavite vzorec za zaklepanje naprave, PIN ali geslo za zaščito pred dostopom do shranjenih prijav in gesel, če vašo napravo uporablja še kdo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Nastavite vzorec za zaklepanje naprave, PIN ali geslo, da preprečite dostop do shranjenih gesel, če vašo napravo uporabi kdo drug.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Pozneje</string> @@ -1845,9 +1896,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Času zadnje uporabe</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Meni razvrščanja prijav</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Meni za razvrščanje gesel</string> @@ -1856,41 +1904,27 @@ <string name="preferences_autofill">Samodejno izpolnjevanje</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Naslovi</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditne kartice</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Plačilna sredstva</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Shrani in samodejno izpolni kartice</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Shranjuj in izpolnjuj plačilna sredstva</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Podatki so šifrirani</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s šifrira vsa plačilna sredstva, ki jih shranite</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Sinhroniziraj kartice med napravami</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Sinhroniziraj kartice</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj kreditno kartico</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Dodaj kartico</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Upravljanje shranjenih kartic</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Upravljanje kartic</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Dodaj naslov</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Upravljanje naslovov</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Shranjuj in samodejno izpolnjuj naslove</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Shranjuj in izpolnjuj naslove</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Vključi podatke, kot so številke, e-poštni naslovi in naslovi za dostavo</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Vključuje telefonske številke in e-poštne naslove</string> @@ -1914,7 +1948,7 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Izbriši kartico</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ali ste prepričani, da želite izbrisati to kreditno kartico?</string> + <string name="credit_cards_delete_dialog_confirmation_2">Izbrišem kartico?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Izbriši</string> <!-- The title for the "Save" menu item for saving a credit card --> @@ -1927,24 +1961,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Shranjene kartice</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vnesite veljavno številko kreditne kartice</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Vnesite veljavno številko kartice</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Izpolnite to polje</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Dodajte ime</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Odklenite za ogled shranjenih kartic</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Zavarujte svoje kreditne kartice</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Zavarujte shranjena plačilna sredstva</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Nastavite vzorec za zaklepanje naprave, PIN ali geslo za zaščito pred dostopom do kreditnih kartic, če vašo napravo uporablja še kdo.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Nastavite vzorec za zaklepanje naprave, PIN ali geslo, da preprečite dostop do plačilnih sredstev, če vašo napravo uporabi kdo drug.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Nastavi zdaj</string> @@ -1953,9 +1978,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Odklenite svojo napravo</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Odklenite za uporabo shranjenih podatkov o kreditnih karticah</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Odklenite za ogled shranjenih plačilnih sredstev</string> <!-- Title of the "Add address" screen --> @@ -1964,12 +1986,6 @@ <string name="addresses_edit_address">Uredi naslov</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Upravljanje naslovov</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ime</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Drugo ime</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Priimek</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Ime</string> <!-- The header for the street address of an address --> @@ -1996,7 +2012,7 @@ <string name="addressess_delete_address_button">Izbriši naslov</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Res želite izbrisati ta naslov?</string> + <string name="addressess_confirm_dialog_message_2">Izbrišem ta naslov?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Izbriši</string> <!-- The text for the negative button on "Delete address" dialog --> @@ -2095,49 +2111,29 @@ <string name="login_menu_delete_button">Izbriši</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Uredi</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ali ste prepričani, da želite izbrisati to prijavo?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Ali ste prepričani, da želite izbrisati to geslo?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Izbriši</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Prekliči</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Možnosti prijave</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Možnosti gesel</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Besedilno polje za urejanje spletnega naslova prijave.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Besedilno polje za urejanje spletnega naslova.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Besedilno polje za urejanje uporabniškega imena prijave.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Besedilno polje za urejanje uporabniškega imena.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Besedilno polje za urejanje gesla prijave.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Besedilno polje za urejanje gesla.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Shrani spremembe v prijavo.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Shrani spremembe.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Urejanje</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Uredi geslo</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Dodaj novo prijavo</string> <!-- The page title for adding new password. --> <string name="add_login_2">Dodaj geslo</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Zahtevano je geslo</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Vnesite geslo</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Zahtevano je uporabniško ime</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Vnesite uporabniško ime</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Zahtevano je ime domene</string> @@ -2463,6 +2459,10 @@ <!-- Translation request dialog --> <!-- Title for the translation dialog that allows a user to translate the webpage. --> <string name="translations_bottom_sheet_title">Prevedem to stran?</string> + <!-- Title for the translation dialog after a translation was completed successfully. + The first parameter is the name of the language that the page was translated from, for example, "French". + The second parameter is the name of the language that the page was translated to, for example, "English". --> + <string name="translations_bottom_sheet_title_translation_completed">Stran prevedena iz jezika %1$s v jezik %2$s</string> <!-- Title for the translation dialog that allows a user to translate the webpage when a user uses the translation feature the first time. The first parameter is the name of the application, for example, "Fenix". --> <string name="translations_bottom_sheet_title_first_time">Preskusite zasebno prevajanje v %1$su</string> <!-- Additional information on the translation dialog that appears when a user uses the translation feature the first time. The first parameter is clickable text with a link, for example, "Learn more". --> @@ -2473,10 +2473,14 @@ <string name="translations_bottom_sheet_translate_from">Izvorni jezik</string> <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> <string name="translations_bottom_sheet_translate_to">Ciljni jezik</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Poskusi z drugim izvornim jezikom</string> <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button">Ne zdaj</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Prikaži izvirnik</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Naložena izvirna neprevedena stran</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Končano</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2497,16 +2501,25 @@ <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> <string name="translation_error_language_not_supported_warning_text">%1$s žal še ni podprt jezik.</string> <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> - <string name="translation_error_language_not_supported_learn_more">Več o tem</string> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Več o tem</string> <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> <string name="translation_in_progress_snackbar">Prevajanje …</string> + <!-- Title for the data saving mode warning dialog used in the translation request dialog. + This dialog will be presented when the user attempts to perform + a translation without the necessary language files downloaded first when Android's data saver mode is enabled and the user is not using WiFi. + The first parameter is the size in kilobytes or megabytes of the language file. --> + <string name="translations_download_language_file_dialog_title">Prenesem jezik ob varčevanju s podatki (%1$s)?</string> + + <!-- Translations options dialog --> <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> - <string name="translation_option_bottom_sheet_title">Možnosti prevajanja</string> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Možnosti prevajanja</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Možnosti prevajanja</string> <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> <string name="translation_option_bottom_sheet_always_translate">Vedno ponudi prevod</string> @@ -2518,11 +2531,16 @@ <string name="translation_option_bottom_sheet_never_translate_site">Nikoli ne prevajaj tega spletnega mesta</string> <!-- Toggle switch description that will appear under the "Never translate these sites" settings toggle switch to provide more information on how this setting interacts with other settings. --> <string name="translation_option_bottom_sheet_switch_never_translate_site_description">Preglasi vse druge nastavitve</string> + <!-- Toggle switch description that will appear under the "Never translate" and "Always translate" toggle switch settings to provide more information on how these settings interacts with other settings. --> + <string name="translation_option_bottom_sheet_switch_description">Preglasi ponudbe za prevajanje</string> <!-- Button text for the button that will take the user to the translation settings dialog. --> <string name="translation_option_bottom_sheet_translation_settings">Nastavitve prevajanja</string> <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> <string name="translation_option_bottom_sheet_about_translations">O prevodih v %1$su</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Nekatere nastavitve začasno niso na voljo.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Prevajanje</string> @@ -2544,6 +2562,9 @@ <!-- Title of the automatic translation preference screen that will appear on the toolbar.--> <string name="automatic_translation_toolbar_title_preference">Samodejno prevajanje</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Jezikov ni bilo mogoče naložiti. Poskusite znova pozneje.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Ponudi prevajanje (privzeto)</string> @@ -2562,6 +2583,14 @@ <!-- Never translate site preference screen --> <!-- Title of the never translate site preference screen that will appear on the toolbar.--> <string name="never_translate_site_toolbar_title_preference">Nikoli ne prevajaj teh spletnih mest</string> + <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. + The first parameter is web site url (for example:"wikipedia.com") --> + <string name="never_translate_site_item_list_content_description_preference">Odstrani %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Spletnih mest ni bilo mogoče naložiti. Poskusite znova pozneje.</string> + <!-- The Delete site dialogue title will appear when the user clicks on a list item. + The first parameter is web site url (for example:"wikipedia.com") --> + <string name="never_translate_site_dialog_title_preference">Izbrišem %1$s?</string> <!-- The Delete site dialogue positive button will appear when the user clicks on a list item. The site will be deleted. --> <string name="never_translate_site_dialog_confirm_delete_preference">Izbriši</string> <!-- The Delete site dialogue negative button will appear when the user clicks on a list item. The dialog will be dismissed. --> @@ -2591,6 +2620,14 @@ <!-- Content description (not visible, for screen readers etc.): For a language list item that is selected. --> <string name="download_languages_item_content_description_selected_state">Izbrano</string> + <!-- Title for the dialog used by the translations feature to confirm deleting a language. + The dialog will be presented when the user requests deletion of a language. + The first parameter is the name of the language, for example, "Spanish" and the second parameter is the size in kilobytes or megabytes of the language file. --> + <string name="delete_language_file_dialog_title">Izbrišem jezik %1$s (%2$s)?</string> + <!-- Title for the dialog used by the translations feature to confirm deleting all languages file. + The dialog will be presented when the user requests deletion of all languages file. + The first parameter is the size in kilobytes or megabytes of the language file. --> + <string name="delete_language_all_languages_file_dialog_title">Izbrišem vse jezike (%1$s)?</string> <!-- Additional information for the dialog used by the translations feature to confirm deleting all languages file. The first parameter is the name of the application, for example, "Fenix". --> <string name="delete_language_all_languages_file_dialog_message">Če izbrišete vse jezike, bo %1$s pri prevajanju v predpomnilnik naložil delne jezike.</string> <!-- Button text on the dialog used by the translations feature to confirm deleting a language. --> @@ -2598,6 +2635,10 @@ <!-- Button text on the dialog used by the translations feature to cancel deleting a language. --> <string name="delete_language_file_dialog_negative_button_text">Prekliči</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation. --> + <string name="download_language_file_dialog_message_all_languages">Dele jezikov prenesemo v vaš predpomnilnik, da prevodi ostanejo zasebni.</string> + <!-- Additional information for the data saving mode warning dialog used by the translations feature. This text explains the reason a download is required for a translation without mentioning the cache. --> + <string name="download_language_file_dialog_message_all_languages_no_cache">Dele jezikov prenesemo, da prevodi ostanejo zasebni.</string> <!-- Checkbox label text on the data saving mode warning dialog used by the translations feature. This checkbox allows users to ignore the data usage warnings. --> <string name="download_language_file_dialog_checkbox_text">Vedno prenesi tudi ob varčevanju s podatki</string> <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file. --> @@ -2612,12 +2653,19 @@ <string name="debug_drawer_title">Orodja za razhroščevanje</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Pojdi nazaj</string> + + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Odpri predal za razhroščevanje</string> + + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Orodja za zavihke</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Št. zavihkov</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Dejavni</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Dejavni</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Dejaven</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Nedejavni</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2628,10 +2676,58 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Orodje za ustvarjanje zavihkov</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Količina zavihkov, ki jih želite ustvariti</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Besedilno polje je prazno</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Vnesite pozitivno celo število</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Vnesite število, večje od nič</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Dodaj med dejavne zavihke</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Dodaj med nedejavne zavihke</string> <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Dodaj med zasebne zavihke</string> + + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Nadaljuj</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Izpolnite anketo</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Obvestilo o zasebnosti</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Pošlji</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Zapri</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Hvala za vaše mnenje!</string> + + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">zelo zadovoljen/-na</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">zadovoljen/-na</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">neodločen/-a</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">nezadovoljen/-na</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">zelo nezadovoljen/-na</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Odpri anketo</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Zapri anketo</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Zapri</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Prijave</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Trenutna domena: %s</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Izbriši prijavo z uporabniškim imenom %s</string> </resources> diff --git a/mobile/android/fenix/app/src/main/res/values-sq/strings.xml b/mobile/android/fenix/app/src/main/res/values-sq/strings.xml index e7f4179835..acd961e78c 100644 --- a/mobile/android/fenix/app/src/main/res/values-sq/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sq/strings.xml @@ -47,12 +47,20 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Ruajtur së fundi</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Ruajtur së fundi</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Shfaqi krejt faqerojtësit e ruajtur</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Shfaqi krejt faqerojtësit e ruajtur</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Hiqe</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Hiqe</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Faqerojtës</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Shfaqni krejt faqerojtësit</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Hiqe</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s prodhohet nga Mozilla.</string> @@ -190,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Shtesa</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Zgjerime</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Administroni zgjerime</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Zbuloni më tepër zgjerime</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Hollësi llogarie</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -208,6 +220,8 @@ <string name="browser_menu_open_in_regular_tab">Hape në skedë të rregullt</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Shtoje te skena e Kreut</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Shtoje te skena e Kreut…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Instaloje</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -219,9 +233,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Përktheje faqen</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Ruajeni në koleksion…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Ruaje në koleksion</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Ndajeni me të tjerët</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Ndajeni me të tjerët…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Hape në %1$s</string> @@ -272,6 +290,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Ruaje</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Faqeruajeni këtë faqe</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Përpunoni faqerojtësin</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Ruajeni si PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Aktivizo Pamjen Lexues</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Çaktivizo Pamjen Lexues</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Përktheni faqen…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Përkthyer në %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Shtypeni…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">S’ka zgjerime këtu</string> @@ -578,7 +614,9 @@ <!-- Preference for language --> <string name="preferences_language">Gjuhë</string> <!-- Preference for translation --> - <string name="preferences_translation">Përkthim</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Përkthim</string> + <!-- Preference for translations --> + <string name="preferences_translations">Përkthime</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Zgjedhje për të dhënat</string> <!-- Preference for data collection --> @@ -685,7 +723,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Hidhu mbrapa</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Faqerojtës së fundi</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Faqerojtës së fundi</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Faqerojtës</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Vizituar së fundi</string> @@ -825,6 +865,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Skedë nga %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Skeda %1$s të mbyllura: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Shihni skeda të mbyllura së fundi</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Përjashtime</string> @@ -2509,6 +2557,8 @@ <string name="translations_bottom_sheet_negative_button">Jo tani</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Shfaq origjinalin</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">U ngarkua faqe origjinale e papërkthyer</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">U bë</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2689,13 +2739,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Shko mbrapsht</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Hap sirtar diagnostikimi</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Mjete Skedash</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Numër skedash</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktive</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktive</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktive</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Joaktive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> diff --git a/mobile/android/fenix/app/src/main/res/values-su/strings.xml b/mobile/android/fenix/app/src/main/res/values-su/strings.xml index ca7114a3cb..47f4e76ee8 100644 --- a/mobile/android/fenix/app/src/main/res/values-su/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-su/strings.xml @@ -198,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Émboh</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Éksténsi</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Atur émbohan</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Singraykeun émbohan leuwih loba</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Iber akun</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -216,6 +220,8 @@ <string name="browser_menu_open_in_regular_tab">Buka dina tab biasa</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Tambahkeun ka layar Tepas</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Tambahkeun ka layar Tepas…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Pasang</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Tarjamahkeun kaca</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Simpen koléksi…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Simpen kana koléksi</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Bagikeun</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Bagikeun…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Buka di %1$s</string> @@ -281,6 +291,25 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Teundeun</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Markahkeun ieu kaca</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Édit markah</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Simpen minangka PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Hurungkeun Pamintonan Pamaca</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Pareuman Pamintonan Pamaca</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Tarjamahkeun kaca…</string> + + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Ditarjamahkeun kana %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Citak…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Euweuh éksténsi di dieu</string> @@ -379,8 +408,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Iber pripasi Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Ilikan deui iber privasi urang</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Urang resep ngajaga anjeun sangkan aman</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -396,6 +423,8 @@ <string name="juno_onboarding_default_browser_description_nimbus_4" tools:ignore="UnusedResources">Leuwih ti 100 juta jalma ngajaga privasina ku milih browser anu dirojong ku nirlaba.</string> <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_description_nimbus_5" tools:ignore="UnusedResources">Trackers dipikawanoh? Diblokir otomatis. Ekstensi? Coba sakabéhna 700. PDFs? Pamaca anu diwangun ku urang ngajadikeun éta gampang diurus.</string> + <!-- Description for set firefox as default browser screen used by Nimbus experiments. --> + <string name="juno_onboarding_default_browser_description_nimbus_2" moz:RemovedIn="124" tools:ignore="UnusedResources">Browser anu dirojong kalawan nirlaba urang nulungan pikeun mahing pausahaan ngukuntit anjeun dina wéb. \n \n Diajar leuwih lengkep dina iber privasi urang.</string> <!-- Text for the link to the privacy notice webpage for set as firefox default browser screen. This is part of the string with the key "juno_onboarding_default_browser_description". --> <string name="juno_onboarding_default_browser_description_link_text" moz:RemovedIn="124" tools:ignore="UnusedResources">wawar pripasi</string> @@ -405,10 +434,19 @@ <string name="juno_onboarding_default_browser_negative_button" tools:ignore="UnusedResources">Moal waka</string> <!-- Title for sign in to sync screen. --> <string name="juno_onboarding_sign_in_title_2">Tetep énkripsi nalika anjeun luncat antara alat</string> + <!-- Description for sign in to sync screen. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_sign_in_description_2">Sabot anjeun asup jeung nyingkronkeun, anjeun téh leuwih aman. Firefox ngaénkripsi sandi anjeun, tetengger, jeung réa-réa deui.</string> <!-- Text for the button to sign in to sync on the device --> <string name="juno_onboarding_sign_in_positive_button" tools:ignore="UnusedResources">Asup</string> <!-- Text for the button dismiss the screen and move on with the flow --> <string name="juno_onboarding_sign_in_negative_button" tools:ignore="UnusedResources">Moal waka</string> + <!-- Title for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_enable_notifications_title_nimbus_2">Iber mantuan anjeun tetep aman jeung Firefox</string> + <!-- Description for enable notification permission screen used by Nimbus experiments. Nimbus experiments do not support string placeholders. + Note: The word "Firefox" should NOT be translated --> + <string name="juno_onboarding_enable_notifications_description_nimbus_2">Kirim tab kalawan aman antara parabot anjeun jeung téangan fitur privasi séjénna dina Firefox.</string> <!-- Text for the button to request notification permission on the device --> <string name="juno_onboarding_enable_notifications_positive_button" tools:ignore="UnusedResources">Hurungkeun iber</string> <!-- Text for the button dismiss the screen and move on with the flow --> @@ -495,6 +533,8 @@ <!-- Label for cookie banner section in quick settings panel. --> <string name="cookie_banner_blocker">Pameungpeuk Spanduk Réréméh</string> + <!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. --> + <string name="preferences_cookie_banner_reduction_private_mode">Cookie Banner Blocker dina panyungsian pribadi</string> <!-- Text for indicating cookie banner handling is off this site, this is shown as part of the protections panel with the tracking protection toggle --> <string name="reduce_cookie_banner_off_for_site">Pareum jang ieu loka</string> <!-- Text for cancel button indicating that cookie banner reduction is not supported for the current site, this is shown as part of the cookie banner details view. --> @@ -512,9 +552,23 @@ <string name="reduce_cookie_banner_unsupported_site_request_submitted_2">Rekés dukungan dikirim</string> <!-- Text for indicating cookie banner handling is currently not supported for this site, this is shown as part of the protections panel with the tracking protection toggle --> <string name="reduce_cookie_banner_unsupported_site">Kiwari loka teu didukung </string> + <!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> + <string name="reduce_cookie_banner_details_panel_title_on_for_site_1">Hurungkeun Pameungpeuk Spanduk Réréméh pikeun %1$s?</string> + <!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site--> + <string name="reduce_cookie_banner_details_panel_title_off_for_site_1">Pareuman Pameungpeuk Spanduk Réréméh pikeun %1$s?</string> <!-- Title text for a detail explanation indicating cookie banner reducer didn't work for the current site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name--> <string name="reduce_cookie_banner_details_panel_title_unsupported_site_request_2">%1$s teu bisa otomatis nolak rekés réréméh dina ieu loka. Anjeun bisa ngirim rekés pikeun ngadukung ieu loka jaga.</string> + <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is off for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> + <string name="reduce_cookie_banner_details_panel_description_off_for_site_1">Pareuman jeung %1$s bakal mupus cookies sarta ngamuat deui situs ieu. Ieu bisa ngaluarkeun anjeun atawa ngosongkeun carangka balanja.</string> + <!-- Long text for a detail explanation indicating what will happen if cookie banner handling is on for a site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is the application name --> + <string name="reduce_cookie_banner_details_panel_description_on_for_site_3">Hurungkeun jeung %1$s bakal nyobaan nampik sakabéh spanduk cookie dina situs ieu kalawan otomatis.</string> + <!--Title for the cookie banner re-engagement CFR, the placeholder is replaced with app name --> + <string name="cookie_banner_cfr_title">%1$s cikénéh nampik réréméh pikeun anjeun</string> + + <!--Message for the cookie banner re-engagement CFR --> + <string name="cookie_banner_cfr_message">Saeutik gangguan, saeutik cookies ngukuntit anjeun dina situs ieu.</string> + <!-- Description of the preference to enable "HTTPS-Only" mode. --> <string name="preferences_https_only_summary">Otomatis nyoba nyambung ka loka maké protokol énkripsi HTTPS pikeun ngaronjatkeun kaamanan.</string> <!-- Summary of https only preference if https only is set to off --> @@ -532,13 +586,17 @@ <!-- Title shown in the error page for when trying to access a http website while https only mode is enabled. --> <string name="errorpage_httpsonly_title">Situs aman teu sayaga</string> <!-- Message shown in the error page for when trying to access a http website while https only mode is enabled. The message has two paragraphs. This is the first. --> - <string name="errorpage_httpsonly_message_title">Sigana, raramatlokana teu ngarojong HTTPs.</string> + <string name="errorpage_httpsonly_message_title">Sigana, raramatlokana teu ngarojong HTTPS.</string> <!-- Message shown in the error page for when trying to access a http website while https only mode is enabled. The message has two paragraphs. This is the second. --> <string name="errorpage_httpsonly_message_summary">Nanging, bisa waé aya panyerang kalibet. Upama diteruskeun asup kana raramatlokana, anjeun ulah ngasupkeun émbaran sénsitip. Upama diteruskeun, mode Ngan-HTTPS bakal dipareuman samentawis pikeun éta loka.</string> <!-- Preference for accessibility --> <string name="preferences_accessibility">Aksésibilitas</string> + <!-- Preference to override the Mozilla account server --> + <string name="preferences_override_account_server">Serper akun Mozilal kustom</string> <!-- Preference to override the Sync token server --> <string name="preferences_override_sync_tokenserver">Serper Sync kustom</string> + <!-- Toast shown after updating the Mozilla account/Sync server override preferences --> + <string name="toast_override_account_sync_server_done">Akun Mozilla/Server Sync dirobah. Ngaluarkeun aplikasi pikeun nerapkeun parobahan…</string> <!-- Preference category for account information --> <string name="preferences_category_account">Akun</string> <!-- Preference for changing where the toolbar is positioned --> @@ -559,6 +617,10 @@ <string name="preferences_account_sync_error">Sambungkeun deui pikeun neruskeun nyingkronkeun</string> <!-- Preference for language --> <string name="preferences_language">Basa</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Tarjamah</string> + <!-- Preference for translations --> + <string name="preferences_translations">Tarjamah</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Pilihan data</string> <!-- Preference for data collection --> @@ -586,9 +648,16 @@ <!-- Preference for enabling url autocomplete--> <string name="preferences_enable_autocomplete_urls">Otokumplit URLs</string> + <!-- Preference title for switch preference to show sponsored Firefox Suggest search suggestions --> + <string name="preferences_show_sponsored_suggestions">Saran ti sponsor</string> + <!-- Summary for preference to show sponsored Firefox Suggest search suggestions. + The first parameter is the name of the application. --> + <string name="preferences_show_sponsored_suggestions_summary">Pangrojong %1$s kalawan saran anu disponsoran</string> <!-- Preference title for switch preference to show Firefox Suggest search suggestions for web content. The first parameter is the name of the application. --> <string name="preferences_show_nonsponsored_suggestions">Saran ti %1$s</string> + <!-- Summary for preference to show Firefox Suggest search suggestions for web content --> + <string name="preferences_show_nonsponsored_suggestions_summary">Pundut saran tina wéb patali jeung panyungsian anjeun</string> <!-- Preference for open links in third party apps --> <string name="preferences_open_links_in_apps">Buka tutumbu dina aplikasi</string> <!-- Preference for open links in third party apps always open in apps option --> @@ -608,6 +677,12 @@ <!-- Preference for add_ons --> <string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Émbohan</string> + <!-- Preference for extensions --> + <string name="preferences_extensions">Éksténsi</string> + <!-- Preference for installing a local add-on --> + <string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Pasang panambah tina berkas</string> + <!-- Preference for installing a local extension --> + <string name="preferences_install_local_extension">Pasang pangémboh tina berkas</string> <!-- Preference for notifications --> <string name="preferences_notifications">Iber</string> @@ -616,9 +691,22 @@ <!-- Summary for notification preference indicating notifications are not allowed --> <string name="notifications_not_allowed_summary">Teu diidinan</string> + <!-- Add-on Permissions --> + <!-- The title of the required permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Dibutuhkeun</string> + <!-- The title of the optional permissions section from addon's permissions screen --> + <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Pilihan</string> + <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> + <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Idinan pikeun sakabéh situs</string> + + <!-- The subtitle for the allow for all sites preference toggle --> + <string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Lamun anjeun percaya pangémboh ieu, anjeun bisa méré idin dina unggal situs.</string> + <!-- Add-on Preferences --> <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> <string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Koléksi Émboh sakahayang</string> + <!-- Preference to customize the configured AMO (addons.mozilla.org) collection --> + <string name="preferences_customize_extension_collection">Koléksi Émboh sakahayang</string> <!-- Button caption to confirm the add-on collection configuration --> <string name="customize_addon_collection_ok">Heug</string> <!-- Button caption to abort the add-on collection configuration --> @@ -631,11 +719,16 @@ <!-- Toast shown after confirming the custom add-on collection configuration --> <string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Koléksi Émboh geus dirobah. Kaluar ti aplikasi pikeun nerapkeun parobahan…</string> + <!-- Toast shown after confirming the custom extension collection configuration --> + <string name="toast_customize_extension_collection_done">Koléksi Émboh geus dirobah. Kaluar ti aplikasi pikeun nerapkeun parobahan…</string> + <!-- Customize Home --> <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Asup deui</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Markah anyar</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Markah</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Anyar dianjangan</string> @@ -684,19 +777,41 @@ <!-- Wallpaper onboarding dialog learn more button text. The button navigates to the wallpaper settings screen. --> <string name="wallpapers_onboarding_dialog_explore_more_button_text">Langlang latar lianna</string> + <!-- Add-ons general availability nimbus message--> + <!-- Title of the Nimbus message for add-ons general availability--> + <string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Aya add-on anyar</string> + + <!-- Title of the Nimbus message for extension general availability--> + <string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Aya add-on anyar yeuh</string> + <!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here--> + <string name="addon_ga_message_body" tools:ignore="UnusedResources">Pariksa 100+ pangémboh anyar anu ngamungkinkeun anjeun ngajadikeun Firefox sorangan.</string> + <!-- Button text of the Nimbus message for add-ons general availability. --> + <string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Paluruh add-ons</string> + <!-- Button text of the Nimbus message for extensions general availability. --> + <string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Paluruh pangémboh</string> + <!-- Extension process crash dialog to user --> <!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled --> <string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Add-on tumpur saheulaanan</string> + <!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled --> + <string name="extension_process_crash_dialog_title">Éksténsi saheulanaan dipareuman</string> <!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. --> <string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Aya add-on anu mugen, matak teu stabil kana sistem. %1$s gagal nyobaan malikan deui add-onna.\n\nAdd-on moal dimimitian ulang dina rintakan anu ayeuna.\n\nMiceun atawa numpurkeun add-on bisa jadi menerkeun ieu masalah.</string> <!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again --> <string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Coba balikan deui add-on</string> + <!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again --> + <string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Jalankeun deui éksténsi</string> <!-- The user will continue with all add-ons disabled --> <string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Tuluykeun bari add-on tumpur</string> + <!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. --> + <string name="extension_process_crash_dialog_disable_extensions_button_text">Tuluykeun bari add-on tumpur</string> + <!-- Account Preferences --> <!-- Preference for managing your account via accounts.firefox.com --> <string name="preferences_manage_account">Kokolakeun akun</string> + <!-- Summary of the preference for managing your account via accounts.firefox.com. --> + <string name="preferences_manage_account_summary">Robah kecap aksés anjeun, atur pangumpulan data, atawa pupus akun anjeun</string> <!-- Preference for triggering sync --> <string name="preferences_sync_now">Singkronkeun ayeuna</string> <!-- Preference category for sync --> @@ -706,8 +821,8 @@ <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Markah</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Login</string> + <!-- Preference for syncing passwords --> + <string name="preferences_sync_logins_2">Kecap sandi</string> <!-- Preference for syncing tabs --> <string name="preferences_sync_tabs_2">Buka tab</string> <!-- Preference for signing out --> @@ -732,8 +847,8 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s dina %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kartu kiridit</string> + <!-- Preference for syncing payment methods --> + <string name="preferences_sync_credit_cards_2">Cara mayar</string> <!-- Preference for syncing addresses --> <string name="preferences_sync_address">Alamat</string> @@ -747,6 +862,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab ti %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tab ditutup: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Témbongkeun tab nu anyar ditutup</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Iwal</string> @@ -1319,6 +1442,11 @@ <!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. --> <string name="notification_pbm_delete_text_2">Tutup tab nyamuni</string> + <!-- Text shown in the notification that pops up to remind the user that a private browsing session is active for Android 14+ --> + <string name="notification_erase_title_android_14">Tutup tab pribadi?</string> + + <string name="notification_erase_text_android_14">Toél atawa golosorkeun bewara ieu pikeun nutup tab pribadi.</string> + <!-- Name of the marketing notification channel. Displayed in the "App notifications" system settings for the app --> <string name="notification_marketing_channel_name">Pamasaran</string> @@ -1371,6 +1499,8 @@ <string name="snackbar_private_tab_closed">Tab nyamuni ditutup</string> <!-- Text shown in snackbar when user closes all private tabs --> <string name="snackbar_private_tabs_closed">Tab nyamuni ditutup</string> + <!-- Text shown in snackbar when user erases their private browsing data --> + <string name="snackbar_private_data_deleted">Data panyungsi dipupus</string> <!-- Text shown in snackbar to undo deleting a tab, top site or collection --> <string name="snackbar_deleted_undo">BEDO</string> <!-- Text shown in snackbar when user removes a top site --> @@ -1561,6 +1691,8 @@ <string name="preference_enhanced_tracking_protection_custom_cookies_4">Sakabéh réréméh (bakal ngabalukarkeun raramatloka jadi teu bener)</string> <!-- Option for enhanced tracking protection for the custom protection settings for cookies--> <string name="preference_enhanced_tracking_protection_custom_cookies_5">Kerem réréméh meuntas-loka</string> + <!-- Preference for Global Privacy Control for the custom privacy settings for Global Privacy Control. '&' is replaced with the ampersand symbol: &--> + <string name="preference_enhanced_tracking_protection_custom_global_privacy_control">Béjakeun situs wéb sangkan henteu ngabagi & ngajual data</string> <!-- Preference for enhanced tracking protection for the custom protection settings for tracking content --> <string name="preference_enhanced_tracking_protection_custom_tracking_content">Kontén palacak</string> <!-- Option for enhanced tracking protection for the custom protection settings for tracking content--> @@ -1590,7 +1722,7 @@ <string name="etp_cookies_description">Meungpeuk réréméh anu dipaké ku maskapé jaringan iklan jeung analitika pikeun ngumpulkeun data langlangan anjeun di loka anu kaanjangan.</string> <!-- Description of cross-site tracking cookies that can be blocked by Enhanced Tracking Protection --> - <string name="etp_cookies_description_2">Total Cookie Protection ngerem réréméh dina loka anu keur dibuka sangkan teu bisa dipaké ku palacak kayaning jaringan iklan pikeun nunutur anjeun meuntas-loa.</string> + <string name="etp_cookies_description_2">Total Cookie Protection ngerem réréméh dina loka anu keur dibuka ku anjeun sangkan teu bisa dipaké ku palacak kayaning jaringan iklan pikeun nunutur anjeun meuntas-loa.</string> <!-- Category of trackers (cryptominers) that can be blocked by Enhanced Tracking Protection --> <string name="etp_cryptominers_title">Gurandil kripto</string> <!-- Description of cryptominers that can be blocked by Enhanced Tracking Protection --> @@ -1680,9 +1812,9 @@ <string name="add_to_homescreen_description_2">Anjeun bisa kalawan gampang nambahkeun ieu raramatloka kana layar Tepas ponsél pikeun aksés instan sarta maluruh leuwih gancang kawas muka aplikasi.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Login jeung kecap sandi</string> + <string name="preferences_passwords_logins_and_passwords_2">Kecap sandi</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Teundeun login jeung kecap sandi</string> + <string name="preferences_passwords_save_logins_2">Simpen kecap sandi</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Naros keur neundeun</string> <!-- Preference option for never saving passwords in Fenix --> @@ -1697,30 +1829,30 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Eusian sandiasma jeung kecap sandi dina séjén aplikasi dina parabot anjeun.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Tambahkeun login</string> + <!-- Preference option for adding a password --> + <string name="preferences_logins_add_login_2">Tambahan sandi</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Singkronkeun login</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Singkronkeun login di sakabéh parabot</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Login nu disimpen</string> + <string name="preferences_passwords_sync_logins_2">Singkronkeun sandi</string> + <!-- Preference for syncing saved passwords in Fenix, when not signed in--> + <string name="preferences_passwords_sync_logins_across_devices_2">Singkronkeun sandi dina sakabéh parabot</string> + <!-- Preference to access list of saved passwords --> + <string name="preferences_passwords_saved_logins_2">Sandi nu disimpen</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Login anu diteundeun atawa disingkronkeun ka %s bakal némbongan di dieu.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Leuwih jéntré ngeunaan Sync.</string> + <string name="preferences_passwords_saved_logins_description_empty_text_2">Sandi anu anjeun simpen atawa disingkronkeun kana %s bakal didaptarkeun di dieu. Sakumna kecap sandi anu disimpen ku anjeun téh diénkripsi.</string> + <!-- Clickable text for opening an external link for more information about Sync. --> + <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Lenyepan ngeunaan singkronisasi</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Iwal</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Login jeung kecap sandi anu teu diteundeun bakal ditémbongkeun di dieu.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Login jeung kecap sandi moal diteundeun pikeun ieu loka.</string> + <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> + <string name="preferences_passwords_exceptions_description_empty_2">%s moal nyimpen sandi pikeun situs anu didaptarkeun di dieu.</string> + <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> + <string name="preferences_passwords_exceptions_description_2">%s moal nyimpen sandi pikeun situs-situs ieu.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Hapus sadaya pengecualian</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Paluruh login</string> + <!-- Hint for search box in passwords list --> + <string name="preferences_passwords_saved_logins_search_2">Téangan kecap sandi</string> <!-- The header for the site that a login is for --> <string name="preferences_passwords_saved_logins_site">Loka</string> <!-- The header for the username for a login --> @@ -1747,12 +1879,10 @@ <string name="saved_login_reveal_password">Témbongkeun sandi</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Sumputkeun sandi</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Buka konci pikeun nempo login anu diteundeun</string> + <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> + <string name="logins_biometric_prompt_message_2">Buka konci pikeun nempo sandi anu diteundeun</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Amankeun login jeung kecap sandi anjeun</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Jieun pola konci paranti, PIN, atawa kecap sandi pikeun ngajaga login jeung kecap sandi anu diteundeun bisi paranti anjeun dipaké batur.</string> + <string name="logins_warning_dialog_title_2">Amankeun kecap sandi anjeun nu disimpen</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Engké</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> @@ -1768,37 +1898,39 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Panungtun dipaké</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Runtuykeun menu login</string> + + <!-- Content description (not visible, for screen readers etc.) --> + <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Nyortir ménu kecap sandi</string> <!-- Autofill --> <!-- Preference and title for managing the autofill settings --> <string name="preferences_autofill">Eusi otomatis</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Alamat</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kartu kiridit</string> + <!-- Preference and title for managing the settings for payment methods --> + <string name="preferences_credit_cards_2">Cara mayar</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Simpen jeung otongeusi kartu</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data diénkrip</string> + <string name="preferences_credit_cards_save_and_autofill_cards_2">Simpen jeung eusian cara mayar</string> + <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> + <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s énkripsi kabéh cara mayar anu disimpen ku anjeun</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Singkronkeun kartu di sakabeh parabot</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Singkronkeun kartu</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Tambah kartu kiridit</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kokolakeun kartu anu diteundeun</string> + <!-- Preference option for adding a card --> + <string name="preferences_credit_cards_add_credit_card_2">Tambahan kartu</string> + <!-- Preference option for managing saved cards --> + <string name="preferences_credit_cards_manage_saved_cards_2">Atur kartu</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Tambah alamat</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Kokolakeun alamat</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Simpen jeung otongeusi alamat</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Kaasup émbaran sarupaning nomer, surélék, jeung alamat kirim</string> + <!-- Preference for saving and filling addresses --> + <string name="preferences_addresses_save_and_autofill_addresses_2">Simpen jeung eusian alamat</string> + + <!-- Preference summary for saving and filling address data --> + <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Sartakeun nomer telepon jeung alamat surélék</string> <!-- Title of the "Add card" screen --> <string name="credit_cards_add_card">Tambah kartu</string> @@ -1819,7 +1951,7 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Hapus kartu</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Yakin anjeun rék mupus ieu kartu kiridit?</string> + <string name="credit_cards_delete_dialog_confirmation_2">Pupus kartu?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Hapus</string> <!-- The title for the "Save" menu item for saving a credit card --> @@ -1831,37 +1963,31 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Kartu disimpen</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Mangga lebetkeun nomer kartu kiridit anu sah</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Mangga eusian kolom ieu</string> + <!-- Error message for card number validation --> + <string name="credit_cards_number_validation_error_message_2">Asupkeun nomer kartu anu sah</string> + <!-- Error message for card name on card validation --> + <string name="credit_cards_name_on_card_validation_error_message_2">Tambahan ngaran</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Buka konci pikeun nempo kartu anu diteundeun</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Amankeun kartu kiridit anjeun</string> - <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Jieun pola konci paranti, PIN, atawa kecap sandi pikeun ngajaga kartu kiridit anu diteundeun bisi paranti anjeun dipaké batur.</string> + <string name="credit_cards_warning_dialog_title_2">Amankeun metode mayar anjeun anu disimpen</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Setél ayeuna</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_later">Engké deui</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Buka konci paranti anjeun</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Buka konci pikeun nganggo inpormasi kartu kiridit anu disimpen</string> + <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> + <string name="credit_cards_biometric_prompt_unlock_message_2">Buka konci pikeun maké cara mayar anu disimpen</string> <!-- Title of the "Add address" screen --> <string name="addresses_add_address">Tambah alamat</string> <!-- Title of the "Edit address" screen --> <string name="addresses_edit_address">Ropéa alamat</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Kokolakeun alamat</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ngaran Hareup</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Ngaran Tengah</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Ngaran Tukang</string> + <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> + <string name="addresses_name">Ngaran</string> <!-- The header for the street address of an address --> <string name="addresses_street_address">Alamat Jalan</string> <!-- The header for the city of an address --> @@ -1886,7 +2012,7 @@ <string name="addressess_delete_address_button">Hapus alamat</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Yakin rék mupus ieu alamat?</string> + <string name="addressess_confirm_dialog_message_2">Pupus alamat ieu?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Hapus</string> <!-- The text for the negative button on "Delete address" dialog --> @@ -1984,32 +2110,34 @@ <string name="login_menu_delete_button">Pupus</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Édit</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Yakin rék mupus ieu login?</string> + <!-- Message in delete confirmation dialog for password --> + <string name="login_deletion_confirmation_2">Yakin anjeun rék mupus ieu sandi?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Pupus</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Bolay</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Pilihan asup log</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Widang téks éditeun pikeun alamat raramat login.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Widang téks éditeun pikeun sandiasma login.</string> + <!-- The saved password options menu description. --> + <string name="login_options_menu_2">Pilihan sandi</string> + <!-- The editable text field for a website address. --> + <string name="saved_login_hostname_description_3">Widang téks éditeun pikeun alamat raramat login.</string> + <!-- The editable text field for a username. --> + <string name="saved_login_username_description_3">Widang téks éditeun pikeun sandiasma login.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Widang téks éditeun pikeun kecap sandi login.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Teundeun parobahan login.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Édit</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Tambahkeun login anyar</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Butuh kecap sandi</string> + <string name="saved_login_password_description_2">Widang téks éditeun pikeun sandi kecap.</string> + <!-- The button description to save changes to an edited password. --> + <string name="save_changes_to_login_2">Simpen parobahan.</string> + <!-- The page title for editing a saved password. --> + <string name="edit_2">Ropéa sandi</string> + <!-- The page title for adding new password. --> + <string name="add_login_2">Tambahan sandi</string> + <!-- Error text displayed underneath the password field when it is in an error case. --> + <string name="saved_login_password_required_2">Asupkeun sandi</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Kudu ngeusian sandiasma</string> + <string name="saved_login_username_required_2">Asupkeun ngaran pamaké</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Kudu ngeusian ngaran host</string> + <!-- The error message in add login view when hostname field is blank. --> + <string name="saved_login_hostname_required_2" tools:ignore="UnusedResources">Asupkeun kaca raramat</string> <!-- Voice search button content description --> <string name="voice_search_content_description">Sungsi sora</string> <!-- Voice search prompt description displayed after the user presses the voice search button --> @@ -2104,6 +2232,9 @@ <!-- Title for search suggestions when the default search suggestion engine is anything other than Google. The first parameter is default search engine name. --> <string name="other_default_search_engine_suggestion_header">Pamaluruhan %s</string> + <!-- Default browser experiment --> + <!-- Default browser card title --> + <string name="default_browser_experiment_card_title">Alihkeun panyungsi baku anjeun</string> <!-- Default browser card text --> <string name="default_browser_experiment_card_text">Setél tutumbu ti raramatloka, surélék, jeung surat pikeun muka otomatis dina Firefox.</string> @@ -2141,17 +2272,90 @@ <!-- Snackbar button text to navigate to telemetry settings.--> <string name="experiments_snackbar_button">Buka setélan</string> + <!-- Review quality check feature--> + <!-- Name for the review quality check feature used as title for the panel. --> + <string name="review_quality_check_feature_name_2">Pamariksa repiu</string> + <!-- Summary for grades A and B for review quality check adjusted grading. --> + <string name="review_quality_check_grade_a_b_description">Repiu andelan</string> + <!-- Summary for grade C for review quality check adjusted grading. --> + <string name="review_quality_check_grade_c_description">Campuran bahasan nu dipercaya jeung nu teu dipercaya</string> + <!-- Summary for grades D and F for review quality check adjusted grading. --> + <string name="review_quality_check_grade_d_f_description">Repiu lain andelan</string> + <!-- Text for title presenting the reliability of a product's reviews. --> + <string name="review_quality_check_grade_title">Kumaha kadar andelan ulasan ieu?</string> + <!-- Title for when the rating has been updated by the review checker --> + <string name="review_quality_check_adjusted_rating_title">Peunteun disaluyukeun</string> + <!-- Description for a product's adjusted star rating. The text presents that the product's reviews which were evaluated as unreliable were removed from the adjusted rating. --> + <string name="review_quality_check_adjusted_rating_description_2">Dumasarkana ulasan andelan</string> + <!-- Title for list of highlights from a product's review emphasizing a product's important traits. --> + <string name="review_quality_check_highlights_title">Sorot tina ulasan cikénéh</string> + <!-- Title for section explaining how we analyze the reliability of a product's reviews. --> + <string name="review_quality_check_explanation_title">Kumaha urang nangtukeun kualitas ulasan</string> + <!-- Text for learn more caption presenting a link with information about review quality. First parameter is for clickable text defined in review_quality_check_info_learn_more_link. --> + <string name="review_quality_check_info_learn_more">Leuwih jéntré ngeunaan %s.</string> + <!-- Clickable text that links to review quality check SuMo page. First parameter is the Fakespot product name. --> + <string name="review_quality_check_info_learn_more_link_2">kumaha %s nangtukeun kualitas ulasan</string> + <!-- Text for title of settings section. --> + <string name="review_quality_check_settings_title">Setélan</string> + <!-- Text for label for switch preference to show recommended products from review quality check settings section. --> + <string name="review_quality_check_settings_recommended_products">Témbongkeun iklan dina pamariksa ténjoan</string> + <!-- Clickable text that links to review quality check recommended products support article. --> + <string name="review_quality_check_settings_recommended_products_learn_more" tools:ignore="UnusedResources">Lenyepan</string> + <!-- Text for turning sidebar off button from review quality check settings section. --> + <string name="review_quality_check_settings_turn_off">Pareuman pamariksaan ténjoan</string> + <!-- Text for title of recommended product section. This is displayed above a product image, suggested as an alternative to the product reviewed. --> + <string name="review_quality_check_ad_title" tools:ignore="UnusedResources">Leuwih tinimbangan</string> <!-- Caption for recommended product section indicating this is an ad by Fakespot. First parameter is the Fakespot product name. --> <string name="review_quality_check_ad_caption" tools:ignore="UnusedResources">Iklan ku %s</string> + <!-- Caption for review quality check panel. First parameter is for clickable text defined in review_quality_check_powered_by_link. --> + <string name="review_quality_check_powered_by_2">Pamariksaan ulasan drojong ku %s</string> <!-- Clickable text that links to Fakespot.com. First parameter is the Fakespot product name. In the phrase "Fakespot by Mozilla", "by" can be localized. Does not need to stay by. --> <string name="review_quality_check_powered_by_link" tools:ignore="UnusedResources">%s ku Mozilla</string> + <!-- Text for title of warning card informing the user that the current analysis is outdated. --> + <string name="review_quality_check_outdated_analysis_warning_title" tools:ignore="UnusedResources">Katerangan anyar pikeun dipariksa</string> + <!-- Text for button from warning card informing the user that the current analysis is outdated. Clicking this should trigger the product's re-analysis. --> + <string name="review_quality_check_outdated_analysis_warning_action" tools:ignore="UnusedResources">Pariksa ayeuna</string> + <!-- Title for warning card informing the user that the current product does not have enough reviews for a review analysis. --> + <string name="review_quality_check_no_reviews_warning_title">Ulasan tacan cukup</string> + <!-- Text for body of warning card informing the user that the current product does not have enough reviews for a review analysis. --> + <string name="review_quality_check_no_reviews_warning_body">Lamun produk ieu leuwih loba ulasanana, urang bisa mariksa kualitasna.</string> + <!-- Title for warning card informing the user that the current product is currently not available. --> + <string name="review_quality_check_product_availability_warning_title">Produk teu sadia</string> + <!-- Clickable text for warning card informing the user that the current product is currently not available. Clicking this should inform the server that the product is available. --> + <string name="review_quality_check_product_availability_warning_action_2">Laporan produk aya dina stok</string> + <!-- Title for warning card informing the user that the current product's analysis is still processing. The parameter is the percentage progress (0-100%) of the analysis process (e.g. 56%). --> + <string name="review_quality_check_analysis_in_progress_warning_title_2">Mariksa kualitas ulasan (%s)</string> + <!-- Text for body of warning card informing the user that the current product's analysis is still processing. --> + <string name="review_quality_check_analysis_in_progress_warning_body">Lilana ieu kira-kira 60 detik.</string> + <!-- Title for info card displayed after the user reports a product is back in stock. --> + <string name="review_quality_check_analysis_requested_info_title">Hatur nuhun geus ngalaporkeun!</string> + <!-- Title for info card displayed when the user review checker while on a product that Fakespot does not analyze (e.g. gift cards, music). --> + <string name="review_quality_check_not_analyzable_info_title">Urang henteu bisa mariksa ulasan ieu</string> + <!-- Title for info card displayed when another user reported the displayed product is back in stock. --> + <string name="review_quality_check_analysis_requested_other_user_info_title" tools:ignore="UnusedResources">béja nu arék datang</string> + <!-- Title for info card displayed to the user when analysis finished updating. --> + <string name="review_quality_check_analysis_updated_confirmation_title" tools:ignore="UnusedResources">Analisis geus luyu nu jeung panganyarna</string> <!-- Text for the action button from info card displayed to the user when analysis finished updating. --> <string name="review_quality_check_analysis_updated_confirmation_action" tools:ignore="UnusedResources">Ngarti</string> + <!-- Title for error card displayed to the user when an error occurred. --> + <string name="review_quality_check_generic_error_title">Euweuh inpo nu sadia kiwari</string> + <!-- Text for body of error card displayed to the user when an error occurred. --> + <string name="review_quality_check_generic_error_body">Urang keur digawé pikeun ngabéréskeun masalah éta. Mangga pariksa engké deui.</string> <!-- Title for error card displayed to the user when the device is disconnected from the network. --> <string name="review_quality_check_no_connection_title">Euweuh sambungan jaringan</string> + <!-- Text for body of error card displayed to the user when the device is disconnected from the network. --> + <string name="review_quality_check_no_connection_body">Pariksa sambungan jaringan anjeun terus cobaan muatkeun deui kacana.</string> + <!-- Title for card displayed to the user for products whose reviews were not analyzed yet. --> + <string name="review_quality_check_no_analysis_title">Euweuh inpormasi ngeunaan ulasan ieu</string> + <!-- Text for button from body of card displayed to the user for products whose reviews were not analyzed yet. Clicking this should trigger a product analysis. --> + <string name="review_quality_check_no_analysis_link">Pariksa kualitas review</string> + <!-- Headline for review quality check contextual onboarding card. --> + <string name="review_quality_check_contextual_onboarding_title">Cobaan pituduh ulasan produk urang nu dipercaya </string> <!-- Clickable text from the contextual onboarding card that links to review quality check support article. --> <string name="review_quality_check_contextual_onboarding_learn_more_link">Leuwih teleb</string> + <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot privacy notice. --> + <string name="review_quality_check_contextual_onboarding_privacy_policy_3">wawar pripasi</string> <!-- Clickable text from the review quality check contextual onboarding card that links to Fakespot terms of use. --> <string name="review_quality_check_contextual_onboarding_terms_use">katangtuan maké</string> <!-- Text for opt-in button from the review quality check contextual onboarding card. --> @@ -2166,11 +2370,38 @@ <!-- Flag showing that the review quality check feature is work in progress. --> <string name="review_quality_check_beta_flag">Béta</string> + <!-- Content description (not visible, for screen readers etc.) for opening browser menu button to open review quality check bottom sheet. --> + <string name="review_quality_check_open_handle_content_description">Buka pamariksa ténjoan</string> + <!-- Content description (not visible, for screen readers etc.) for closing browser menu button to open review quality check bottom sheet. --> + <string name="review_quality_check_close_handle_content_description">Tutup pamariksa ténjoan</string> + <!-- Content description (not visible, for screen readers etc.) for review quality check star rating. First parameter is the number of stars (1-5) representing the rating. --> + <string name="review_quality_check_star_rating_content_description">%1$s tina 5 béntang</string> + <!-- Text for minimize button from highlights card. When clicked the highlights card should reduce its size. --> + <string name="review_quality_check_highlights_show_less">Témbongkeun leuwih saeutik</string> + <!-- Text for maximize button from highlights card. When clicked the highlights card should expand to its full size. --> + <string name="review_quality_check_highlights_show_more">Pidangkeu leuwih réa</string> + <!-- Text for highlights card quality category header. Reviews shown under this header should refer the product's quality. --> + <string name="review_quality_check_highlights_type_quality">Kualitas</string> + <!-- Text for highlights card price category header. Reviews shown under this header should refer the product's price. --> + <string name="review_quality_check_highlights_type_price">Harga</string> + <!-- Text for highlights card shipping category header. Reviews shown under this header should refer the product's shipping. --> + <string name="review_quality_check_highlights_type_shipping">Pangiriman</string> + <!-- Text for highlights card packaging and appearance category header. Reviews shown under this header should refer the product's packaging and appearance. --> + <string name="review_quality_check_highlights_type_packaging_appearance">Bungkusan jeung dedegan</string> + <!-- Text for highlights card competitiveness category header. Reviews shown under this header should refer the product's competitiveness. --> + <string name="review_quality_check_highlights_type_competitiveness">Daya saing</string> + <!-- Text that is surrounded by quotes. The parameter is the actual text that is in quotes. An example of that text could be: Excellent craftsmanship, and that is displayed as “Excellent craftsmanship”. The text comes from a buyer's review that the feature is highlighting" --> + <string name="surrounded_with_quotes">"%s"</string> + <!-- Accessibility services actions labels. These will be appended to accessibility actions like "Double tap to.." but not by or applications but by services like Talkback. --> <!-- Action label for elements that can be collapsed if interacting with them. Talkback will append this to say "Double tap to collapse". --> <string name="a11y_action_label_collapse">tilep</string> + <!-- Current state for elements that can be collapsed if interacting with them. Talkback will dictate this after a state change. --> + <string name="a11y_state_label_collapsed">tilep</string> <!-- Action label for elements that can be expanded if interacting with them. Talkback will append this to say "Double tap to expand". --> <string name="a11y_action_label_expand">batek</string> + <!-- Current state for elements that can be expanded if interacting with them. Talkback will dictate this after a state change. --> + <string name="a11y_state_label_expanded">batek</string> <!-- Action label for links to a website containing documentation about a wallpaper collection. Talkback will append this to say "Double tap to open link to learn more about this collection". --> <string name="a11y_action_label_wallpaper_collection_learn_more">buka tutumbu pikeun leuwih teleb ngeunaan ieu koléksi</string> <!-- Action label for links that point to an article. Talkback will append this to say "Double tap to read the article". --> @@ -2178,9 +2409,245 @@ <!-- Action label for links to the Firefox Pocket website. Talkback will append this to say "Double tap to open link to learn more". --> <string name="a11y_action_label_pocket_learn_more">buka tutumbu pikeun ngalenyepan</string> + <!-- Content description for headings announced by accessibility service. The first parameter is the text of the heading. Talkback will announce the first parameter and then speak the word "Heading" indicating to the user that this text is a heading for a section. --> + <string name="a11y_heading">%s, Judul</string> + <!-- Title for dialog displayed when trying to access links present in a text. --> + <string name="a11y_links_title">Tumbu</string> + <!-- Additional content description for text bodies that contain urls. --> + <string name="a11y_links_available">Tumbu sadia</string> + <!-- Translations feature--> + <!-- Translation request dialog --> + <!-- Title for the translation dialog that allows a user to translate the webpage. --> + <string name="translations_bottom_sheet_title">Tarjamahkeun kaca ieu?</string> + <!-- Title for the translation dialog after a translation was completed successfully. + The first parameter is the name of the language that the page was translated from, for example, "French". + The second parameter is the name of the language that the page was translated to, for example, "English". --> + <string name="translations_bottom_sheet_title_translation_completed">Kaca ditarjamahkeun tina %1$s ka %2$s</string> + <!-- Title for the translation dialog that allows a user to translate the webpage when a user uses the translation feature the first time. The first parameter is the name of the application, for example, "Fenix". --> + <string name="translations_bottom_sheet_title_first_time">Coba tarjamahan pribadi dina %1$s</string> + + + <!-- Additional information on the translation dialog that appears when a user uses the translation feature the first time. The first parameter is clickable text with a link, for example, "Learn more". --> + <string name="translations_bottom_sheet_info_message">Pikeun privasi anjeun, tarjamahan moal kungsi ninggalkeun alat anjeun. Basa anyar jeung panghadéan sakeudeung deui datang! %1$s</string> + <!-- Text that links to additional information about the Firefox translations feature. --> + <string name="translations_bottom_sheet_info_message_learn_more">Lenyepan</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog. Usually the translate from language selected will be the same as the page language. --> + <string name="translations_bottom_sheet_translate_from">Tarjamahkeun tina</string> + <!-- Label for the dropdown to select which language to translate to on the translations dialog. Usually the translate to language selected will be the user's preferred language. --> + <string name="translations_bottom_sheet_translate_to">Tarjamahkeun kana</string> + <!-- Label for the dropdown to select which language to translate from on the translations dialog when the page language is not supported. This selection is to allow the user to select another language, in case we automatically detected the page language incorrectly. --> + <string name="translations_bottom_sheet_translate_from_unsupported_language">Cobaan basa sumber séjén</string> + <!-- Button text on the translations dialog to dismiss the dialog and return to the browser. --> + <string name="translations_bottom_sheet_negative_button">Moal waka</string> + <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> + <string name="translations_bottom_sheet_negative_button_restore">Témbongkeun aslina</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Kaca asli teu ditarjamahkeun dimuat</string> + <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> + <string name="translations_bottom_sheet_negative_button_error">Anggeus</string> + <!-- Button text on the translations dialog to begin a translation of the website. --> + <string name="translations_bottom_sheet_positive_button">Tarjamahkeun</string> + <!-- Button text on the translations dialog when a translation error appears. --> + <string name="translations_bottom_sheet_positive_button_error">Pecakan deui</string> + <!-- Inactive button text on the translations dialog that indicates a translation is currently in progress. This button will be accompanied by a loading icon. --> + <string name="translations_bottom_sheet_translating_in_progress">Narjamahkeun</string> + <!-- Button content description (not visible, for screen readers etc.) for the translations dialog translate button that indicates a translation is currently in progress. --> + <string name="translations_bottom_sheet_translating_in_progress_content_description">Narjamahkeun keur Dipigawé</string> + <!-- Default dropdown option when initially selecting a language from the translations dialog language selection dropdown. --> + <string name="translations_bottom_sheet_default_dropdown_selection">Pilih basa</string> + <!-- The title of the warning card informs the user that a translation could not be completed. --> + <string name="translation_error_could_not_translate_warning_text">Aya masalah narjamahkeun. Pék cobaan deui.</string> + <!-- The title of the warning card informs the user that the list of languages cannot be loaded. --> + <string name="translation_error_could_not_load_languages_warning_text">Teu bisa ngamuat basa. Pariksa sambungan internét anjeun sarta cobaan deui.</string> + <!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. --> + <string name="translation_error_language_not_supported_warning_text">Hampura, urang acan ngadukung %1$s.</string> + <!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. --> + <string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Lenyepan</string> + <!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. --> + <string name="translation_in_progress_snackbar">Narjamahkeun…</string> + <!-- Title for the data saving mode warning dialog used in the translation request dialog. + This dialog will be presented when the user attempts to perform + a translation without the necessary language files downloaded first when Android's data saver mode is enabled and the user is not using WiFi. + The first parameter is the size in kilobytes or megabytes of the language file. --> + <string name="translations_download_language_file_dialog_title">Unduh basa dina modeu irit data (%1$s)?</string> + + + <!-- Translations options dialog --> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Pilihan Tarjamahan</string> + <!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. --> + <string name="translation_option_bottom_sheet_title_heading">Pilihan tarjamahan</string> + <!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. --> + <string name="translation_option_bottom_sheet_always_translate">Salawasna tawarkeun narjamahkeun</string> + <!-- Toggle switch label that allows a user to set if they would like a given language to automatically translate or not. The first parameter is the language name, for example, "Spanish". --> + <string name="translation_option_bottom_sheet_always_translate_in_language">Salawasna tarjamahkeun %1$s</string> + <!-- Toggle switch label that allows a user to set if they would like to never be offered a translation of the given language. The first parameter is the language name, for example, "Spanish". --> + <string name="translation_option_bottom_sheet_never_translate_in_language">Ulah narjamahkeun %1$s deui</string> + <!-- Toggle switch label that allows a user to set the setting if they would like the browser to never translate the site the user is currently visiting. --> + <string name="translation_option_bottom_sheet_never_translate_site">Ulah narjamahkeun deui situs ieu</string> + <!-- Toggle switch description that will appear under the "Never translate these sites" settings toggle switch to provide more information on how this setting interacts with other settings. --> + <string name="translation_option_bottom_sheet_switch_never_translate_site_description">Timpah sakabéh setelan séjén</string> + <!-- Toggle switch description that will appear under the "Never translate" and "Always translate" toggle switch settings to provide more information on how these settings interacts with other settings. --> + <string name="translation_option_bottom_sheet_switch_description">Timpah tawaran pikeun narjamahkeun </string> + <!-- Button text for the button that will take the user to the translation settings dialog. --> + <string name="translation_option_bottom_sheet_translation_settings">Setélan tarjamahan</string> + <!-- Button text for the button that will take the user to a website to learn more about how translations works in the given app. The first parameter is the name of the application, for example, "Fenix". --> + <string name="translation_option_bottom_sheet_about_translations">Ngeunaan tarjamahan dina %1$s</string> + <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> + <string name="translation_option_bottom_sheet_close_content_description">Tutup lambaran Tarjamahan</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Sababaraha setélan samentara teu nyampak.</string> + + <!-- Translation settings dialog --> + <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> + <string name="translation_settings_toolbar_title">Tarjamah</string> + <!-- Toggle switch label that indicates that the browser should signal or indicate when a translation is possible for any page. --> + <string name="translation_settings_offer_to_translate">Tawarkeun pikeun narjamahkeun sabot mungkin</string> + <!-- Toggle switch label that indicates that downloading files required for translating is permitted when using data saver mode in Android. --> + <string name="translation_settings_always_download">Salawasna unduh basa dina modeu irit data</string> + <!-- Section header text that begins the section of a list of different options the user may select to adjust their translation preferences. --> + <string name="translation_settings_translation_preference">Préférénsi tarjamahan</string> + <!-- Button text for the button that will take the user to the automatic translations settings dialog. On the automatic translations settings dialog, the user can set if translations should occur automatically for a given language. --> + <string name="translation_settings_automatic_translation">Tarjamahan otomatis</string> + <!-- Button text for the button that will take the user to the never translate these sites dialog. On the never translate these sites dialog, the user can set if translations should never occur on certain websites. --> + <string name="translation_settings_automatic_never_translate_sites">Ulah narjamahkeun situs-situs ieu</string> + <!-- Button text for the button that will take the user to the download languages dialog. On the download languages dialog, the user can manage which languages they would like to download for translations. --> + <string name="translation_settings_download_language">Undeur basa-basa</string> + + <!-- Automatic translation preference screen --> + <!-- Title of the automatic translation preference screen that will appear on the toolbar.--> + <string name="automatic_translation_toolbar_title_preference">Tarjamahan otomatis</string> + + <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> + <string name="automatic_translation_header_preference">Pilih basa pikeun ngatur préférénsi "salawasna tarjamahkeun" jeung "ulah pernah narjamahkeun".</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Teu bisa ngamuat basa. Mangga pariksa engké deui.</string> + + <!-- Preference option for always translate. Radio button title text. --> + <string name="automatic_translation_option_always_translate_title_preference">Salawasna tarjamahkeun</string> + <!-- Preference option for never translate. Radio button title text.--> + <string name="automatic_translation_option_never_translate_title_preference">Ulah narjamahkeun deui</string> + + <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. + The first parameter is web site url (for example:"wikipedia.com") --> + <string name="never_translate_site_item_list_content_description_preference">Piceun %1$s</string> + <!-- The Delete site dialogue title will appear when the user clicks on a list item. + The first parameter is web site url (for example:"wikipedia.com") --> + <string name="never_translate_site_dialog_title_preference">Pupus %1$s?</string> + <!-- The Delete site dialogue positive button will appear when the user clicks on a list item. The site will be deleted. --> + <string name="never_translate_site_dialog_confirm_delete_preference">Pupus</string> + <!-- The Delete site dialogue negative button will appear when the user clicks on a list item. The dialog will be dismissed. --> + <string name="never_translate_site_dialog_cancel_preference">Bolay</string> + + <!-- Download languages preference screen --> + <!-- Title of the download languages preference screen toolbar.--> + <string name="download_languages_toolbar_title_preference">Undeur Basa-basa</string> + <!-- Clickable text from the screen header that links to a website. --> + <string name="download_languages_header_learn_more_preference">Lenyepan</string> + <!-- The subhead of the download language preference screen will appear above the pivot language. --> + <string name="download_languages_available_languages_preference">Basa nu sadia</string> + <!-- Text that will appear beside a core or pivot language package name to show that the language is necessary for the translation feature to function. --> + <string name="download_languages_default_system_language_require_preference">diperlukeun</string> + <!-- A text for download language preference item. + The first parameter is the language name, for example, "Spanish". + The second parameter is the language file size, for example, "(3.91 KB)" or, if the language package name is a pivot language, "(required)". --> + <string name="download_languages_language_item_preference">%1$s (%2$s)</string> + + <!-- Button text on the dialog used by the translations feature to confirm deleting a language. --> + <string name="delete_language_file_dialog_positive_button_text">Pupus</string> + <!-- Button text on the dialog used by the translations feature to cancel deleting a language. --> + <string name="delete_language_file_dialog_negative_button_text">Bolay</string> + + <!-- Title for the data saving mode warning dialog used by the translations feature. + This dialog will be presented when the user attempts to download a language or perform + a translation without the necessary language files downloaded first when Android's data saver mode is enabled and the user is not using WiFi. + The first parameter is the size in kilobytes or megabytes of the language file.--> + <string name="download_language_file_dialog_title">Unduh sabot dina modeu irit data (%1$s)?</string> + <!-- Checkbox label text on the data saving mode warning dialog used by the translations feature. This checkbox allows users to ignore the data usage warnings. --> + <string name="download_language_file_dialog_checkbox_text">Salawasna unduh dina modeu irit data</string> + <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file. --> + <string name="download_language_file_dialog_positive_button_text">Undeur</string> + <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to confirm they wish to continue and download the language file and perform a translation. --> + <string name="download_language_file_dialog_positive_button_text_all_languages">Undeur jeung tarjamahkeun</string> + <!-- Button text on the data saving mode warning dialog used by the translations feature to allow users to cancel the action and not perform a download of the language file. --> + <string name="download_language_file_dialog_negative_button_text">Bolay</string> + + <!-- Debug drawer --> + <!-- The user-facing title of the Debug Drawer feature. --> + <string name="debug_drawer_title">Parabot Debug</string> + <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> + <string name="debug_drawer_back_button_content_description">Mundur</string> + + <!-- Debug drawer tabs tools --> + <!-- The title of the Tab Tools feature in the Debug Drawer. --> + <string name="debug_drawer_tab_tools_title">Pakakas Tab</string> + <!-- The title of the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_title">Jumlah tab</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktip</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktip</string> + <!-- The inactive tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_inactive">Teu aktif</string> + <!-- The private tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_private">Salindungan</string> + <!-- The total tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_total">Jumlah</string> + <!-- The title of the tab creation tool section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_title">Alat nyieun tab</string> + <!-- The label of the text field in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Tab kuantitas pikeun nyieun</string> + <!-- The button text to add tabs to the active tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Tambahkeun kana tab aktip</string> + <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_inactive">Tambahkeun kana tab teu aktip</string> + <!-- The button text to add tabs to the private tab group in the tab creation tool. --> + <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Tambahkeun kana tab nyamuni</string> + <!-- Micro survey --> - </resources> + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Tuluykeun</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Lengkepan survéy ieu</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Wawar Privasi</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label">Kirimkeun</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Tutup</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation">Hatur nuhun pikeun jawaban anjeun!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Puas pisan</string> + + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Sugema</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Nétral</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Teu sugema</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Kacida teu sugema</string> + + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Buka survéy</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Tutup Survéy</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Tutup</string> + + <!-- Debug drawer logins --> + <!-- The title of the Logins feature in the Debug Drawer. --> + <string name="debug_drawer_logins_title">Asup log</string> + <!-- The title of the logins section in the Logins feature, where the parameter will be the site domain --> + <string name="debug_drawer_logins_current_domain_label">Domain ayeuna: %s</string> + <!-- The label for a button to add a new fake login for the current domain in the Logins feature. --> + <string name="debug_drawer_logins_add_login_button">Tambahan asup log palsu pikeun domain ieu</string> + <!-- Content description for delete button where parameter will be the username of the login --> + <string name="debug_drawer_logins_delete_login_button_content_description">Pupus asup log maké ngaran pamaké %s</string> +</resources> diff --git a/mobile/android/fenix/app/src/main/res/values-sv-rSE/strings.xml b/mobile/android/fenix/app/src/main/res/values-sv-rSE/strings.xml index d8659fb4d9..d8339db68e 100644 --- a/mobile/android/fenix/app/src/main/res/values-sv-rSE/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-sv-rSE/strings.xml @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tillägg</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Tillägg</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Hantera tillägg</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Upptäck fler tillägg</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Kontoinformation</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">Öppna i vanlig flik</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Lägg till på startsidan</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Lägg till på startskärmen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Installera</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -231,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Översätt sida</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Spara i samling…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Spara i samling</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Dela</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Dela…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Öppna i %1$s</string> @@ -289,6 +299,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Spara</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bokmärk denna sida</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Redigera bokmärke</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Spara som PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Aktivera Läsvyn</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Stäng av Läsvyn</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Översätt sida…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Översatt till %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Skriv ut…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Inga tillägg här</string> @@ -386,8 +414,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox sekretessmeddelande</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Läs mer i vårt sekretessmeddelande</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Vi älskar att hålla dig säker</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">Språk</string> <!-- Preference for translation --> - <string name="preferences_translation">Översättning</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Översättning</string> + <!-- Preference for translations --> + <string name="preferences_translations">Översättningar</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Dataalternativ</string> <!-- Preference for data collection --> @@ -670,10 +698,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Krävs</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Valfri</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Läsa och ändra webbplatsdata</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Ta bort webbplats</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tillåt för alla webbplatser</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -800,8 +824,6 @@ <string name="preferences_sync_history">Historik</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Bokmärken</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Inloggningar</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Lösenord</string> <!-- Preference for syncing tabs --> @@ -829,8 +851,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s på %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditkort</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Betalningsmetoder</string> <!-- Preference for syncing addresses --> @@ -846,6 +866,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Flik från %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s stängde %2$d flikar</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Visa nyligen stängda flikar</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Undantag</string> @@ -1781,12 +1809,8 @@ <string name="add_to_homescreen_description_2">Du kan enkelt lägga till den här webbplatsen på enhetens startskärm för att få direktåtkomst och surfa snabbare med en appliknande upplevelse.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Inloggningar och lösenord</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Lösenord</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Spara inloggningar och lösenord</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Spara lösenord</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Fråga för att spara</string> @@ -1801,47 +1825,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Fyll i användarnamn och lösenord i andra appar på din enhet.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lägg till inloggning</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Lägg till lösenord</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkronisera inloggningar</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Synkronisera lösenord</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Synkronisera inloggningar mellan enheter</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Synkronisera lösenord mellan enheter</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Sparade inloggningar</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Sparade lösenord</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">De inloggningar som du sparar eller synkroniserar till %s kommer att dyka upp här.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Lösenorden du sparar eller synkroniserar till %s kommer att listas här. Alla lösenord du sparar är krypterade. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Läs mer om Sync.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Läs mer om synkronisering</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Undantag</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Inloggningar och lösenord som inte sparas visas här.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s kommer inte att spara lösenord för webbplatser som listas här.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Inloggningar och lösenord sparas inte för dessa webbplatser.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s kommer inte att spara lösenord för dessa webbplatser.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Ta bort alla undantag</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Sök inloggningar</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Sök efter lösenord</string> <!-- The header for the site that a login is for --> @@ -1870,17 +1875,11 @@ <string name="saved_login_reveal_password">Visa lösenord</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Dölj lösenord</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås upp för att se dina sparade inloggningar</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Lås upp för att se dina sparade lösenord</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Säkra dina inloggningar och lösenord</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Säkra dina sparade lösenord</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Konfigurera enhetens låsmönster, PIN eller lösenord för att skydda dina sparade inloggningar och lösenord från åtkomst om någon annan har din enhet.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Konfigurera ett enhetslåsmönster, PIN-kod eller lösenord för att skydda dina sparade lösenord från åtkomst om någon annan använder din enhet.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Senare</string> @@ -1897,8 +1896,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Namn (A-Ö)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Senast använd</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sortera inloggningsmenyn</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menyn sortera lösenord</string> @@ -1908,41 +1905,27 @@ <string name="preferences_autofill">Autofyll</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresser</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kreditkort</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Betalningsmetoder</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Spara och fyll i kreditkort automatiskt</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Spara och fyll i betalningsmetoder</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Data är krypterad</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s krypterar alla betalningsmetoder som du sparar</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Synkronisera kort mellan enheter</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Synkronisera kort</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Lägg till kreditkort</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Lägg till kort</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Hantera sparade kreditkort</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Hantera kort</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Lägg till adress</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Hantera adresser</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Spara och fyll i adresser automatiskt</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Spara och fyll i adresser</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Inkludera information som nummer, e-post och leveransadresser</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Inkluderar telefonnummer och e-postadresser</string> @@ -1966,8 +1949,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Ta bort kort</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Är du säker på att du vill ta bort det här kreditkortet?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Ta bort kort?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Ta bort</string> @@ -1981,24 +1962,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Sparade kreditkort</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ange ett giltigt kreditkortsnummer</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Ange ett giltigt kortnummer</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Fyll i det här fältet</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Lägg till ett namn</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Lås upp för att se dina sparade kreditkort</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Säkra dina kreditkort</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Säkra dina sparade betalningsmetoder</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Konfigurera enhetens låsmönster, PIN eller lösenord för att skydda dina sparade kreditkort från åtkomst om någon annan har din enhet.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Konfigurera ett enhetslåsmönster, PIN-kod eller lösenord för att skydda dina sparade betalningsmetoder från att användas om någon annan har din enhet.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Konfigurera nu</string> @@ -2007,9 +1979,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Lås upp din enhet</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lås upp för att använda lagrad kreditkortsinformation</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Lås upp för att använda sparade betalningsmetoder</string> <!-- Title of the "Add address" screen --> @@ -2018,12 +1987,6 @@ <string name="addresses_edit_address">Redigera adress</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Hantera adresser</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Förnamn</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Mellannamn</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Efternamn</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Namn</string> <!-- The header for the street address of an address --> @@ -2050,8 +2013,6 @@ <string name="addressess_delete_address_button">Ta bort adress</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Är du säker på att du vill ta bort den här adressen?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Ta bort den här adressen?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Ta bort</string> @@ -2150,49 +2111,29 @@ <string name="login_menu_delete_button">Ta bort</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Redigera</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Är du säker på att du vill ta bort den här inloggningen?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Är du säker på att du vill ta bort det här lösenordet?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Ta bort</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Avbryt</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Inloggningsalternativ</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Lösenordsalternativ</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbara textfältet för inloggningens webbadress.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Det redigerbara textfältet för webbplatsadressen.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbara textfältet för inloggningens användarnamn.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Det redigerbara textfältet för användarnamnet.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Det redigerbara textfältet för inloggningens lösenord.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Det redigerbara textfältet för lösenordet.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Spara ändringar för inloggning.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Spara ändringar.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Redigera</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Redigera lösenord</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lägg till ny inloggning</string> <!-- The page title for adding new password. --> <string name="add_login_2">Lägg till lösenord</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Lösenord krävs</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Ange ett lösenord</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Användarnamn krävs</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Ange ett användarnamn</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Värdnamn krävs</string> @@ -2600,6 +2541,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Stäng översättningsarket</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Vissa inställningar är inte tillgängliga för tillfället.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Översättningar</string> @@ -2622,6 +2566,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Välj ett språk för att hantera inställningarna för "översätt alltid" och "översätt aldrig".</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Det gick inte att ladda språk. Kom tillbaka senare.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Erbjuda att översätta (standard)</string> @@ -2644,6 +2591,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Ta bort %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Det gick inte att ladda webbplatser. Kom tillbaka senare.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Tog bort %1$s?</string> @@ -2721,13 +2670,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navigera bakåt</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Öppna felsökningslådan</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Flikverktyg</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Antal flikar</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktiv</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktiv</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktiv</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inaktiv</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2738,6 +2692,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Verktyg för att skapa flikar</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Antal flikar att skapa</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Textfältet är tomt</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Ange endast positiva heltal</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Ange ett nummer större än noll</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Översteg det maximala antalet flikar (%1$s) som kan genereras i en operation</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Lägg till i aktiva flikar</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2754,11 +2718,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Sekretessmeddelande</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Skicka in</string> + <string name="micro_survey_submit_button_label">Skicka in</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Stäng</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Stäng</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Tack för din feedback!</string> + <string name="micro_survey_feedback_confirmation">Tack för din feedback!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Väldigt nöjd</string> <!-- Option for likert scale --> @@ -2770,6 +2734,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Väldigt missnöjd</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Öppna undersökning</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Stäng undersökning</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Stäng</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Inloggningar</string> diff --git a/mobile/android/fenix/app/src/main/res/values-tg/strings.xml b/mobile/android/fenix/app/src/main/res/values-tg/strings.xml index 35aaf65dd9..8e3c6c45a9 100644 --- a/mobile/android/fenix/app/src/main/res/values-tg/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-tg/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" xmlns:moz="http://mozac.org/tools"> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> - <string name="app_name_private_5">%s-и хусусӣ</string> + <string name="app_name_private_5">Хусусӣ %s</string> <!-- App name for private browsing mode. The first parameter is the name of the app defined in app_name (for example: Fenix)--> <string name="app_name_private_4">%s (Хусусӣ)</string> @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Ҷузъҳои иловагӣ</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Васеъшавиҳо</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Идоракунии васеъшавиҳо</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Кашф кардани васеъшавиҳои бештар</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Маълумот дар бораи ҳисоби корбар</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -221,6 +225,8 @@ <string name="browser_menu_open_in_regular_tab">Кушодан дар варақаи одӣ</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Илова кардан ба экрани асосӣ</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Илова кардан ба экрани асосӣ…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Насб кардан</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -232,9 +238,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Тарҷума кардани саҳифа</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Нигоҳ доштан дар маҷмуа…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Нигоҳ доштан дар маҷмуа</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Мубодила кардан</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Мубодила…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Кушодан дар %1$s</string> @@ -288,6 +298,25 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Нигоҳ доштан</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Гузоштани хатбарак барои ин саҳифа</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Таҳрир кардани хатбарак</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Нигоҳ доштан ҳамчун PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Фаъол кардани намоиши хонанда</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Хомӯш кардани намоиши хонанда</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Тарҷума кардани саҳифа…</string> + + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Ба забони %1$s тарҷума шуд</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Чоп кардан…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Дар ин ҷой ягон васеъшавӣ нест</string> @@ -384,8 +413,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Огоҳномаи махфияти «Firefox»</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Маълумоти бештар дар «Огоҳномаи махфияти мо»</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Мо нигоҳдории бехатарии шуморо дӯст медорем</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -594,7 +621,9 @@ <!-- Preference for language --> <string name="preferences_language">Забон</string> <!-- Preference for translation --> - <string name="preferences_translation">Тарҷума</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Тарҷума</string> + <!-- Preference for translations --> + <string name="preferences_translations">Тарҷумаҳо</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Интихоби маълумот</string> <!-- Preference for data collection --> @@ -665,10 +694,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Ҳатмӣ аст</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Интихобӣ аст</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Хониш ва тағйироти маълумоти сомона</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Нест кардани сомона</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Иҷозат барои ҳамаи сомонаҳо</string> @@ -797,8 +822,6 @@ <string name="preferences_sync_history">Таърих</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Хатбаракҳо</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳо</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Ниҳонвожаҳо</string> <!-- Preference for syncing tabs --> @@ -826,8 +849,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s дар %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Кортҳои кредитӣ</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Тарзҳои пардохт</string> <!-- Preference for syncing addresses --> @@ -843,6 +864,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Варақа аз %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d варақаи пӯшидашудаи «%1$s»</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Дидани варақаҳои ба наздикӣ пӯшидашуда</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Истисноҳо</string> @@ -1779,12 +1808,8 @@ <string name="add_to_homescreen_description_2">Шумо метавонед ин сомонаро ба экрани асосии дастгоҳи худ ба осонӣ илова кунед, то ки ба он дастрасии фаврӣ дошта бошед ва бо таҷрибаи ба барнома монанд зудтар паймоиш кунед.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳо ва ниҳонвожаҳо</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Ниҳонвожаҳо</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Нигоҳ доштани воридшавиҳо ва ниҳонвожаҳо</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Нигоҳ доштани ниҳонвожаҳо</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Бо пешниҳоди нигоҳдорӣ</string> @@ -1799,46 +1824,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Номи корбарон ва ниҳонвожаҳоро дар барномаҳои дигари дастгоҳи худ пур кунед.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Илова кардани воридшавӣ</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Илова кардани ниҳонвожа</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳои ҳамоҳангшуда</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Ҳамоҳанг кардани ниҳонвожаҳо</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Ҳамоҳанг кардани воридшавиҳо байни дастгоҳҳо</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Ҳамоҳанг кардани ниҳонвожаҳо байни дастгоҳҳо</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳои нигоҳдошташуда</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Ниҳонвожаҳои нигоҳдошташуда</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳое, ки шумо дар %s нигоҳ медоред ё ҳамоҳанг мекунед, дар ин ҷо нишон дода мешаванд.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Ниҳонвожаҳоеро, ки шумо нигоҳ медоред ё бо «%s» ҳамоҳанг месозед, дар ин рӯйхат нишон дода мешаванд. Ҳамаи ниҳонвожаҳое, ки шумо нигоҳ медоред, рамзгузорӣ карда мешаванд.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Маълумоти бештар дар бораи ҳамоҳангсозӣ</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Маълумоти бештар дар бораи ҳамоҳангсозӣ</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Истисноҳо</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳо ва ниҳонвожаҳое, ки нигоҳ дошта нашудаанд, дар ин ҷо нишон дошта мешаванд.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">«%s» барои сомонаҳое, ки дар ин рӯйхат нишон дода шудаанд, ниҳонвожаҳоро нигоҳ намедорад.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳо ва ниҳонвожаҳо барои сомонаҳои зерин нигоҳ дошта намешаванд.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">«%s» барои сомонаҳои зерин ниҳонвожаҳоро нигоҳ намедорад.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Нест кардани ҳамаи истисноҳо</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Ҷустуҷӯи воридшавиҳо</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Ҷустуҷӯи ниҳонвожаҳо</string> <!-- The header for the site that a login is for --> @@ -1867,17 +1873,11 @@ <string name="saved_login_reveal_password">Нишон додани ниҳонвожа</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Пинҳон кардани ниҳонвожа</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Барои дидани воридшавиҳои нигоҳдошташуда, қулфро кушоед</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Барои дидани ниҳонвожаҳои нигоҳдошташуда, қулфро кушоед</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Воридшавиҳо ва ниҳонвожаҳои худро муҳофизат намоед</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Ниҳонвожаҳои нигоҳдоштаро муҳофизат намоед</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Барои муҳофизат кардани воридшавиҳо ва ниҳонвожаҳои худ аз дастрасии озод, агар касе дигар аз дастгоҳи шумо истифода барад, шаклвораи қулфи экран, рамзи PIN ё ниҳонвожаеро барои дастгоҳи худ танзим намоед.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Барои муҳофизат кардани ниҳонвожаҳои нигоҳдошташудаи худ аз дастрасии озод, агар касе дигар аз дастгоҳи шумо истифода барад, шаклвораи қулфи экран, рамзи PIN ё ниҳонвожаеро барои дастгоҳи худ танзим намоед.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Дертар</string> @@ -1895,9 +1895,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Истифодашудаи охирин</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Мураттаб кардани менюи воридшавиҳо</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Менюи мураттабсозии ниҳонвожаҳо</string> @@ -1906,41 +1903,27 @@ <string name="preferences_autofill">Пуркунии худкор</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Нишониҳо</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Кортҳои кредитӣ</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Тарзҳои пардохт</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Нигоҳ доштан ва ба таври худкор пур кардани кортҳо</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Нигоҳ доштан ва пур кардани тарзҳои пардохт</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Маълумот рамзгузорӣ карда шуд</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">«%s» ҳамаи тарзҳои пардохтеро, ки шумо нигоҳ медоред, рамзгузорӣ мекунад</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Ҳамоҳанг кардани кортҳо байни дастгоҳҳо</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Ҳамоҳанг кардани кортҳо</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Илова кардани корти кредитӣ</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Илова кардани корт</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Идора кардани кортҳои нигоҳдошташуда</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Идоракунии кортҳо</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Илова кардани нишонӣ</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Идоракунии нишониҳо</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Нигоҳ доштан ва ба таври худкор пур кардани нишониҳо</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Нигоҳ доштан ва пур кардани нишониҳо</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Илова кардани маълумот монанди рақамҳо, нишониҳои почтаи электронӣ ва бурдарасонӣ</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Рақамҳои телефон ва нишониҳои почтаи электрониро дар бар мегирад</string> @@ -1965,8 +1948,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Нест кардани корт</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Шумо мутмаин ҳастед, ки мехоҳед ин корти кредитиро нест намоед?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Кортро нест мекунед?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Нест кардан</string> @@ -1980,24 +1961,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Кортҳои нигоҳдошташуда</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Лутфан, рақами корти кредитии дурустро ворид намоед</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Рақами корти дурустро ворид намоед</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Лутфан, ин майдонро пур кунед</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Номеро ворид намоед</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Барои дидани кортҳои нигоҳдошташуда, қулфро кушоед</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Кортҳои кредитии худро муҳофизат кунед</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Тарзҳои пардохти нигоҳдоштаи худро муҳофизат намоед</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Барои муҳофизат кардани кортҳои кредитии нигоҳдошташудаи худ аз дастрасии озод, агар касе дигар аз дастгоҳи шумо истифода барад, шаклвораи қулфи экран, рамзи PIN ё ниҳонвожаеро барои дастгоҳи худ танзим намоед.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Барои муҳофизат кардани тарзҳои пардохти нигоҳдошташудаи худ аз дастрасии озод, агар касе дигар аз дастгоҳи шумо истифода барад, шаклвораи қулфи экран, рамзи PIN ё ниҳонвожаеро барои дастгоҳи худ танзим намоед.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Ҳозир насб кунед</string> @@ -2005,8 +1977,6 @@ <string name="credit_cards_warning_dialog_later">Дертар</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Қулфи дастгоҳи худро кушоед</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Барои истифодаи маълумоти кортҳои кредитии нигоҳдошташуда, қулфро кушоед</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Барои истифодаи тарзҳои пардохти нигоҳдоштаи худ, қулфро кушоед</string> @@ -2016,12 +1986,6 @@ <string name="addresses_edit_address">Таҳрир кардани нишонӣ</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Идоракунии нишониҳо</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ном</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Номи падар</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Насаб</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Ном</string> <!-- The header for the street address of an address --> @@ -2048,8 +2012,6 @@ <string name="addressess_delete_address_button">Нест кардани нишонӣ</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Шумо мутмаин ҳастед, ки мехоҳед ин нишониро нест намоед?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Ин нишониро нест мекунед?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Нест кардан</string> @@ -2146,50 +2108,30 @@ <string name="login_menu_delete_button">Нест кардан</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Таҳрир кардан</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Шумо мутмаин ҳастед, ки мехоҳед ин воридшавиро нест намоед?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Шумо мутмаин ҳастед, ки мехоҳед ин ниҳонвожаро нест намоед?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Нест кардан</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Бекор кардан</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Имконоти воридшавӣ</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Инконоти ниҳонвожа</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Майдони матни таҳриршаванда барои нишонии сомонаи воридшавӣ.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Майдони матни таҳриршаванда барои нишонии сомона.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Майдони матни таҳриршаванда барои номи корбарии воридшавӣ.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Майдони матни таҳриршаванда барои номи корбар.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Майдони матни таҳриршаванда барои ниҳонвожаи воридшавӣ.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Майдони матни таҳриршаванда барои ниҳонвожа.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Нигоҳ доштани тағйирот барои воридшавӣ</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Тағийротро нигоҳ медорад.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Таҳрир кардан</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Таҳрир кардани ниҳонвожа</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Илова кардани воридшавии нав</string> <!-- The page title for adding new password. --> <string name="add_login_2">Илова кардани ниҳонвожа</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Ниҳонвожа лозим аст</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Ниҳонвожаеро ворид намоед</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Номи корбар лозим аст</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Номи корбареро ворид намоед</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Номи сервер лозим аст</string> @@ -2600,6 +2542,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Пӯшидани саҳифаи тарҷума</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Баъзе танзимот муваққатан дастнорасанд.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Тарҷумаҳо</string> @@ -2623,6 +2568,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Барои идоракунии хусусиятҳои «Ҳамеша тарҷума карда шавад» ва «Ҳеҷ вақт тарҷума карда нашавад» забонеро интихоб намоед.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Забонҳоро бор карда натавонист. Лутфан, баъдтар такрор кунед.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Тарҷума пешниҳод карда шавад (Ба таври пешфарз)</string> @@ -2645,6 +2593,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Тоза кардани «%1$s»</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Сомонаҳоро бор карда натавонист. Лутфан, баъдтар такрор кунед.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">«%1$s»-ро нест мекунед?</string> @@ -2722,13 +2672,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Ба қафо гузаштан</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Кушодани менюи таҳиякунандаи ислоҳи хатоҳо</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Абзорҳои варақаҳо</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Шумораи варақаҳо</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Фаъол</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Фаъол</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Фаъол</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Ғайрифаъол</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2739,6 +2694,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Абзори эҷоди варақаҳо</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Шумораи варақаҳое, ки эҷод карда мешаванд</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Майдони матн холӣ аст</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Лутфан, танҳо ададҳои бутуни мусбатро ворид кунед</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Лутфан, рақамеро зиёда аз сифр ворид намоед</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Шумораи ҳадди аксари варақаҳое (%1$s), ки дар як амалиёт эҷод карда мешаванд, зиёд шуд</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Илова кардан ба варақаҳои фаъол</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2755,12 +2720,12 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Огоҳномаи махфият</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Пешниҳод кардан</string> + <string name="micro_survey_submit_button_label">Пешниҳод кардан</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Пӯшидан</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Пӯшидан</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Ташаккур барои изҳори назари шумо!</string> + <string name="micro_survey_feedback_confirmation">Ташаккур барои изҳори назари шумо!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Хеле қаноатманд</string> @@ -2773,6 +2738,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Хеле дарғазаб</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Кушодани саволнома</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Пӯшидани саволнома</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Пӯшидан</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Воридшавиҳо</string> diff --git a/mobile/android/fenix/app/src/main/res/values-tr/strings.xml b/mobile/android/fenix/app/src/main/res/values-tr/strings.xml index 45d931495b..48587d9d04 100644 --- a/mobile/android/fenix/app/src/main/res/values-tr/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-tr/strings.xml @@ -200,6 +200,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Eklentiler</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Uzantılar</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Uzantıları yönet</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Daha fazla uzantı keşfet</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Hesap bilgileri</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -218,6 +222,8 @@ <string name="browser_menu_open_in_regular_tab">Normal sekmede aç</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Ana ekrana ekle</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Ana ekrana ekle…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Yükle</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -229,9 +235,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Sayfayı çevir</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Koleksiyona kaydet…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Koleksiyona kaydet</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Paylaş</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Paylaş…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s ile aç</string> @@ -285,6 +295,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Kaydet</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Sayfayı yer imlerine ekle</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Yer imini düzenle</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF olarak kaydet…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Okuyucu görünümünü aç</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Okuyucu görünümünü kapat</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Sayfayı çevir…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s diline çevrildi</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Yazdır…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Şu anda uzantı yok</string> @@ -382,8 +410,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox gizlilik bildirimi</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Ayrıntıları gizlilik bildirimimizde bulabilirsiniz</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Sizi güvende tutmayı seviyoruz</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -593,7 +619,9 @@ <!-- Preference for language --> <string name="preferences_language">Dil</string> <!-- Preference for translation --> - <string name="preferences_translation">Çeviri</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Çeviri</string> + <!-- Preference for translations --> + <string name="preferences_translations">Çeviriler</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Veri seçenekleri</string> <!-- Preference for data collection --> @@ -667,10 +695,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Gerekli</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">İsteğe bağlı</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Web sitesi verilerini okuma ve değiştirme</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Siteyi sil</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Tüm siteler için izin ver</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -795,8 +819,6 @@ <string name="preferences_sync_history">Geçmiş</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Yer imleri</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesaplar</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Parolalar</string> <!-- Preference for syncing tabs --> @@ -823,8 +845,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s - %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kredi kartları</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Ödeme yöntemleri</string> <!-- Preference for syncing addresses --> @@ -840,6 +860,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s üzerinden gelen sekme</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d %1$s sekmesi kapatıldı </string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Son kapatılan sekmeleri göster</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">İstisnalar</string> @@ -1770,12 +1798,8 @@ <string name="add_to_homescreen_description_2">Bu siteyi cihazınızın ana ekranına ekleyerek ona hızlıca erişebilir, site bir uygulamaymış gibi daha hızlı gezinti yapabilirsiniz.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesaplar ve parolalar</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Parolalar</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Kullanıcı adı ve parolaları kaydet</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Parolaları kaydet</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Kaydetmeyi sor</string> @@ -1790,46 +1814,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Cihazınızdaki diğer uygulamalarda kullanıcı adı ve parolalar doldurulsun.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesap ekle</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Parola ekle</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesapları eşitle</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Parolaları eşitle</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesapları cihazlar arasında eşitle</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Parolaları cihazlar arasında eşitle</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Kayıtlı hesaplar</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Kayıtlı parolalar</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Kaydettiğiniz veya %s ile eşitlediğiniz hesaplar burada görünecektir.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">%s tarayıcısına kaydettiğiniz veya eşitlediğiniz parolalar burada listelenecektir. Kaydettiğiniz tüm parolalar şifrelenir.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Sync hakkında bilgi alın.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Eşitlemeyle ilgili bilgi al</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">İstisnalar</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Kaydedilmeyen hesaplar ve parolalar burada görünecektir.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s, burada listelenen sitelerin parolalarını kaydetmeyecektir.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Bu sitelere ait hesaplar ve parolalar kaydedilmeyecektir.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s bu sitelerin parolalarını kaydetmeyecektir.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Tüm istisnaları sil</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesaplarda ara</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Parolalarda ara</string> <!-- The header for the site that a login is for --> @@ -1858,17 +1863,11 @@ <string name="saved_login_reveal_password">Parolayı göster</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Parolayı gizle</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Kayıtlı hesaplarınızı görmek için kilidi açın</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Kayıtlı parolalarınızı görmek için kilidi açın</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesaplarınızı güvence altına alın</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Kayıtlı parolalarınızı güvence altına alın</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Cihazınız başka birinin eline geçerse kayıtlı hesaplarına erişilmesini önlemek için cihaz kilidi deseni, PIN veya parola ayarlayın.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Cihazınız başka birinin eline geçerse kayıtlı parolalarınıza erişilmesini önlemek için cihaz kilidi deseni, PIN veya parola ayarlayın.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Daha sonra</string> @@ -1886,8 +1885,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Ad (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Son kullanım</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesapları sırala menüsü</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Parolaları sırala menüsü</string> @@ -1897,41 +1894,27 @@ <string name="preferences_autofill">Otomatik doldurma</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Adresler</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kredi kartları</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Ödeme yöntemleri</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kartları kaydedip otomatik doldur</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Ödeme yöntemlerini kaydet ve doldur</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Veriler şifrelenir</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s kaydettiğiniz tüm ödeme yöntemlerini şifreler</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Kartları cihazlar arasında eşitle</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Kartları eşitle</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Kredi kartı ekle</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Kart ekle</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Kayıtlı kartları yönet</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Kartları yönet</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Adres ekle</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Adresleri yönet</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Adresleri kaydedip otomatik doldur</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Adresleri kaydet ve doldur</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Numaralar, e-posta ve gönderim adresleri gibi bilgileri dahil et</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Telefon numaraları ve e-posta adresleri de dahildir</string> @@ -1955,8 +1938,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Kartı sil</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Bu kredi kartını silmek istediğinizden emin misiniz?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Kart silinsin mi?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Sil</string> @@ -1970,24 +1951,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Kayıtlı kartlar</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lütfen geçerli bir kredi kartı numarası girin</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Geçerli bir kart numarası girin</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Lütfen bu alanı doldurun</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Adınızı yazın</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Kayıtlı kartlarınızı görmek için kilidi açın</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Kredi kartlarını güvence altına al</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Kayıtlı ödeme yöntemlerinizi güvence altına alın</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Cihazınız başka birinin eline geçerse kayıtlı kartlarınıza erişilmesini önlemek için cihaz kilidi deseni, PIN veya parola ayarlayın.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Cihazınız başka birinin eline geçerse kayıtlı ödeme yöntemlerinize erişilmesini önlemek için cihaz kilidi deseni, PIN veya parola ayarlayın.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Hemen ayarla</string> @@ -1996,8 +1968,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Cihazınızın kilidini açın</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Depolanan kredi kartı bilgilerini kullanmak için kilidi açın</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Kayıtlı ödeme yöntemlerinizi kullanmak için kilidi açın</string> @@ -2007,12 +1977,6 @@ <string name="addresses_edit_address">Adresi düzenle</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Adresleri yönet</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ad</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">İkinci ad</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Soyadı</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Ad</string> <!-- The header for the street address of an address --> @@ -2039,8 +2003,6 @@ <string name="addressess_delete_address_button">Adresi sil</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Bu adresi silmek istediğinizden emin misiniz?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Bu adres silinsin mi?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Sil</string> @@ -2138,49 +2100,29 @@ <string name="login_menu_delete_button">Sil</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Düzenle</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Bu hesabı silmek istediğinizden emin misiniz?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Bu parolayı silmek istediğinizden emin misiniz?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Sil</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Vazgeç</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesap seçenekleri</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Parola seçenekleri</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesabın web adresi için düzenlenebilir metin alanı.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Web sitesi adresi için düzenlenebilir metin alanı.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesabın kullanıcı adı için düzenlenebilir metin alanı.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Kullanıcı adı için düzenlenebilir metin alanı.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Hesabın parolası için düzenlenebilir metin alanı.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Parola için düzenlenebilir metin alanı.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Değişiklikleri hesaba kaydet.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Değişiklikleri kaydet.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Düzenle</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Parola düzenle</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Yeni hesap ekle</string> <!-- The page title for adding new password. --> <string name="add_login_2">Parola ekle</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Parola gerekli</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Parolayı girin</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Kullanıcı adı gereklidir</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Kullanıcı adını girin</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Sunucu gereklidir</string> @@ -2590,6 +2532,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Çeviriler sayfasını kapat</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Bazı ayarlar geçici olarak kullanılamıyor.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Çeviriler</string> @@ -2614,6 +2559,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">”Her zaman çevir“ ve ”asla çevirme“ tercihlerini yönetmek için bir dil seçin.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Diller yüklenemedi. Lütfen daha sonra yeniden deneyin.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Çevirmeyi öner (varsayılan)</string> @@ -2637,6 +2585,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s sitesini kaldır</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Siteler yüklenemedi. Lütfen daha sonra yeniden deneyin.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">%1$s silinsin mi?</string> @@ -2715,13 +2665,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Geri git</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Hata ayıklama bölmesini aç</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Sekme araçları</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Sekme sayısı</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Aktif</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Aktif</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Aktif</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Pasif</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2732,6 +2687,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Sekme oluşturma aracı</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Oluşturulacak sekme sayısı</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Metin alanı boş</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Lütfen yalnızca pozitif tamsayı girin</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Lütfen sıfırdan büyük bir sayı girin</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Tek bir işlemde oluşturulabilecek maksimum sekme sayısı (%1$s) aşıldı</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Aktif sekmelere ekle</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2748,11 +2713,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Gizlilik Bildirimi</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Gönder</string> + <string name="micro_survey_submit_button_label">Gönder</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Kapat</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Kapat</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Geri bildiriminiz için teşekkürler!</string> + <string name="micro_survey_feedback_confirmation">Geri bildiriminiz için teşekkürler!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Çok memnunum</string> <!-- Option for likert scale --> @@ -2764,6 +2729,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Hiç memnun değilim</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Anketi aç</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Anketi kapat</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Kapat</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Hesaplar</string> diff --git a/mobile/android/fenix/app/src/main/res/values-ug/strings.xml b/mobile/android/fenix/app/src/main/res/values-ug/strings.xml index 08c92ff266..2c820c15c1 100644 --- a/mobile/android/fenix/app/src/main/res/values-ug/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-ug/strings.xml @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">قوشۇلما</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">كېڭەيتمە</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">كېڭەيتىلمە باشقۇرۇش</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">تېخىمۇ كۆپ كېڭەيتمە بايقا</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">ھېسابات ئۇچۇرى</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">ئادەتتىكى بەتكۈچتە ئاچ</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">باش ئېكرانغا قوش</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">باش ئېكرانغا قوش…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">قاچىلاش</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">بەت تەرجىمىسى</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">يىغقۇچقا ساقلا…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">يىغقۇچقا ساقلا</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">ھەمبەھىرلەش</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">ھەمبەھىر…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">%1$s دا ئاچ</string> @@ -281,6 +291,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">ساقلا</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">بۇ بەتنى خەتكۈچكە قوش</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">خەتكۈچ تەھرىر</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">PDF كە ساقلا…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">ئوقۇرمەن كۆرۈنۈشىنى ئاچ</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">ئوقۇرمەن كۆرۈنۈشىنى تاقا</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">بەت تەرجىمىسى…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">%1$s غا تەرجىمە قىلىندى</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">باس…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">بۇ يەردە كېڭەيتمە يوق</string> @@ -374,8 +402,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox شەخسىيەت ئۇقتۇرۇشى</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">شەخسىيەت ئۇقتۇرۇشىنىڭ تەپسىلاتىنى ئوقۇڭ</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">بىخەتەرلىكىڭىزنى ساقلاشنى ياخشى كۆرىمىز</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -584,7 +610,9 @@ <string name="preferences_language">تىل</string> <!-- Preference for translation --> - <string name="preferences_translation">تەرجىمە</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">تەرجىمە</string> + <!-- Preference for translations --> + <string name="preferences_translations">تەرجىمە</string> <!-- Preference for data choices --> <string name="preferences_data_choices">سانلىق مەلۇمات تاللاش</string> <!-- Preference for data collection --> @@ -656,10 +684,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">زۆرۈر</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">تاللاشچان</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">تور بېكەت سانلىق مەلۇماتىنى ئوقۇيدۇ ياكى ئۆزگەرتىدۇ</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">تور بېكەت ئۆچۈر</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">ھەممە تور بېكەتكە يول قويىدۇ</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -786,8 +810,6 @@ <string name="preferences_sync_history">تارىخ</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">خەتكۈچ</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">ئىم</string> <!-- Preference for syncing tabs --> @@ -812,8 +834,6 @@ The first parameter is the application name, the second is the device manufacturer name and the third is the device model. --> <string name="default_device_name_2">%2$s %3$s دىكى %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىناۋەتلىك كارتا</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">چىقىم قىلىش ئۇسۇلى</string> <!-- Preference for syncing addresses --> @@ -829,6 +849,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">%s بەتكۈچى</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s بەتكۈچ تاقالدى: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">يېقىندا تاقالغان بەتكۈچلەرنى كۆرسەت</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">مۇستەسنا</string> @@ -1755,12 +1783,8 @@ <string name="add_to_homescreen_description_2">تېز سۈرئەتتە زىيارەت قىلىش ۋە ئەپكە ئوخشاش زىيارەت تۇيغۇسىغا ئېرىشىش ئۈچۈن، مەزكۇر تور بېكەتنى باش ئېكرانغا ئاسانلا قوشالايسىز.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش ۋە ئىم</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">ئىم</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش ۋە ئىم ساقلا</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">ئىم ساقلا</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">ساقلاشنى سورا</string> @@ -1774,46 +1798,28 @@ <string name="preferences_android_autofill">باشقا ئەپلەردە ئاپتوماتىك تولدۇرىدۇ</string> <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">ئۈسكۈنىڭىزدىكى باشقا ئەپلەردە ئىشلەتكۈچى ئىسمى ۋە ئىمنى تولدۇرىدۇ.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىشنى قوش</string> <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">ئىم قوش</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىشنى قەدەمداشلا</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">ئىم قەدەمداشلا</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">ئۈسكۈنىلەر ئارا قەدەمداشلا</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">ئىمنى ئۈسكۈنىلەر ئارا قەدەمداشلايدۇ</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">ساقلانغان كىرىش</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">ساقلانغان ئىم</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">سىز ساقلىغان كىرىش ياكى %s بىلەن بولغان قەدەمداش بۇ جايدا كۆرۈنىدۇ.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">سىز ساقلىغان ياكى %s غا قەدەمداشلىغان ئىم بۇ يەردە كۆرسىتىلىدۇ. سىز ساقلىغان بارلىق ئىم مەخپىيلەشتۈرۈلگەن.</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">قەدەمداش ھەققىدىكى تەپسىلاتلار.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">قەدەمداش ھەققىدىكى تەپسىلاتلار</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">مۇستەسنا</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">ساقلانمىغان كىرىش ۋە ئىم بۇ يەردە كۆرسىتىلىدۇ.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">بۇ جايدا كۆرسىتىلگەن تور بېكەتلەر ئۈچۈن %s ئىم ساقلىمايدۇ.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">بۇ تور بېكەتلەرنىڭ كىرىش ۋە ئىم ئۇچۇرلىرى ساقلانمايدۇ.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">بۇ تور بېكەتلەر ئۈچۈن %s ئىم ساقلىمايدۇ.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">ھەممە مۇستەسنالارنى ئۆچۈرىدۇ</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش خاتىرىسىنى ئىزدە</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">پارول ئىزدەش</string> <!-- The header for the site that a login is for --> @@ -1843,17 +1849,11 @@ <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">ئىم يوشۇر</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ساقلانغان كىرىشلىرىڭىزنى كۆرۈش ئۈچۈن قۇلۇپ ئېچىڭ</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">ساقلانغان پارولىڭىزنى كۆرۈش ئۈچۈن قۇلۇپ ئېچىڭ</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش ۋە ئىمنى قوغدايدۇ</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">ساقلانغان ئىملىرىڭىز شىفىرلىنىدۇ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ئۈسكۈنە قۇلۇپلاش ئەندىزىسى، PIN ياكى ئىم ئورنىتىشنى تەڭشىسىڭىز، ئۈسكۈنىڭىز باشقىلارنىڭ قولىدا بولسىمۇ ساقلانغان تىزىمغا كىرىش ئۇچۇرى ۋە ئىمنى زىيارەت قىلالمايدۇ.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">ئۈسكۈنە قۇلۇپلاش ئەندىزىسى، PIN ياكى ئىم ئورنىتىشنى تەڭشىسىڭىز، ئۈسكۈنىڭىز باشقىلارنىڭ قولىدا بولسىمۇ ساقلانغان ئىملىرىڭىزنى زىيارەت قىلالمايدۇ.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">كېيىنچە</string> @@ -1871,8 +1871,6 @@ <string name="saved_logins_sort_strategy_alphabetically">ئىسمى (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">ئاخىرقى قېتىم ئىشلىتىلگەن</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش تىزىملىكىنى تەرتىپلەيدۇ</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">ئىم تىزىملىكىنى تەرتىپلە</string> @@ -1882,40 +1880,26 @@ <string name="preferences_autofill">ئاپتوماتىك تولدۇر</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">ئادرېس</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىناۋەتلىك كارتا</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">چىقىم قىلىش ئۇسۇلى</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">كارتا ساقلاش ۋە ئاپتوماتىك تولدۇرۇش</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">چىقىم قىلىش ئۇسۇلىنى ساقلاپ ۋە تولدۇرىدۇ</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">سانلىق مەلۇمات شىفىرلانغان</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">سىز ساقلىغان بارلىق چىقىم قىلىش ئۇسۇللىرىنى %s شىفىرلايدۇ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">كارتىنى ئۈسكۈنىلەر ئارا قەدەمداشلايدۇ</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">كارتا قەدەمداشلا</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىناۋەتلىك كارتا قوش</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">كارتا قوش</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">ساقلانغان كارتا باشقۇرۇش</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">كارتا باشقۇرۇش</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">ئادرېس قوش</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">ئادرېس باشقۇرۇش</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">ئادرېسلارنى ساقلاش ۋە ئاپتوماتىك تولدۇرۇش</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">ئادرېس ساقلاپ تولدۇرىدۇ</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">سان، ئېلخەت ۋە توشۇش ئادرېسى قاتارلىق ئۇچۇرلارنى ئۆز ئىچىگە ئالىدۇ</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">تېلېفون نومۇرى ۋە ئېلخەت ئادرېسىنى ئۆز ئىچىگە ئالىدۇ</string> @@ -1939,8 +1923,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">كارتىنى ئۆچۈر</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">بۇ ئىناۋەتلىك كارتىنى راستىنلا ئۆچۈرەمسىز؟</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">كارتىنى ئۆچۈرەمدۇ؟</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">ئۆچۈر</string> @@ -1952,24 +1934,16 @@ <string name="credit_cards_cancel_button">ۋاز كەچ</string> <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">ساقلانغان كارتا</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىناۋەتلىك كارتا نومۇرىنى كىرگۈزۈڭ</string> <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">ئىناۋەتلىك كارتا نومۇرى كىرگۈزۈلىدۇ</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">بۇ بۆلەكنى تولدۇرۇڭ</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">ئات قوش</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">ساقلانغان كارتىلىرىڭىزنى كۆرۈش ئۈچۈن قۇلۇپ ئېچىڭ</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىناۋەتلىك كارتىڭىزنى شىفىرلايدۇ</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">ساقلانغان چىقىم قىلىش ئۇسۇللىرىڭىز شىفىرلىنىدۇ</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ئۈسكۈنە قۇلۇپلاش ئەندىزىسى، PIN ياكى ئىم ئورنىتىشنى تەڭشىسىڭىز، ئۈسكۈنىڭىز باشقىلارنىڭ قولىدا بولسىمۇ ساقلانغان ئىناۋەتلىك كارتىڭىزنى زىيارەت قىلالمايدۇ.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">ئۈسكۈنە قۇلۇپلاش ئەندىزىسى، PIN ياكى ئىم ئورنىتىشنى تەڭشىسىڭىز، ئۈسكۈنىڭىز باشقىلارنىڭ قولىدا بولسىمۇ ساقلانغان چىقىم قىلىش ئۇسۇلىڭىزنى زىيارەت قىلالمايدۇ.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">ھازىر تەڭشە</string> @@ -1977,8 +1951,6 @@ <string name="credit_cards_warning_dialog_later">كېيىنچە</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">ئۈسكۈنىڭىزنىڭ قۇلۇپىنى ئېچىڭ</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">ساقلانغان ئىناۋەتلىك كارتا ئۇچۇرلىرىنى ئىشلىتىش ئۈچۈن قۇلۇپ ئېچىڭ</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">ساقلانغان چىقىم قىلىش ئۇسۇلىنى ئىشلىتىش ئۈچۈن قۇلۇپ ئېچىڭ</string> <!-- Title of the "Add address" screen --> @@ -1987,12 +1959,6 @@ <string name="addresses_edit_address">ئادرېس تەھرىر</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">ئادرېس باشقۇرۇش</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">ئىسمى</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">ئوتتۇرا ئىسمى</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">تەگئات</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">ئىسمى</string> <!-- The header for the street address of an address --> @@ -2018,8 +1984,6 @@ <!-- The text for the "Delete address" button for deleting an address --> <string name="addressess_delete_address_button">ئادرېس ئۆچۈر</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">بۇ ئادرېسنى راستىنلا ئۆچۈرەمسىز؟</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">بۇ ئادرېسنى ئۆچۈرەمدۇ؟</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">ئۆچۈر</string> @@ -2117,50 +2081,30 @@ <string name="login_menu_delete_button">ئۆچۈر</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">تەھرىر</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">بۇ كىرىشنى راستىنلا ئۆچۈرەمسىز؟</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">بۇ ئىمنى راستىنلا ئۆچۈرەمسىز؟</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">ئۆچۈر</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">ۋاز كەچ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش تاللانمىلىرى</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">ئىم تاللانمىسى</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىشنىڭ تور ئادرېسىنى تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">تور بېكەت ئادرېسىنىڭ تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىشنىڭ ئىشلەتكۈچى ئىسمىنى تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">ئىشلەتكۈچى ئاتىنىڭ تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىشنىڭ ئىمىنى تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">ئىمنىڭ تەھرىرلىگىلى بولىدىغان تېكىست بۆلىكى.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">كىرىش ئۆزگەرتىشلىرىنى ساقلايدۇ.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">ئۆزگەرتىشلەرنى ساقلايدۇ.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">تەھرىر</string> <!-- The page title for editing a saved password. --> <string name="edit_2">ئىم تەھرىر</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">يېڭى كىرىش قوش</string> <!-- The page title for adding new password. --> <string name="add_login_2">ئىم قوش</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىم زۆرۈر</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">ئىم كىرگۈزۈلىدۇ</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">ئىشلەتكۈچى ئىسمى زۆرۈر</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">ئىشلەتكۈچى ئاتى كىرگۈزۈلىدۇ</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">مۇلازىم ئىسمى زۆرۈر</string> @@ -2571,6 +2515,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">تەرجىمە جەدۋىلىنى تاقا</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">بەزى تەڭشەكلەرنى ۋاقىتلىق ئىشلەتكىلى بولمايدۇ.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">تەرجىمە</string> @@ -2594,6 +2541,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">«ھەمىشە تەرجىمە قىل» ۋە «ھەرگىز تەرجىمە قىلما» مايىللىقىدىن باشقۇرىدىغان تىل تاللىنىدۇ.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">تىلنى يۈكلىيەلمەيدۇ. كېيىن قايتا تەكشۈرۈڭ.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">تەرجىمە قىلىش (كۆڭۈلدىكى)</string> @@ -2617,6 +2567,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">%1$s نى چىقىرىۋەت</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">تور بېكەتنى يۈكلىيەلمەيدۇ. كېيىن قايتا تەكشۈرۈڭ.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference"> %1$s نى ئۆچۈرەمدۇ؟</string> @@ -2694,13 +2646,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">كەينىگە قايت</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">سازلاش تارتمىسىنى ئاچ</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">بەتكۈچ قوراللىرى</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">بەتكۈچ سانى</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">ئاكتىپ</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">ئاكتىپ</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">ئاكتىپ</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">ئىشلەتمىگەن</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2711,6 +2668,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">بەتكۈچ قۇرۇش قورالى</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">قۇرىدىغان بەتكۈچ سانى</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">تېكىست بۆلىكى بوش</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">پەقەت مۇسپەت پۈتۈن سان كىرگۈزۈڭ</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">نۆلدىن چوڭ سان كىرگۈزۈڭ</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">بىر مەشغۇلاتتا ھاسىللايدىغان ئەڭ كۆپ بەتكۈچ (%1$s) سانىدىن ئېشىپ كەتتى</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">ئاكتىپ بەتكۈچكە قوش</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2727,11 +2694,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">شەخسىيەت ئۇقتۇرۇشى</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">يوللا</string> + <string name="micro_survey_submit_button_label">يوللا</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">تاقا</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">تاقا</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">قايتۇرما ئىنكاسىڭىزغا رەھمەت!</string> + <string name="micro_survey_feedback_confirmation">قايتۇرما ئىنكاسىڭىزغا رەھمەت!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">بەك رازى</string> <!-- Option for likert scale --> @@ -2744,6 +2711,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">بەك نارازى</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">راي سىناشنى ئاچ</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">راي سىناشنى تاقا</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">تاقا</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">كىرىش</string> diff --git a/mobile/android/fenix/app/src/main/res/values-uk/strings.xml b/mobile/android/fenix/app/src/main/res/values-uk/strings.xml index a03bc42b8b..0800dff8c6 100644 --- a/mobile/android/fenix/app/src/main/res/values-uk/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-uk/strings.xml @@ -198,6 +198,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Додатки</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Розширення</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Керувати розширеннями</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Знайти більше розширень</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Ваш обліковий запис</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Відкрити у звичайній вкладці</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Додати на головний екран</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Додати на головний екран…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Встановити</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Перекласти сторінку</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Зберегти до збірки…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Зберегти до збірки</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Поділитися</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Поділитися…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Відкрити в %1$s</string> @@ -284,6 +294,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Зберегти</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Додати сторінку до закладок</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Редагувати закладку</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Зберегти як PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Увімкнути режим читання</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Вимкнути режим читання</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Перекласти сторінку…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Перекладено на %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Друкувати…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Тут немає розширень</string> @@ -381,8 +409,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Положення про приватність Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Докладніше в нашому положенні про приватність</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Ми дбаємо про вашу безпеку</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -593,7 +619,9 @@ <!-- Preference for language --> <string name="preferences_language">Мова</string> <!-- Preference for translation --> - <string name="preferences_translation">Переклад</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Переклад</string> + <!-- Preference for translations --> + <string name="preferences_translations">Переклади</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Вибір даних</string> <!-- Preference for data collection --> @@ -668,10 +696,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Обов\'язково</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Необов\'язково</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Читати та змінювати дані вебсайту</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Видалити вебсайт</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Дозволити для всіх сайтів</string> @@ -798,8 +822,6 @@ <string name="preferences_sync_history">Історію</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Закладки</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Паролі</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Паролі</string> <!-- Preference for syncing tabs --> @@ -826,8 +848,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s на %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Кредитні картки</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Способи оплати</string> <!-- Preference for syncing addresses --> @@ -844,6 +864,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Вкладка з %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">Закрито вкладок %1$s: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Переглянути недавно закриті вкладки</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Винятки</string> @@ -1772,12 +1800,8 @@ <string name="add_to_homescreen_description_2">Ви можете легко додати цей вебсайт на головний екран вашого пристрою, щоб мати миттєвий доступ до нього і працювати швидше.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Паролі</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Паролі</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Зберігати паролі</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Зберігати паролі</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Питати про збереження</string> @@ -1792,48 +1816,29 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Заповнювати імена користувачів і паролі в інших програмах на цьому пристрої.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Додати пароль</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Додати пароль</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронізація паролів</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Синхронізувати паролі</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Синхронізувати паролі між пристроями</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Синхронізація паролів між пристроями</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Збережені паролі</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Збережені паролі</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Тут з’являтимуться ваші збережені та синхронізовані з %s паролі.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Тут з\'являтимуться паролі, які ви зберігаєте чи синхронізуєте в %s. Усі паролі зашифровано. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Докладніше про синхронізацію.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Докладніше про синхронізацію</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Винятки</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Не збережені паролі з’являтимуться тут.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s не зберігатиме паролі для вказаних тут сайтів.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Паролі для цих сайтів не зберігатимуться.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s не зберігатиме паролі для цих сайтів.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Видалити всі винятки</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Шукати паролі</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Пошук паролів</string> <!-- The header for the site that a login is for --> @@ -1863,17 +1868,11 @@ <string name="saved_login_reveal_password">Показати пароль</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Приховати пароль</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Розблокуйте для перегляду збережених паролів</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Розблокуйте, щоб переглянути збережені паролі</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Захистіть свої паролі</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Захистіть збережені паролі</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Встановіть графічний ключ, PIN-код чи пароль для захисту збережених паролів від інших, хто може отримати доступ до вашого пристрою.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Встановіть графічний ключ, PIN-код чи пароль для захисту збережених паролів від інших, хто може отримати доступ до вашого пристрою.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Пізніше</string> @@ -1891,9 +1890,6 @@ <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Востаннє використано</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Меню впорядкування паролів</string> - <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Меню сортування паролів</string> @@ -1902,41 +1898,27 @@ <string name="preferences_autofill">Автозаповнення</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Адреси</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Кредитні картки</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Способи оплати</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Зберігати та автоматично заповнювати дані карток</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Зберігати й заповнювати способи оплати</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Дані зашифровано</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s шифрує всі збережені способи оплати</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Синхронізувати картки між пристроями</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Синхронізувати картки</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Додати кредитну картку</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Додати картку</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Керувати збереженими картками</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Керувати картками</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Додати адресу</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Керувати адресами</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Зберігати та автоматично заповнювати адреси</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Зберігати й заповнювати адреси</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Включити дані, як-от номери, електронні адреси та адреси доставлення</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Містить номери телефонів і адреси електронної пошти</string> @@ -1960,8 +1942,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Видалити картку</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ви впевнені, що хочете видалити цю кредитну картку?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Видалити картку?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Видалити</string> @@ -1975,24 +1955,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Збережені картки</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Введіть дійсний номер кредитної картки</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Введіть дійсний номер картки</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Будь ласка, заповніть це поле</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Додайте назву</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Розблокуйте для перегляду збережених карток</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Захистіть свої банківські картки</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Захистіть свої збережені способи оплати</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Встановіть графічний ключ, PIN-код чи пароль для захисту збережених банківських карток від інших, хто може отримати доступ до вашого пристрою.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Встановіть графічний ключ, PIN-код чи пароль для захисту збережених способів оплати від інших, хто може отримати доступ до вашого пристрою.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Встановити</string> @@ -2001,9 +1972,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Розблокуйте свій пристрій</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Розблокуйте, щоб використовувати збережену інформацію про кредитну картку</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Розблокуйте, щоб використати збережені способи оплати</string> <!-- Title of the "Add address" screen --> @@ -2012,12 +1980,6 @@ <string name="addresses_edit_address">Редагувати адресу</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Керувати адресами</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Ім’я</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">По батькові</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Прізвище</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Ім’я</string> <!-- The header for the street address of an address --> @@ -2044,8 +2006,6 @@ <string name="addressess_delete_address_button">Видалити адресу</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Ви дійсно хочете видалити цю адресу?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Видалити цю адресу?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Видалити</string> @@ -2144,49 +2104,29 @@ <string name="login_menu_delete_button">Видалити</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Змінити</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Ви дійсно хочете видалити цей запис?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Ви дійсно хочете видалити цей пароль?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Видалити</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Скасувати</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Опції запису</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Параметри пароля</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстове поле для редагування вебадреси запису.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Текстове поле для редагування адреси вебсайту.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстове поле для редагування імені користувача запису.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Текстове поле для редагування імені користувача.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Текстове поле для редагування пароля запису.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Текстове поле для редагування пароля.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Зберегти зміни.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Зберегти зміни.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Змінити</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Редагувати пароль</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Додати новий пароль</string> <!-- The page title for adding new password. --> <string name="add_login_2">Додати пароль</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Потрібен пароль</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Введіть пароль</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Необхідно вказати ім’я користувача</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Введіть ім’я користувача</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Необхідно вказати назву вузла</string> @@ -2594,6 +2534,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Закрити блок перекладів</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Деякі налаштування тимчасово недоступні.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Переклади</string> @@ -2617,6 +2560,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Виберіть мову, щоб керувати налаштуваннями ”завжди перекладати“ та ”ніколи не перекладати“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Не вдалося завантажити мови. Повторіть спробу пізніше.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Пропонувати переклад (типово)</string> @@ -2641,6 +2587,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Вилучити %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Не вдалося завантажити сайти. Повторіть спробу пізніше.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Видалити %1$s?</string> @@ -2718,13 +2666,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Перейти назад</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Відкрити панель налагодження</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Інструменти вкладки</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Кількість вкладок</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Активні</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Активні</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Активні</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Неактивні</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2735,6 +2688,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Інструмент створення вкладок</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Кількість вкладок для створення</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Текстове поле порожнє</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Будь ласка, введіть лише додатні цілі числа</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Будь ласка, введіть число більше нуля</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Перевищено максимальну кількість вкладок (%1$s), яку можна створити за одну операцію</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Додати до активних вкладок</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2751,11 +2714,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Повідомлення про приватність</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Надіслати</string> + <string name="micro_survey_submit_button_label">Надіслати</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Закрити</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Закрити</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Дякуємо за ваш відгук!</string> + <string name="micro_survey_feedback_confirmation">Дякуємо за ваш відгук!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Дуже задоволені</string> <!-- Option for likert scale --> @@ -2767,6 +2730,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Дуже незадоволені</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Відкрити опитування</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Закрити опитування</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Закрити</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Паролі</string> diff --git a/mobile/android/fenix/app/src/main/res/values-vi/strings.xml b/mobile/android/fenix/app/src/main/res/values-vi/strings.xml index 4b8cd97821..0428dce517 100644 --- a/mobile/android/fenix/app/src/main/res/values-vi/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-vi/strings.xml @@ -199,6 +199,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Tiện ích</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Tiện ích</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Quản lý tiện ích</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Khám phá tiện tích khác</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Thông tin tài khoản</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -217,6 +221,8 @@ <string name="browser_menu_open_in_regular_tab">Mở trong thẻ thông thường</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Thêm vào màn hình chính</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Thêm vào màn hình chính…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Cài đặt</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -228,9 +234,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Dịch trang</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Lưu vào bộ sưu tập…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Lưu vào bộ sưu tập</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Chia sẻ</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Chia sẻ…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Mở bằng %1$s</string> @@ -283,6 +293,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">Lưu</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Đánh dấu trang này</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Chỉnh sửa dấu trang</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Lưu dưới dạng PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Bật chế độ đọc sách</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Tắt chế độ đọc sách</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Dịch trang…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Đã dịch sang %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">In…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">Không có tiện ích ở đây</string> @@ -379,8 +407,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Thông báo về quyền riêng tư Firefox</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">Tìm hiểu thêm trong thông báo bảo mật của chúng tôi</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">Chúng tôi thích giữ an toàn cho bạn</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -589,7 +615,9 @@ <!-- Preference for language --> <string name="preferences_language">Ngôn ngữ</string> <!-- Preference for translation --> - <string name="preferences_translation">Dịch</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Dịch</string> + <!-- Preference for translations --> + <string name="preferences_translations">Dịch</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Lựa chọn dữ liệu</string> <!-- Preference for data collection --> @@ -662,10 +690,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">Bắt buộc</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">Không bắt buộc</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">Đọc và thay đổi dữ liệu trang web</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">Xóa trang web</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">Cho phép tất cả các trang web</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -790,8 +814,6 @@ <string name="preferences_sync_history">Lịch sử</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">Dấu trang</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Đăng nhập</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">Mật khẩu</string> <!-- Preference for syncing tabs --> @@ -818,8 +840,6 @@ and the third is the device model. --> <string name="default_device_name_2">%1$s trên %2$s %3$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Thẻ tín dụng</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">Phương thức thanh toán</string> <!-- Preference for syncing addresses --> @@ -836,6 +856,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Thẻ từ %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%2$d thẻ %1$s đã đóng</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">Xem thẻ đã đóng gần đây</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Ngoại lệ</string> @@ -1755,12 +1783,8 @@ <string name="add_to_homescreen_description_2">Bạn có thể dễ dàng thêm trang web vào màn hình chính thiết bị của bạn để có thể truy cập và duyệt web nhanh hơn với trải nghiệm giống như trên ứng dụng.</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">Thông tin đăng nhập và mật khẩu</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">Mật khẩu</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Lưu thông tin đăng nhập và mật khẩu</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">Lưu mật khẩu</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">Yêu cầu để lưu</string> @@ -1775,47 +1799,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">Điền tên người dùng và mật khẩu vào các ứng dụng khác trên thiết bị của bạn.</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Thêm thông tin đăng nhập</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">Thêm mật khẩu</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Đồng bộ hóa thông tin đăng nhập</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">Đồng bộ mật khẩu</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">Đồng bộ hóa thông tin đăng nhập trên các thiết bị</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">Đồng bộ hóa mật khẩu giữa các thiết bị</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">Thông tin đăng nhập đã lưu</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">Mật khẩu đã lưu</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">Thông tin đăng nhập bạn lưu hoặc đồng bộ hóa với %s sẽ hiển thị tại đây.</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">Mật khẩu bạn lưu hoặc đồng bộ hóa với %s sẽ được liệt kê ở đây. Tất cả mật khẩu bạn lưu đều được mã hóa. </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">Tìm hiểu thêm về đồng bộ hóa.</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">Tìm hiểu thêm về đồng bộ hoá</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">Ngoại lệ</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">Thông tin đăng nhập và mật khẩu không được lưu sẽ được hiển thị ở đây.</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s sẽ không lưu mật khẩu cho các trang được liệt kê ở đây.</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Thông tin đăng nhập và mật khẩu sẽ không được lưu cho các trang web này.</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s sẽ không lưu mật khẩu cho các trang web này.</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">Xóa tất cả ngoại lệ</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">Tìm thông tin đăng nhập</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">Tìm kiếm mật khẩu</string> <!-- The header for the site that a login is for --> @@ -1844,17 +1849,11 @@ <string name="saved_login_reveal_password">Hiện mật khẩu</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">Ẩn mật khẩu</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Mở khóa để xem thông tin đăng nhập đã lưu của bạn</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">Mở khóa để xem mật khẩu đã lưu của bạn</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Bảo mật thông tin đăng nhập và mật khẩu của bạn</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">Giữ mật khẩu đã lưu của bạn một cách an toàn</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Thiết lập mẫu khóa thiết bị, mã PIN hoặc mật khẩu để bảo vệ thông tin đăng nhập và mật khẩu đã lưu của bạn khỏi bị truy cập nếu người khác lấy được thiết bị của bạn.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">Đặt mật khẩu thiết bị dạng mẫu hình, mã PIN hoặc mật khẩu để bảo vệ mật khẩu đã lưu của bạn không bị truy cập nếu người khác lấy được thiết bị của bạn.</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">Để sau</string> @@ -1871,8 +1870,6 @@ <string name="saved_logins_sort_strategy_alphabetically">Tên (A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">Sử dụng lần cuối</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Sắp xếp menu đăng nhập</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">Menu sắp xếp mật khẩu</string> @@ -1882,41 +1879,27 @@ <string name="preferences_autofill">Tự động điền</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">Địa chỉ</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Thẻ tín dụng</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">Phương thức thanh toán</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Lưu và tự động điền thẻ tín dụng</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">Lưu và điền phương thức thanh toán</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Dữ liệu được mã hóa</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s mã hóa tất cả các phương thức thanh toán bạn lưu</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">Đồng bộ thông tin thẻ tín dụng trên các thiết bị</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">Đồng bộ hóa thẻ tín dụng</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">Thêm thẻ tín dụng</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">Thêm thẻ</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">Quản lý thẻ tín dụng đã lưu</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">Quản lý thẻ tín dụng</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">Thêm địa chỉ</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">Quản lý địa chỉ</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">Lưu và tự động điền địa chỉ</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">Lưu và điền địa chỉ</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">Bao gồm thông tin như số, email và địa chỉ giao hàng</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">Bao gồm số điện thoại và địa chỉ email</string> @@ -1940,8 +1923,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">Xóa thẻ</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Bạn có chắc chắn muốn xóa thẻ tín dụng này không?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">Xoá thẻ?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">Xóa</string> @@ -1955,24 +1936,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">Thẻ tín dụng đã lưu</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vui lòng nhập số thẻ tín dụng hợp lệ</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">Nhập số thẻ hợp lệ</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Vui lòng điền vào trường này</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">Thêm tên</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">Mở khóa để xem các thẻ tín dụng đã lưu của bạn</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">Bảo mật thẻ tín dụng của bạn</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">Giữ các phương thức thanh toán đã lưu của bạn một cách an toàn</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Thiết lập màn hình khóa thiết bị với mẫu hình, mã PIN hoặc mật khẩu để bảo vệ thẻ tín dụng đã lưu của bạn không bị truy cập nếu người khác có thiết bị của bạn.</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">Đặt mật khẩu thiết bị dạng mẫu hình, mã PIN hoặc mật khẩu để bảo vệ phương thức thanh toán đã lưu của bạn không bị truy cập nếu người khác lấy đuọc thiết bị của bạn.</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">Thiết lập ngay</string> @@ -1980,8 +1952,6 @@ <string name="credit_cards_warning_dialog_later">Để sau</string> <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">Mở khóa thiết bị của bạn</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Mở khóa để sử dụng thông tin thẻ tín dụng được lưu trữ</string> <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">Mở khóa để sử dụng các phương thức thanh toán đã lưu</string> @@ -1991,12 +1961,6 @@ <string name="addresses_edit_address">Sửa địa chỉ</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">Quản lý địa chỉ</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">Tên</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">Tên đệm</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">Họ</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">Tên</string> <!-- The header for the street address of an address --> @@ -2023,8 +1987,6 @@ <string name="addressess_delete_address_button">Xóa địa chỉ</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">Bạn có chắc chắn muốn xóa địa chỉ này không?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">Xoá địa chỉ này?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">Xóa</string> @@ -2122,49 +2084,29 @@ <string name="login_menu_delete_button">Xóa</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">Chỉnh sửa</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">Bạn có chắc chắn muốn xóa thông tin đăng nhập này không?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">Bạn có chắc chắn muốn xóa mật khẩu này?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">Xóa</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">Hủy bỏ</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">Tùy chọn thông tin đăng nhập</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">Cài đặt mật khẩu</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Trường văn bản có thể chỉnh sửa cho địa chỉ web của thông tin đăng nhập.</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">Trường văn bản có thể chỉnh sửa cho địa chỉ trang web.</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Trường văn bản có thể chỉnh sửa cho tên người dùng của thông tin đăng nhập.</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">Trường văn bản có thể chỉnh sửa cho tên người dùng.</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">Trường văn bản có thể chỉnh sửa cho mật khẩu của thông tin đăng nhập.</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">Trường văn bản có thể chỉnh sửa cho mật khẩu.</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Lưu các thay đổi vào thông tin đăng nhập.</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">Lưu thay đổi.</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">Chỉnh sửa</string> <!-- The page title for editing a saved password. --> <string name="edit_2">Chỉnh sửa mật khẩu</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">Thêm thông tin đăng nhập mới</string> <!-- The page title for adding new password. --> <string name="add_login_2">Thêm mật khẩu</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Yêu cầu mật khẩu</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">Nhập mật khẩu</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">Yêu cầu tên đăng nhập</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">Nhập tên người dùng</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">Yêu cầu tên máy chủ</string> @@ -2512,6 +2454,8 @@ <string name="translations_bottom_sheet_negative_button">Không phải bây giờ</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Hiển thị bản gốc</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Trang nguyên bản chưa dịch đã được tải</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Xong</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2569,6 +2513,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">Đóng bảng dịch</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">Một số cài đặt tạm thời không khả dụng.</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">Dịch</string> @@ -2592,6 +2539,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">Hãy chọn một ngôn ngữ để quản lí các tùy chọn ”Luôn dịch“ và ”Không bao giờ dịch“.</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">Không thể tải ngôn ngữ. Vui lòng kiểm tra lại sau.</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">Đề xuất dịch (mặc định)</string> @@ -2615,6 +2565,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">Xóa %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">Không thể tải trang web. Vui lòng kiểm tra lại sau.</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">Xóa %1$s?</string> @@ -2692,13 +2644,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Điều hướng quay lại</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Mở ngăn gỡ lỗi</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">Công cụ thẻ</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Số lượng thẻ</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Hoạt động</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">Hoạt động</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Đang hoạt động</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Không hoạt động</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2709,6 +2666,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">Công cụ tạo thẻ</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">Số lượng thẻ cần tạo</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">Trường văn bản đang trống</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">Vui lòng chỉ nhập số nguyên dương</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">Vui lòng nhập số lớn hơn 0</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">Đã vượt quá số lượng thẻ tối đa (%1$s) có thể được tạo ra trong một thao tác</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">Thêm vào thẻ đang hoạt động</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2725,11 +2692,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">Thông báo bảo mật</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Gửi</string> + <string name="micro_survey_submit_button_label">Gửi</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">Đóng</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">Đóng</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Cảm ơn phản hồi của bạn!</string> + <string name="micro_survey_feedback_confirmation">Cảm ơn phản hồi của bạn!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">Rất hài lòng</string> <!-- Option for likert scale --> @@ -2741,6 +2708,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">Rất không hài lòng</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Mở khảo sát</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">Đóng khảo sát</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">Đóng</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Thông tin đăng nhập</string> diff --git a/mobile/android/fenix/app/src/main/res/values-zh-rCN/strings.xml b/mobile/android/fenix/app/src/main/res/values-zh-rCN/strings.xml index 9d9182dcd4..9d92f3c32d 100644 --- a/mobile/android/fenix/app/src/main/res/values-zh-rCN/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-zh-rCN/strings.xml @@ -204,6 +204,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">附加组件</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">扩展</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">管理扩展</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">探索更多扩展</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">账户信息</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -222,6 +226,8 @@ <string name="browser_menu_open_in_regular_tab">在常规标签页中打开</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">添加到主屏幕</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">添加到主屏幕…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">安装</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -233,10 +239,14 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">翻译页面</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">保存到收藏集…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">保存到收藏集</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">分享</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">分享…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">用 %1$s 打开</string> @@ -291,6 +301,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">保存</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">将此页面加入书签</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">编辑书签</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">另存为 PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">开启阅读模式</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">关闭阅读视图</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">翻译页面…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">已翻译成%1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">打印…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">暂无扩展</string> @@ -390,8 +418,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox 隐私声明</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">阅读我们的隐私声明详细了解</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">我们乐于为您护航</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -603,7 +629,9 @@ <!-- Preference for language --> <string name="preferences_language">语言</string> <!-- Preference for translation --> - <string name="preferences_translation">翻译</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">翻译</string> + <!-- Preference for translations --> + <string name="preferences_translations">翻译</string> <!-- Preference for data choices --> <string name="preferences_data_choices">数据反馈</string> <!-- Preference for data collection --> @@ -677,10 +705,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">必需</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">可选</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">读取和更改网站数据</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">删除网站</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">允许在所有网站上运行</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -808,8 +832,6 @@ <string name="preferences_sync_history">历史记录</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">书签</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">登录信息</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">密码</string> <!-- Preference for syncing tabs --> @@ -836,9 +858,6 @@ and the third is the device model. --> <string name="default_device_name_2">%2$s %3$s 上的 %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">信用卡</string> - <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">付款方式</string> <!-- Preference for syncing addresses --> @@ -855,6 +874,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">来自 %s 的标签页</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">已关闭 %1$s 中的 %2$d 个标签页</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">查看最近关闭的标签页</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">例外</string> @@ -1813,12 +1840,8 @@ <string name="add_to_homescreen_description_2">您可以轻松将此网站添加到设备主屏幕,以便迅捷访问并以类似应用的体验畅享浏览。</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">密码</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">密码</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">保存登录名和密码</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">保存密码</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">询问是否保存</string> @@ -1835,47 +1858,28 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">在您设备上的其他应用程序中填充用户名和密码。</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">添加登录信息</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">添加密码</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">同步登录信息</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">同步密码</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">跨设备同步登录信息</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">跨设备同步密码</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">保存的登录信息</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">保存的密码</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">您保存或同步到 %s 的登录信息将显示于此处。</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">保存和同步到 %s 的密码会显示在这里,所有密码均已加密保存。 </string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">详细了解“同步”。</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">详细了解同步功能</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">例外</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">不保存登录名和密码的网站将显示于此处。</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s 将不会保存此处所列网站的密码。</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">将不保存这些网站的登录名和密码。</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s 将不会保存这些网站的密码。</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">删除所有例外</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">搜索登录信息</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">搜索密码</string> <!-- The header for the site that a login is for --> @@ -1904,17 +1908,11 @@ <string name="saved_login_reveal_password">显示密码</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">隐藏密码</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">解锁以查看您保存的登录信息</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">解锁以查看保存的密码</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">保护您的登录名和密码</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">保护您保存的密码</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">设置设备锁定图案、PIN 或密码以保护您保存的登录名与密码,避免他人盗用。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">设置设备锁定图案、PIN 或密码以保护您保存的密码,避免他人盗用。</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">稍后</string> @@ -1931,8 +1929,6 @@ <string name="saved_logins_sort_strategy_alphabetically">名称(A-Z)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">上次使用</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">排序登录信息菜单</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">密码排序菜单</string> @@ -1942,41 +1938,27 @@ <string name="preferences_autofill">自动填充</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">地址</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">信用卡</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">付款方式</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">保存并自动填充信用卡信息</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">保存和填写付款方式</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">数据已加密</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s 会加密您保存的所有付款方式</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">跨设备同步信用卡信息</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">同步卡片信息</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">添加信用卡</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">添加信用卡</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">管理保存的卡片</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">管理信用卡</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">添加地址</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">管理地址</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">保存并自动填充地址</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">保存和填充地址</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">包含号码、邮箱和收货地址等信息</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">包括电话号码和邮箱地址</string> @@ -2000,8 +1982,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">删除卡片</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">您确定要删除此信用卡吗?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">确定删除信用卡吗?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">删除</string> @@ -2015,25 +1995,16 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">保存的卡片</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">请输入有效的信用卡卡号</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">请输入有效卡号</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">请填写此栏</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">请输入持卡人姓名</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">解锁后即可查看保存的卡片信息</string> - <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">保护您的卡片信息</string> <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">保护您保存的付款方式</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">设置设备锁定图案、PIN 或密码以保护您保存的卡片信息,避免他人盗用。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">设置设备锁定图案、PIN 或密码以保护您保存的付款方式,避免他人盗用。</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">立即设置</string> @@ -2042,9 +2013,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">解锁设备</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">解锁以使用存储的卡片信息</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">解锁以使用保存的付款方式</string> <!-- Title of the "Add address" screen --> @@ -2053,12 +2021,6 @@ <string name="addresses_edit_address">编辑地址</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">管理地址</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">名</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">中间名</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">姓</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">姓名</string> <!-- The header for the street address of an address --> @@ -2085,8 +2047,6 @@ <string name="addressess_delete_address_button">删除地址</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">您确定要删除此地址吗?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">确定删除此地址吗?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">删除</string> @@ -2184,49 +2144,29 @@ <string name="login_menu_delete_button">删除</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">编辑</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">您确定要删除此登录信息吗?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">您确定要删除此密码吗?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">删除</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">取消</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">登录选项</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">密码选项</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登录信息中的网址输入框。</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">网址输入框。</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登录信息中的用户名输入框。</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">用户名输入框。</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登录信息中的密码输入框。</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">密码输入框。</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">保存编辑过的登录信息。</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">保存更改。</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">编辑</string> <!-- The page title for editing a saved password. --> <string name="edit_2">编辑密码</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">新建登录信息</string> <!-- The page title for adding new password. --> <string name="add_login_2">添加密码</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">需要密码</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">请输入密码</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">用户名不能为空</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">请输入用户名</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">主机名不能为空</string> @@ -2643,6 +2583,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">关闭翻译表单</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">部分设置暂时无法使用。</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">翻译</string> @@ -2665,6 +2608,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">请选择语言来管理“总是翻译”和“永不翻译”首选项。</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">无法加载语言包,请稍后再试。</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">询问是否翻译(默认)</string> @@ -2688,6 +2634,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">移除 %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">无法加载网站,请稍后再试。</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">确定删除 %1$s 吗?</string> @@ -2765,13 +2713,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">向前导航</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">打开调试抽屉</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">标签页工具</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">标签页数量</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">活跃</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">活跃</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">活跃</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">休眠</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2782,6 +2735,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">标签页创建工具</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">要创建的标签页数量</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">文本框为空</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">只能输入正整数</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">只能输入大于 0 的数字</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">超出单次操作所能生成的标签页数量上限(%1$s 个)</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">添加到活跃标签页</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2798,11 +2761,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">隐私声明</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">提交</string> + <string name="micro_survey_submit_button_label">提交</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">关闭</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">关闭</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">感谢反馈!</string> + <string name="micro_survey_feedback_confirmation">感谢反馈!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">非常满意</string> <!-- Option for likert scale --> @@ -2815,6 +2778,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">非常不满意</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">打开问卷</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">关闭问卷</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">关闭</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">登录信息</string> diff --git a/mobile/android/fenix/app/src/main/res/values-zh-rTW/strings.xml b/mobile/android/fenix/app/src/main/res/values-zh-rTW/strings.xml index fee537aaf9..1bec6b339b 100644 --- a/mobile/android/fenix/app/src/main/res/values-zh-rTW/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values-zh-rTW/strings.xml @@ -202,6 +202,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">附加元件</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">擴充套件</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">管理擴充套件</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">探索更多擴充套件</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">帳號資訊</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -220,6 +224,8 @@ <string name="browser_menu_open_in_regular_tab">用一般分頁開啟</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">新增至裝置主畫面</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">新增至裝置主畫面…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">安裝</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> @@ -231,9 +237,13 @@ <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">翻譯頁面</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">儲存至收藏集…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">儲存至收藏集</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">分享</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">分享…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">使用 %1$s 開啟</string> @@ -289,6 +299,24 @@ bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> <string name="browser_menu_save">儲存</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">將此頁加入書籤</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">編輯書籤</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">儲存為 PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">開啟閱讀模式</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">關閉閱讀模式</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">翻譯此頁…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">已翻譯為%1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">列印…</string> + <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> <string name="extensions_management_no_extensions">這裡沒有擴充套件</string> @@ -386,8 +414,6 @@ <!-- Juno first user onboarding flow experiment, strings are marked unused as they are only referenced by Nimbus experiments. --> <!-- Description for learning more about our privacy notice. --> <string name="juno_onboarding_privacy_notice_text">Firefox 隱私權公告</string> - <!-- Description for learning more about our privacy notice. --> - <string name="juno_onboarding_privacy_notice_text_2" moz:removedIn="125" tools:ignore="UnusedResources">可以到我們的隱私權公告了解更多資訊</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. --> <string name="juno_onboarding_default_browser_title_nimbus_2">我們希望確保您上網安全</string> <!-- Title for set firefox as default browser screen used by Nimbus experiments. @@ -596,7 +622,9 @@ <!-- Preference for language --> <string name="preferences_language">語言</string> <!-- Preference for translation --> - <string name="preferences_translation">翻譯</string> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">翻譯</string> + <!-- Preference for translations --> + <string name="preferences_translations">翻譯</string> <!-- Preference for data choices --> <string name="preferences_data_choices">回報資料</string> <!-- Preference for data collection --> @@ -671,10 +699,6 @@ <string name="addons_permissions_heading_required" tools:ignore="UnusedResources">必需</string> <!-- The title of the optional permissions section from addon's permissions screen --> <string name="addons_permissions_heading_optional" tools:ignore="UnusedResources">非必要</string> - <!-- The title of the section with websites that have permissions granted from addon's permissions screen --> - <string name="addons_permissions_heading_read_and_change_website_data" tools:ignore="UnusedResources">讀取或變更網站資料</string> - <!-- The description of the icon that can delete one of the websites displayed --> - <string name="addons_permissions_icon_description_delete_website" tools:ignore="UnusedResources">刪除網站</string> <!-- The title of the origin permission option allowing a user to enable the extension to run on all sites --> <string name="addons_permissions_allow_for_all_sites" tools:ignore="UnusedResources">允許所有網站</string> <!-- The subtitle for the allow for all sites preference toggle --> @@ -800,8 +824,6 @@ <string name="preferences_sync_history">瀏覽紀錄</string> <!-- Preference for syncing bookmarks --> <string name="preferences_sync_bookmarks">書籤</string> - <!-- Preference for syncing logins --> - <string name="preferences_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">登入資訊</string> <!-- Preference for syncing passwords --> <string name="preferences_sync_logins_2">密碼</string> <!-- Preference for syncing tabs --> @@ -828,8 +850,6 @@ and the third is the device model. --> <string name="default_device_name_2">在 %2$s %3$s 上的 %1$s</string> - <!-- Preference for syncing credit cards --> - <string name="preferences_sync_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">信用卡</string> <!-- Preference for syncing payment methods --> <string name="preferences_sync_credit_cards_2">付款方式</string> <!-- Preference for syncing addresses --> @@ -846,6 +866,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">來自 %s 的分頁</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">已關閉 %1$s 分頁:%2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">檢視最近關閉的分頁</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">例外網站</string> @@ -1798,12 +1826,8 @@ <string name="add_to_homescreen_description_2">您可將此網站加到裝置主畫面,方便快速開啟,或是以類似 App 的方式使用。</string> <!-- Preference for managing the settings for logins and passwords in Fenix --> - <string name="preferences_passwords_logins_and_passwords" moz:RemovedIn="125" tools:ignore="UnusedResources">登入資訊與密碼</string> - <!-- Preference for managing the settings for logins and passwords in Fenix --> <string name="preferences_passwords_logins_and_passwords_2">密碼</string> <!-- Preference for managing the saving of logins and passwords in Fenix --> - <string name="preferences_passwords_save_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">儲存登入資訊與密碼</string> - <!-- Preference for managing the saving of logins and passwords in Fenix --> <string name="preferences_passwords_save_logins_2">已存密碼</string> <!-- Preference option for asking to save passwords in Fenix --> <string name="preferences_passwords_save_logins_ask_to_save">詢問我是否儲存</string> @@ -1818,46 +1842,27 @@ <!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) --> <string name="preferences_android_autofill_description">使用其他裝置中的其他應用程式時也自動填寫使用者名稱與密碼。</string> - <!-- Preference option for adding a login --> - <string name="preferences_logins_add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">新增登入資訊</string> - <!-- Preference option for adding a password --> <string name="preferences_logins_add_login_2">新增密碼</string> <!-- Preference for syncing saved passwords in Fenix --> - <string name="preferences_passwords_sync_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">同步登入資訊</string> - <!-- Preference for syncing saved passwords in Fenix --> <string name="preferences_passwords_sync_logins_2">同步密碼</string> - <!-- Preference for syncing saved logins in Fenix, when not signed in--> - <string name="preferences_passwords_sync_logins_across_devices" moz:RemovedIn="125" tools:ignore="UnusedResources">在不同裝置間同步登入資訊</string> <!-- Preference for syncing saved passwords in Fenix, when not signed in--> <string name="preferences_passwords_sync_logins_across_devices_2">在不同裝置間同步密碼</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins" moz:RemovedIn="125" tools:ignore="UnusedResources">儲存的登入資訊</string> <!-- Preference to access list of saved passwords --> <string name="preferences_passwords_saved_logins_2">已存密碼</string> <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> - <string name="preferences_passwords_saved_logins_description_empty_text" moz:RemovedIn="125" tools:ignore="UnusedResources">您儲存或同步到 %s 的登入資訊將顯示於此處。</string> - <!-- Description of empty list of saved passwords. Placeholder is replaced with app name. --> <string name="preferences_passwords_saved_logins_description_empty_text_2">您儲存或同步到 %s 的密碼將顯示於此處,所有儲存的密碼資訊都會被加密。</string> - <!-- Preference to access list of saved logins --> - <string name="preferences_passwords_saved_logins_description_empty_learn_more_link" moz:RemovedIn="125" tools:ignore="UnusedResources">了解 Sync 的更多資訊。</string> <!-- Clickable text for opening an external link for more information about Sync. --> <string name="preferences_passwords_saved_logins_description_empty_learn_more_link_2">瞭解同步功能的更多資訊</string> <!-- Preference to access list of login exceptions that we never save logins for --> <string name="preferences_passwords_exceptions">例外網站</string> - <!-- Empty description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description_empty" moz:RemovedIn="125" tools:ignore="UnusedResources">不儲存登入資訊與密碼的網站將顯示於此處。</string> <!-- Empty description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_empty_2">%s 不會儲存下列網站的密碼。</string> - <!-- Description of list of login exceptions that we never save logins for --> - <string name="preferences_passwords_exceptions_description" moz:RemovedIn="125" tools:ignore="UnusedResources">將不儲存這些網站的登入資訊與密碼。</string> <!-- Description of list of login exceptions that we never save passwords for. Parameter will be replaced by app name. --> <string name="preferences_passwords_exceptions_description_2">%s 不會儲存下列網站的密碼。</string> <!-- Text on button to remove all saved login exceptions --> <string name="preferences_passwords_exceptions_remove_all">刪除所有例外</string> - <!-- Hint for search box in logins list --> - <string name="preferences_passwords_saved_logins_search" moz:RemovedIn="125" tools:ignore="UnusedResources">搜尋登入資訊</string> <!-- Hint for search box in passwords list --> <string name="preferences_passwords_saved_logins_search_2">搜尋密碼</string> <!-- The header for the site that a login is for --> @@ -1886,17 +1891,11 @@ <string name="saved_login_reveal_password">顯示密碼</string> <!-- Content Description (for screenreaders etc) read for the button to hide a password in logins --> <string name="saved_login_hide_password">隱藏密碼</string> - <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their logins --> - <string name="logins_biometric_prompt_message" moz:RemovedIn="125" tools:ignore="UnusedResources">解鎖後即可檢視儲存的登入資訊</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their passwords --> <string name="logins_biometric_prompt_message_2">解鎖後即可檢視儲存的密碼</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">保護您的登入資訊與密碼</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_title_2">保護您儲存的密碼</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="logins_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">設定裝置解鎖圖形、PIN 碼或密碼來保護您儲存下來的登入資訊與密碼,避免別人盜用。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_message_2">設定裝置解鎖圖形、PIN 碼或密碼來保護您儲存的密碼,避免別人盜用。</string> <!-- Negative button to ignore warning dialog if users have no device authentication set up --> <string name="logins_warning_dialog_later">稍後處理</string> @@ -1913,8 +1912,6 @@ <string name="saved_logins_sort_strategy_alphabetically">名稱(A-Z 排序)</string> <!-- Saved logins sorting strategy menu item -by last used- (if selected, it will sort saved logins by last used) --> <string name="saved_logins_sort_strategy_last_used">上次使用</string> - <!-- Content description (not visible, for screen readers etc.): Sort saved logins dropdown menu chevron icon --> - <string name="saved_logins_menu_dropdown_chevron_icon_content_description" moz:RemovedIn="125" tools:ignore="UnusedResources">排序登入資訊選單</string> <!-- Content description (not visible, for screen readers etc.) --> <string name="saved_logins_menu_dropdown_chevron_icon_content_description_2">排序密碼選單</string> @@ -1924,42 +1921,28 @@ <string name="preferences_autofill">自動填寫</string> <!-- Preference and title for managing the settings for addresses --> <string name="preferences_addresses">地址</string> - <!-- Preference and title for managing the settings for credit cards --> - <string name="preferences_credit_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">信用卡</string> <!-- Preference and title for managing the settings for payment methods --> <string name="preferences_credit_cards_2">付款方式</string> <!-- Preference for saving and autofilling credit cards --> - <string name="preferences_credit_cards_save_and_autofill_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">儲存並自動填寫卡片</string> - <!-- Preference for saving and autofilling credit cards --> <string name="preferences_credit_cards_save_and_autofill_cards_2">儲存並自動填寫付款方式</string> - <!-- Preference summary for saving and autofilling credit card data --> - <string name="preferences_credit_cards_save_and_autofill_cards_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">資料有加密</string> <!-- Preference summary for saving and autofilling payment method data. Parameter will be replaced by app name. --> <string name="preferences_credit_cards_save_and_autofill_cards_summary_2">%s 會加密您儲存的所有付款方式資料</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is not signed into sync --> <string name="preferences_credit_cards_sync_cards_across_devices">在不同裝置間同步卡片資料</string> <!-- Preference option for syncing credit cards across devices. This is displayed when the user is signed into sync --> <string name="preferences_credit_cards_sync_cards">同步信用卡資訊</string> - <!-- Preference option for adding a credit card --> - <string name="preferences_credit_cards_add_credit_card" moz:RemovedIn="125" tools:ignore="UnusedResources">新增信用卡</string> <!-- Preference option for adding a card --> <string name="preferences_credit_cards_add_credit_card_2">新增付款卡片</string> - <!-- Preference option for managing saved credit cards --> - <string name="preferences_credit_cards_manage_saved_cards" moz:RemovedIn="125" tools:ignore="UnusedResources">管理已儲存的卡片</string> <!-- Preference option for managing saved cards --> <string name="preferences_credit_cards_manage_saved_cards_2">管理卡片</string> <!-- Preference option for adding an address --> <string name="preferences_addresses_add_address">新增地址</string> <!-- Preference option for managing saved addresses --> <string name="preferences_addresses_manage_addresses">管理已存地址</string> - <!-- Preference for saving and autofilling addresses --> - <string name="preferences_addresses_save_and_autofill_addresses" moz:RemovedIn="125" tools:ignore="UnusedResources">儲存並自動填寫地址</string> <!-- Preference for saving and filling addresses --> <string name="preferences_addresses_save_and_autofill_addresses_2">儲存並自動填寫地址</string> - <!-- Preference summary for saving and autofilling address data --> - <string name="preferences_addresses_save_and_autofill_addresses_summary" moz:RemovedIn="125" tools:ignore="UnusedResources">包含電話號碼、E-Mail、收件地址等資訊</string> <!-- Preference summary for saving and filling address data --> <string name="preferences_addresses_save_and_autofill_addresses_summary_2">包含電話號碼與電子郵件地址</string> @@ -1983,8 +1966,6 @@ <!-- The text for the "Delete card" button for deleting a credit card --> <string name="credit_cards_delete_card_button">刪除卡片</string> <!-- The text for the confirmation message of "Delete card" dialog --> - <string name="credit_cards_delete_dialog_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">你確定要刪除這張信用卡嗎?</string> - <!-- The text for the confirmation message of "Delete card" dialog --> <string name="credit_cards_delete_dialog_confirmation_2">要刪除卡片嗎?</string> <!-- The text for the positive button on "Delete card" dialog --> <string name="credit_cards_delete_dialog_button">刪除</string> @@ -1998,24 +1979,15 @@ <!-- Title of the "Saved cards" screen --> <string name="credit_cards_saved_cards">已儲存的卡片</string> - <!-- Error message for credit card number validation --> - <string name="credit_cards_number_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">請輸入有效的信用卡號</string> - <!-- Error message for card number validation --> <string name="credit_cards_number_validation_error_message_2">請輸入有效卡號</string> - <!-- Error message for credit card name on card validation --> - <string name="credit_cards_name_on_card_validation_error_message" moz:RemovedIn="125" tools:ignore="UnusedResources">請填寫此欄位</string> <!-- Error message for card name on card validation --> <string name="credit_cards_name_on_card_validation_error_message_2">請輸入持卡人姓名</string> <!-- Message displayed in biometric prompt displayed for authentication before allowing users to view their saved credit cards --> <string name="credit_cards_biometric_prompt_message">解鎖後即可檢視儲存的卡片資訊</string> <!-- Title of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_title" moz:RemovedIn="125" tools:ignore="UnusedResources">保護您的信用卡資訊</string> - <!-- Title of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_title_2">保護您儲存的付款方式</string> <!-- Message of warning dialog if users have no device authentication set up --> - <string name="credit_cards_warning_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">設定裝置解鎖圖形、PIN 碼或密碼來保護您儲存的信用卡資訊,避免別人盜用。</string> - <!-- Message of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_message_3">設定裝置解鎖圖形、PIN 碼或密碼來保護您儲存的付款方式資訊,避免別人盜用。</string> <!-- Positive button to send users to set up a pin of warning dialog if users have no device authentication set up --> <string name="credit_cards_warning_dialog_set_up_now">立即設定</string> @@ -2024,9 +1996,6 @@ <!-- Title of PIN verification dialog to direct users to re-enter their device credentials to access their credit cards --> <string name="credit_cards_biometric_prompt_message_pin">裝置解鎖</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored credit card information --> - <string name="credit_cards_biometric_prompt_unlock_message" moz:RemovedIn="125" tools:ignore="UnusedResources">解鎖後,即可使用儲存的信用卡資訊</string> - <!-- Message displayed in biometric prompt for authentication, before allowing users to use their stored payment method information --> <string name="credit_cards_biometric_prompt_unlock_message_2">解鎖後即可使用儲存的付款方式</string> <!-- Title of the "Add address" screen --> @@ -2035,12 +2004,6 @@ <string name="addresses_edit_address">編輯地址</string> <!-- Title of the "Manage addresses" screen --> <string name="addresses_manage_addresses">管理已存地址</string> - <!-- The header for the first name of an address --> - <string name="addresses_first_name" moz:removedIn="125" tools:ignore="UnusedResources">名字</string> - <!-- The header for the middle name of an address --> - <string name="addresses_middle_name" moz:removedIn="125" tools:ignore="UnusedResources">中間名</string> - <!-- The header for the last name of an address --> - <string name="addresses_last_name" moz:removedIn="125" tools:ignore="UnusedResources">姓氏</string> <!-- The header for the name of an address. Name represents a person's full name, typically made up of a first, middle and last name, e.g. John Joe Doe. --> <string name="addresses_name">姓名</string> <!-- The header for the street address of an address --> @@ -2067,8 +2030,6 @@ <string name="addressess_delete_address_button">刪除地址</string> <!-- The title for the "Delete address" confirmation dialog --> - <string name="addressess_confirm_dialog_message" moz:RemovedIn="125" tools:ignore="UnusedResources">您確定要刪除這筆地址嗎?</string> - <!-- The title for the "Delete address" confirmation dialog --> <string name="addressess_confirm_dialog_message_2">要刪除這個地址嗎?</string> <!-- The text for the positive button on "Delete address" dialog --> <string name="addressess_confirm_dialog_ok_button">刪除</string> @@ -2166,49 +2127,29 @@ <string name="login_menu_delete_button">刪除</string> <!-- Login overflow menu edit button --> <string name="login_menu_edit_button">編輯</string> - <!-- Message in delete confirmation dialog for logins --> - <string name="login_deletion_confirmation" moz:RemovedIn="125" tools:ignore="UnusedResources">您確定要刪除這筆登入資訊嗎?</string> <!-- Message in delete confirmation dialog for password --> <string name="login_deletion_confirmation_2">你確定要刪除這筆密碼嗎?</string> <!-- Positive action of a dialog asking to delete --> <string name="dialog_delete_positive">刪除</string> <!-- Negative action of a dialog asking to delete login --> <string name="dialog_delete_negative">取消</string> - <!-- The saved login options menu description. --> - <string name="login_options_menu" moz:RemovedIn="125" tools:ignore="UnusedResources">登入選項</string> <!-- The saved password options menu description. --> <string name="login_options_menu_2">密碼選項</string> - <!-- The editable text field for a login's web address. --> - <string name="saved_login_hostname_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登入資訊當中,網址的輸入欄位。</string> <!-- The editable text field for a website address. --> <string name="saved_login_hostname_description_3">網址的輸入欄位。</string> - <!-- The editable text field for a login's username. --> - <string name="saved_login_username_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登入資訊當中,使用者名稱的輸入欄位。</string> <!-- The editable text field for a username. --> <string name="saved_login_username_description_3">使用者名稱的輸入欄位。</string> <!-- The editable text field for a login's password. --> - <string name="saved_login_password_description" moz:RemovedIn="125" tools:ignore="UnusedResources">登入資訊當中,密碼的輸入欄位。</string> - <!-- The editable text field for a login's password. --> <string name="saved_login_password_description_2">密碼的輸入欄位。</string> - <!-- The button description to save changes to an edited login. --> - <string name="save_changes_to_login" moz:RemovedIn="125" tools:ignore="UnusedResources">儲存編輯過的登入資訊。</string> <!-- The button description to save changes to an edited password. --> <string name="save_changes_to_login_2">儲存變更。</string> - <!-- The page title for editing a saved login. --> - <string name="edit" moz:RemovedIn="125" tools:ignore="UnusedResources">編輯</string> <!-- The page title for editing a saved password. --> <string name="edit_2">編輯密碼</string> - <!-- The page title for adding new login. --> - <string name="add_login" moz:RemovedIn="125" tools:ignore="UnusedResources">新增登入資訊</string> <!-- The page title for adding new password. --> <string name="add_login_2">新增密碼</string> - <!-- The error message in add/edit login view when password field is blank. --> - <string name="saved_login_password_required" moz:RemovedIn="125" tools:ignore="UnusedResources">需要密碼</string> <!-- Error text displayed underneath the password field when it is in an error case. --> <string name="saved_login_password_required_2">輸入密碼</string> <!-- The error message in add login view when username field is blank. --> - <string name="saved_login_username_required" moz:RemovedIn="125" tools:ignore="UnusedResources">必須輸入使用者名稱</string> - <!-- The error message in add login view when username field is blank. --> <string name="saved_login_username_required_2">輸入使用者名稱</string> <!-- The error message in add login view when hostname field is blank. --> <string name="saved_login_hostname_required" tools:ignore="UnusedResources">必須輸入主機名稱</string> @@ -2424,7 +2365,7 @@ <!-- Title for info card displayed after the user reports a product is back in stock. --> <string name="review_quality_check_analysis_requested_info_title">感謝您回報!</string> <!-- Text for body of info card displayed after the user reports a product is back in stock. --> - <string name="review_quality_check_analysis_requested_info_body">我們將在 24 小時內提供更新過的評論分析資訊,請稍候再回來。</string> + <string name="review_quality_check_analysis_requested_info_body">我們將在 24 小時內提供更新過的評論分析資訊,請稍後再回來。</string> <!-- Title for info card displayed when the user review checker while on a product that Fakespot does not analyze (e.g. gift cards, music). --> <string name="review_quality_check_not_analyzable_info_title">我們無法檢查這些評論</string> <!-- Text for body of info card displayed when the user review checker while on a product that Fakespot does not analyze (e.g. gift cards, music). --> @@ -2614,6 +2555,9 @@ <!-- Content description (not visible, for screen readers etc.) for closing the translations bottom sheet. --> <string name="translation_option_bottom_sheet_close_content_description">關閉翻譯表單</string> + <!-- The title of the warning card informs the user that an error has occurred at page settings. --> + <string name="translation_option_bottom_sheet_error_warning_text">暫時無法使用某些設定。</string> + <!-- Translation settings dialog --> <!-- Title of the translation settings dialog that allows a user to set their preferred translation settings. --> <string name="translation_settings_toolbar_title">翻譯</string> @@ -2636,6 +2580,9 @@ <!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. --> <string name="automatic_translation_header_preference">請選擇一種語言,來管理該語言的「總是翻譯」與「永不翻譯」偏好設定。</string> + <!-- The title of the warning card informs the user that the system could not load languages for translation settings. --> + <string name="automatic_translation_error_warning_text">無法載入語言,請稍後再回來。</string> + <!-- Automatic translation options preference screen --> <!-- Preference option for offering to translate. Radio button title text.--> <string name="automatic_translation_option_offer_to_translate_title_preference">提供翻譯(預設)</string> @@ -2659,6 +2606,8 @@ <!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_item_list_content_description_preference">移除 %1$s</string> + <!-- The title of the warning card informs the user that an error has occurred at the never translate sites list. --> + <string name="never_translate_site_error_warning_text">無法載入網站清單,請稍後再回來。</string> <!-- The Delete site dialogue title will appear when the user clicks on a list item. The first parameter is web site url (for example:"wikipedia.com") --> <string name="never_translate_site_dialog_title_preference">要刪除 %1$s 嗎?</string> @@ -2736,13 +2685,18 @@ <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">瀏覽上一頁</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">開啟除錯抽屜</string> + <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> <string name="debug_drawer_tab_tools_title">分頁工具</string> <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">分頁數量</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">使用中</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" tools:ignore="UnusedResources">使用中</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">使用中</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">未使用</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2753,6 +2707,16 @@ <string name="debug_drawer_tab_tools_tab_creation_tool_title">分頁產生工具</string> <!-- The label of the text field in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_text_field_label">要產生的分頁數量</string> + <!-- The error message of the text field in the tab creation tool when the text field is empty --> + <string name="debug_drawer_tab_tools_tab_quantity_empty_error">文字欄位空白</string> + <!-- The error message of the text field in the tab creation tool when the text field has characters other than digits --> + <string name="debug_drawer_tab_tools_tab_quantity_non_digits_error">僅可輸入正整數</string> + <!-- The error message of the text field in the tab creation tool when the text field is a zero --> + <string name="debug_drawer_tab_tools_tab_quantity_non_zero_error">僅可輸入大於 0 的數字</string> + <!-- The error message of the text field in the tab creation tool when the text field is a + quantity greater than the max tabs. The first parameter is the maximum number of tabs + that can be generated in one operation.--> + <string name="debug_drawer_tab_tools_tab_quantity_exceed_max_error">超過單一操作中可產生的最大分頁數量(%1$s)</string> <!-- The button text to add tabs to the active tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_active">新增至使用中的分頁</string> <!-- The button text to add tabs to the inactive tab group in the tab creation tool. --> @@ -2769,11 +2733,11 @@ <!-- The privacy notice link --> <string name="micro_survey_privacy_notice">隱私權公告</string> <!-- The submit button label text --> - <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">送出</string> + <string name="micro_survey_submit_button_label">送出</string> <!-- The close button label text --> - <string name="micro_survey_close_button_label">關閉</string> + <string name="micro_survey_close_button_label" tools:ignore="UnusedResources">關閉</string> <!-- The survey completion confirmation text --> - <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">感謝您的意見回饋!</string> + <string name="micro_survey_feedback_confirmation">感謝您的意見回饋!</string> <!-- Option for likert scale --> <string name="likert_scale_option_1" tools:ignore="UnusedResources">非常滿意</string> <!-- Option for likert scale --> @@ -2785,6 +2749,14 @@ <!-- Option for likert scale --> <string name="likert_scale_option_5" tools:ignore="UnusedResources">非常不滿意</string> + <!-- Microsurvey accessibility --> + <!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. --> + <string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">開啟問卷</string> + <!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. --> + <string name="microsurvey_close_handle_content_description" tools:ignore="UnusedResources">關閉問卷</string> + <!-- Content description for "X" button that is closing microsurvey. --> + <string name="microsurvey_close_button_content_description" tools:ignore="UnusedResources">關閉</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">登入資訊</string> diff --git a/mobile/android/fenix/app/src/main/res/values/attrs.xml b/mobile/android/fenix/app/src/main/res/values/attrs.xml index edd57c6d88..fef61285a5 100644 --- a/mobile/android/fenix/app/src/main/res/values/attrs.xml +++ b/mobile/android/fenix/app/src/main/res/values/attrs.xml @@ -29,7 +29,7 @@ <!-- Disabled text --> <attr name="textDisabled" format="reference" /> <!-- Warning text --> - <attr name="textWarning" format="reference"/> + <attr name="textCritical" format="reference"/> <!-- Small heading, Text link --> <attr name="textAccent" format="reference" /> <!-- Text Inverted/On Color --> diff --git a/mobile/android/fenix/app/src/main/res/values/colors.xml b/mobile/android/fenix/app/src/main/res/values/colors.xml index 9abba577a2..d5d58df47e 100644 --- a/mobile/android/fenix/app/src/main/res/values/colors.xml +++ b/mobile/android/fenix/app/src/main/res/values/colors.xml @@ -27,11 +27,11 @@ <!-- Warning background --> <color name="fx_mobile_layer_color_warning" tools:ignore="UnusedResources">@color/photonYellow20</color> <!-- Confirmation background --> - <color name="fx_mobile_layer_color_confirmation" tools:ignore="UnusedResources">@color/photonGreen20</color> + <color name="fx_mobile_layer_color_success" tools:ignore="UnusedResources">@color/photonGreen20</color> <!-- Error background --> - <color name="fx_mobile_layer_color_error" tools:ignore="UnusedResources">@color/photonRed10</color> + <color name="fx_mobile_layer_color_critical" tools:ignore="UnusedResources">@color/photonRed10</color> <!-- Info background --> - <color name="fx_mobile_layer_color_info" tools:ignore="UnusedResources">@color/photonBlue50A44</color> + <color name="fx_mobile_layer_color_information" tools:ignore="UnusedResources">@color/photonBlue50A44</color> <!-- Action --> <!-- Primary button, Snackbar, Floating action button, Chip selected --> @@ -47,11 +47,11 @@ <!-- Warning button --> <color name="fx_mobile_action_color_warning" tools:ignore="UnusedResources">@color/photonYellow60A40</color> <!-- Confirmation button --> - <color name="fx_mobile_action_color_confirmation" tools:ignore="UnusedResources">@color/photonGreen60</color> + <color name="fx_mobile_action_color_success" tools:ignore="UnusedResources">@color/photonGreen60</color> <!-- Error button --> - <color name="fx_mobile_action_color_error" tools:ignore="UnusedResources">@color/photonRed30</color> + <color name="fx_mobile_action_color_critical" tools:ignore="UnusedResources">@color/photonRed30</color> <!-- Info button --> - <color name="fx_mobile_action_color_info" tools:ignore="UnusedResources">@color/photonBlue50</color> + <color name="fx_mobile_action_color_information" tools:ignore="UnusedResources">@color/photonBlue50</color> <!-- Checkbox default, Radio button default --> <color name="fx_mobile_action_color_form_default" tools:ignore="UnusedResources">@color/photonDarkGrey90</color> <!-- Checkbox selected, Radio button selected --> @@ -77,9 +77,9 @@ <!-- Disabled text --> <color name="fx_mobile_text_color_disabled">@color/photonDarkGrey90A40</color> <!-- Warning text --> - <color name="fx_mobile_text_color_warning">@color/photonRed70</color> + <color name="fx_mobile_text_color_critical">@color/photonRed70</color> <!-- Warning text on Secondary button --> - <color name="fx_mobile_text_color_warning_button">@color/photonRed70</color> + <color name="fx_mobile_text_color_critical_button">@color/photonRed70</color> <!-- Small heading, Text link --> <color name="fx_mobile_text_color_accent">@color/photonViolet70</color> <!-- Small heading, Text link --> @@ -116,10 +116,10 @@ <color name="fx_mobile_icon_color_information">@color/photonBlue30</color> <!-- Icon button --> <color name="fx_mobile_icon_color_button" tools:ignore="UnusedResources">@color/photonInk20</color> - <color name="fx_mobile_icon_color_warning" tools:ignore="UnusedResources">@color/photonRed70</color> + <color name="fx_mobile_icon_color_critical" tools:ignore="UnusedResources">@color/photonRed70</color> <!-- Warning icon on Secondary button --> - <color name="fx_mobile_icon_color_warning_button">@color/photonRed70</color> - <color name="fx_mobile_icon_color_accent_violet">@color/photonViolet60</color> + <color name="fx_mobile_icon_color_critical_button">@color/photonRed70</color> + <color name="fx_mobile_icon_color_accent_violet">@color/photonViolet70</color> <color name="fx_mobile_icon_color_accent_blue">@color/photonBlue60</color> <color name="fx_mobile_icon_color_accent_pink">@color/photonPink60</color> <color name="fx_mobile_icon_color_accent_green">@color/photonGreen60</color> @@ -150,15 +150,15 @@ <!-- Form parts --> <color name="fx_mobile_border_color_disabled" tools:ignore="UnusedResources">@color/photonDarkGrey90A40</color> <!-- Form parts --> - <color name="fx_mobile_border_color_warning" tools:ignore="UnusedResources">@color/photonRed70</color> + <color name="fx_mobile_border_color_critical" tools:ignore="UnusedResources">@color/photonRed70</color> <!-- Private theme color variables --> <!-- Layers --> <!-- Default Screen background, Frontlayer background, App Bar Top, App Bar Bottom, Frontlayer header --> - <color name="fx_mobile_private_layer_color_1">@color/photonInk50</color> + <color name="fx_mobile_private_layer_color_1">@color/photonViolet90</color> <!-- Card background, Menu background, Dialog, Banner --> - <color name="fx_mobile_private_layer_color_2">@color/photonInk50</color> + <color name="fx_mobile_private_layer_color_2">@color/photonViolet90</color> <!-- Search --> <color name="fx_mobile_private_layer_color_3">@color/photonInk90</color> <color name="fx_mobile_private_layer_color_search">@color/photonInk90</color> @@ -184,7 +184,7 @@ <!-- Primary button, Snackbar, Floating action button, Chip selected --> <color name="fx_mobile_private_action_color_primary">@color/photonViolet60</color> <!-- Secondary button --> - <color name="fx_mobile_private_action_color_secondary" tools:ignore="UnusedResources">@color/photonLightGrey30</color> + <color name="fx_mobile_private_action_color_secondary" tools:ignore="UnusedResources">@color/photonDarkGrey05</color> <!-- Filter --> <color name="fx_mobile_private_action_color_tertiary" tools:ignore="UnusedResources">@color/photonDarkGrey10</color> <!-- Chip --> @@ -214,9 +214,9 @@ <!-- Disabled text --> <color name="fx_mobile_private_text_color_disabled">@color/photonLightGrey05A40</color> <!-- Warning text --> - <color name="fx_mobile_private_text_color_warning">@color/photonRed20</color> + <color name="fx_mobile_private_text_color_critical">@color/photonRed20</color> <!-- Warning text on Secondary button --> - <color name="fx_mobile_private_text_color_warning_button" tools:ignore="UnusedResources">@color/photonRed70</color> + <color name="fx_mobile_private_text_color_critical_button" tools:ignore="UnusedResources">@color/photonRed20</color> <!-- Small heading, Text link --> <color name="fx_mobile_private_text_color_accent">@color/photonViolet20</color> <!-- Small heading, Text link --> @@ -228,7 +228,7 @@ <!-- Action Primary text --> <color name="fx_mobile_private_text_color_action_primary">@color/photonLightGrey05</color> <!-- Action Secondary text --> - <color name="fx_mobile_private_text_color_action_secondary" tools:ignore="UnusedResources">@color/photonDarkGrey90</color> + <color name="fx_mobile_private_text_color_action_secondary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Tertiary text --> <color name="fx_mobile_private_text_color_action_tertiary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Tertiary Active text --> @@ -251,9 +251,9 @@ <color name="fx_mobile_private_icon_color_information" tools:ignore="UnusedResources">@color/photonBlue30</color> <!-- Icon button --> <color name="fx_mobile_private_icon_color_button" tools:ignore="UnusedResources">@color/photonLightGrey05</color> - <color name="fx_mobile_private_icon_color_warning" tools:ignore="UnusedResources">@color/photonRed20</color> + <color name="fx_mobile_private_icon_color_critical" tools:ignore="UnusedResources">@color/photonRed20</color> <!-- Warning icon on Secondary button --> - <color name="fx_mobile_private_icon_color_warning_button" tools:ignore="UnusedResources">@color/photonRed70</color> + <color name="fx_mobile_private_icon_color_critical_button" tools:ignore="UnusedResources">@color/photonRed20</color> <color name="fx_mobile_private_icon_color_accent_violet" tools:ignore="UnusedResources">@color/photonViolet20</color> <color name="fx_mobile_private_icon_color_accent_blue" tools:ignore="UnusedResources">@color/photonBlue20</color> <color name="fx_mobile_private_icon_color_accent_pink" tools:ignore="UnusedResources">@color/photonPink20</color> @@ -262,7 +262,7 @@ <!-- Action Primary Icon --> <color name="fx_mobile_private_icon_color_action_primary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Secondary Icon --> - <color name="fx_mobile_private_icon_color_action_secondary" tools:ignore="UnusedResources">@color/photonDarkGrey90</color> + <color name="fx_mobile_private_icon_color_action_secondary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Action Tertiary Icon --> <color name="fx_mobile_private_icon_color_action_tertiary" tools:ignore="UnusedResources">@color/photonLightGrey05</color> <!-- Reader, ETP Shield --> @@ -272,7 +272,7 @@ <!-- Border --> <!-- Default, Divider, Dotted --> - <color name="fx_mobile_private_border_color_primary">@color/photonDarkGrey05</color> + <color name="fx_mobile_private_border_color_primary">@color/photonInk05</color> <color name="fx_mobile_private_border_color_secondary">@color/photonInk10</color> <!-- Onboarding --> <color name="fx_mobile_private_border_color_inverted" tools:ignore="UnusedResources">@color/photonLightGrey30</color> @@ -283,7 +283,7 @@ <!-- Form parts --> <color name="fx_mobile_private_border_color_disabled" tools:ignore="UnusedResources">@color/photonLightGrey05A40</color> <!-- Form parts --> - <color name="fx_mobile_private_border_color_warning" tools:ignore="UnusedResources">@color/photonRed40</color> + <color name="fx_mobile_private_border_color_critical" tools:ignore="UnusedResources">@color/photonRed20</color> <!-- Toolbar divider --> <color name="fx_mobile_private_border_color_toolbar_divider">@color/photonViolet80</color> diff --git a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml index 8e94d3251f..678602bd9b 100644 --- a/mobile/android/fenix/app/src/main/res/values/preference_keys.xml +++ b/mobile/android/fenix/app/src/main/res/values/preference_keys.xml @@ -17,6 +17,7 @@ <string name="pref_key_accessibility_force_enable_zoom" translatable="false">pref_key_accessibility_force_enable_zoom</string> <string name="pref_key_advanced" translatable="false">pref_key_advanced</string> <string name="pref_key_language" translatable="false">pref_key_language</string> + <string name="pref_key_translation" translatable="false">pref_key_translation</string> <string name="pref_key_data_choices" translatable="false">pref_key_data_choices</string> <string name="pref_key_delete_browsing_data" translatable="false">pref_key_delete_browsing_data</string> <string name="pref_key_delete_browsing_data_on_quit_preference" translatable="false">pref_key_delete_browsing_data_on_quit_preference</string> @@ -53,6 +54,9 @@ <string name="pref_key_override_sync_tokenserver" translatable="false">pref_key_override_sync_tokenserver</string> <string name="pref_key_override_push_server" translatable="false">pref_key_override_push_server</string> <string name="pref_key_sync_debug_quit" translatable="false">pref_key_sync_debug_quit</string> + <string name="pref_key_sync_debug_network_error" translatable="false">pref_key_sync_debug_network_error</string> + <string name="pref_key_sync_debug_temporary_auth_error" translatable="false">pref_key_sync_debug_temporary_auth_error</string> + <string name="pref_key_sync_debug_permanent_auth_error" translatable="false">pref_key_sync_debug_permanent_auth_error</string> <string name="pref_key_customize" translatable="false">pref_key_customize</string> <string name="pref_key_private_browsing" translatable="false">pref_key_private_browsing</string> <string name="pref_key_leakcanary" translatable="false">pref_key_leakcanary</string> @@ -164,7 +168,7 @@ <string name="pref_key_swipe_toolbar_switch_tabs" translatable="false">pref_key_swipe_toolbar_switch_tabs</string> <string name="pref_key_swipe_toolbar_show_tabs" translatable="false">pref_key_swipe_toolbar_show_tabs</string> <string name="pref_key_recent_tabs" translatable="false">pref_key_recent_tabs</string> - <string name="pref_key_recent_bookmarks" translatable="false">pref_key_recent_bookmarks</string> + <string name="pref_key_customization_bookmarks" translatable="false">pref_key_recent_bookmarks</string> <string name="pref_key_customization_category_toolbar" translatable="false">pref_key_customization_category_toolbar</string> <!-- HTTPS Only Settings --> diff --git a/mobile/android/fenix/app/src/main/res/values/static_strings.xml b/mobile/android/fenix/app/src/main/res/values/static_strings.xml index 66ec907040..6ed8c8901c 100644 --- a/mobile/android/fenix/app/src/main/res/values/static_strings.xml +++ b/mobile/android/fenix/app/src/main/res/values/static_strings.xml @@ -66,6 +66,12 @@ <string name="preferences_sync_debug_quit_button_title">Stop Firefox</string> <!-- Quit app button summary for the Sync Debug preferences --> <string name="preferences_sync_debug_quit_button_summary">Custom server changes will take effect on the next Firefox run.</string> + <!-- Button title for simulating an FxA network error inside the Sync Debug menu --> + <string name="preferences_sync_debug_network_error_button_title">Simulate account network error</string> + <!-- Button title for simulating an FxA temporary auth error inside the Sync Debug menu --> + <string name="preferences_sync_debug_temporary_auth_error_button_title">Simulate temporary account auth error</string> + <!-- Button title for simulating an FxA permanent auth error inside the Sync Debug menu --> + <string name="preferences_sync_debug_permanent_auth_error_button_title">Simulate permanent account auth error</string> <!-- Label for enabling the Tabs Tray to Compose changes --> <string name="preferences_debug_settings_tabs_tray_to_compose" translatable="false">Enable Tabs Tray to Compose rewrite</string> <!-- Label for enabling the Compose Top Sites --> diff --git a/mobile/android/fenix/app/src/main/res/values/strings.xml b/mobile/android/fenix/app/src/main/res/values/strings.xml index a2a5d53866..9cfeb301e5 100644 --- a/mobile/android/fenix/app/src/main/res/values/strings.xml +++ b/mobile/android/fenix/app/src/main/res/values/strings.xml @@ -47,11 +47,19 @@ <!-- Home - Recently saved bookmarks --> <!-- Title for the home screen section with recently saved bookmarks. --> - <string name="recently_saved_title">Recently saved</string> + <string name="recently_saved_title" moz:removedIn="127" tools:ignore="UnusedResources">Recently saved</string> <!-- Content description for the button which navigates the user to show all of their saved bookmarks. --> - <string name="recently_saved_show_all_content_description_2">Show all saved bookmarks</string> + <string name="recently_saved_show_all_content_description_2" moz:removedIn="127" tools:ignore="UnusedResources">Show all saved bookmarks</string> <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> - <string name="recently_saved_menu_item_remove">Remove</string> + <string name="recently_saved_menu_item_remove" moz:removedIn="127" tools:ignore="UnusedResources">Remove</string> + + <!-- Home - Bookmarks --> + <!-- Title for the home screen section with bookmarks. --> + <string name="home_bookmarks_title">Bookmarks</string> + <!-- Content description for the button which navigates the user to show all of their bookmarks. --> + <string name="home_bookmarks_show_all_content_description">Show all bookmarks</string> + <!-- Text for the menu button to remove a recently saved bookmark from the user's home screen --> + <string name="home_bookmarks_menu_item_remove">Remove</string> <!-- About content. The first parameter is the name of the application. (For example: Fenix) --> <string name="about_content">%1$s is produced by Mozilla.</string> @@ -184,6 +192,10 @@ <string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Add-ons</string> <!-- Browser menu button that opens the extensions manager --> <string name="browser_menu_extensions">Extensions</string> + <!-- Browser menu button that opens the extensions manager --> + <string name="browser_menu_manage_extensions">Manage extensions</string> + <!-- Browser menu button that opens AMO in a tab --> + <string name="browser_menu_discover_more_extensions">Discover more extensions</string> <!-- Browser menu button that opens account settings --> <string name="browser_menu_account_settings">Account info</string> <!-- Text displayed when there are no add-ons to be shown --> @@ -202,18 +214,26 @@ <string name="browser_menu_open_in_regular_tab">Open in regular tab</string> <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> <string name="browser_menu_add_to_homescreen">Add to Home screen</string> + <!-- Browser menu toggle that adds a shortcut to the site on the device home screen. --> + <string name="browser_menu_add_to_homescreen_2">Add to Home screen…</string> <!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. --> <string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Install</string> <!-- Content description (not visible, for screen readers etc.) for the Resync tabs button --> <string name="resync_button_content_description">Resync</string> <!-- Browser menu button that opens the find in page menu --> <string name="browser_menu_find_in_page">Find in page</string> + <!-- Browser menu button that opens the find in page menu --> + <string name="browser_menu_find_in_page_2">Find in page…</string> <!-- Browser menu button that opens the translations dialog, which has options to translate the current browser page. --> <string name="browser_menu_translations">Translate page</string> <!-- Browser menu button that saves the current tab to a collection --> + <string name="browser_menu_save_to_collection">Save to collection…</string> + <!-- Browser menu button that saves the current tab to a collection --> <string name="browser_menu_save_to_collection_2">Save to collection</string> <!-- Browser menu button that open a share menu to share the current site --> <string name="browser_menu_share">Share</string> + <!-- Browser menu button that open a share menu to share the current site --> + <string name="browser_menu_share_2">Share…</string> <!-- Browser menu button shown in custom tabs that opens the current tab in Fenix The first parameter is the name of the app defined in app_name (for example: Fenix) --> <string name="browser_menu_open_in_fenix">Open in %1$s</string> @@ -249,6 +269,33 @@ <string name="browser_menu_new_private_tab">New private tab</string> <!-- Browser menu label that navigates to the Password screen --> <string name="browser_menu_passwords">Passwords</string> + <!-- Browser menu label that navigates to the SUMO page for the Firefox for Android release notes. + The first parameter is the name of the app defined in app_name (for example: Fenix)--> + <string name="browser_menu_new_in_firefox">New in %1$s</string> + <!-- Browser menu label that toggles the request for the desktop site of the currently visited page --> + <string name="browser_menu_switch_to_desktop_site">Switch to desktop site</string> + <!-- Browser menu label that navigates to the page tools sub-menu --> + <string name="browser_menu_tools">Tools</string> + <!-- Browser menu label that navigates to the save sub-menu, which contains various save related menu items such as + bookmarking a page, saving to collection, shortcut or as a PDF, and adding to home screen --> + <string name="browser_menu_save">Save</string> + <!-- Browser menu label that bookmarks the currently visited page --> + <string name="browser_menu_bookmark_this_page">Bookmark this page</string> + <!-- Browser menu label that navigates to the edit bookmark screen for the current bookmarked page --> + <string name="browser_menu_edit_bookmark">Edit bookmark</string> + <!-- Browser menu label that the saves the currently visited page as a PDF --> + <string name="browser_menu_save_as_pdf">Save as PDF…</string> + <!-- Browser menu label for turning ON reader view of the current visited page --> + <string name="browser_menu_turn_on_reader_view">Turn on Reader View</string> + <!-- Browser menu label for turning OFF reader view of the current visited page --> + <string name="browser_menu_turn_off_reader_view">Turn off Reader View</string> + <!-- Browser menu label for navigating to the translation feature, which provides language translation options the current visited page --> + <string name="browser_menu_translate_page">Translate page…</string> + <!-- Browser menu label that is displayed when the current page has been translated by the translation feature. + The first parameter is the name of the language that page was translated to (e.g. English). --> + <string name="browser_menu_translated_to">Translated to %1$s</string> + <!-- Browser menu label for the print feature --> + <string name="browser_menu_print">Print…</string> <!-- Extensions management fragment --> <!-- Text displayed when there are no extensions to be shown --> @@ -541,6 +588,10 @@ <string name="preferences_account_sync_error">Reconnect to resume syncing</string> <!-- Preference for language --> <string name="preferences_language">Language</string> + <!-- Preference for translation --> + <string name="preferences_translation" moz:removedIn="127" tools:ignore="UnusedResources">Translation</string> + <!-- Preference for translations --> + <string name="preferences_translations">Translations</string> <!-- Preference for data choices --> <string name="preferences_data_choices">Data choices</string> <!-- Preference for data collection --> @@ -641,7 +692,9 @@ <!-- Header text for jumping back into the recent tab in customize the home screen --> <string name="customize_toggle_jump_back_in">Jump back in</string> <!-- Title for the customize home screen section with recently saved bookmarks. --> - <string name="customize_toggle_recent_bookmarks">Recent bookmarks</string> + <string name="customize_toggle_recent_bookmarks" moz:removedIn="127" tools:ignore="UnusedResources">Recent bookmarks</string> + <!-- Title for the customize home screen section with bookmarks. --> + <string name="customize_toggle_bookmarks">Bookmarks</string> <!-- Title for the customize home screen section with recently visited. Recently visited is a section where users see a list of tabs that they have visited in the past few days --> <string name="customize_toggle_recently_visited">Recently visited</string> @@ -774,6 +827,14 @@ <!-- %s is the device name --> <string name="fxa_tab_received_from_notification_name">Tab from %s</string> + <!-- Close Synced Tabs --> + <!-- The title for a notification shown when the user closes tabs that are currently + open on this device from another device that's signed in to the same Mozilla account. + %1$s is a placeholder for the app name; %2$d is the number of tabs closed. --> + <string name="fxa_tabs_closed_notification_title">%1$s tabs closed: %2$d</string> + <!-- The body for a "closed synced tabs" notification. --> + <string name="fxa_tabs_closed_text">View recently closed tabs</string> + <!-- Advanced Preferences --> <!-- Preference for tracking protection exceptions --> <string name="preferences_tracking_protection_exceptions">Exceptions</string> @@ -2403,6 +2464,8 @@ <string name="translations_bottom_sheet_negative_button">Not now</string> <!-- Button text on the translations dialog to restore the translated website back to the original untranslated version. --> <string name="translations_bottom_sheet_negative_button_restore">Show original</string> + <!-- Accessibility announcement (not visible, for screen readers etc.) for the translations dialog after restore button was pressed that indicates the original untranslated page was loaded. --> + <string name="translations_bottom_sheet_restore_accessibility_announcement">Original untranslated page loaded</string> <!-- Button text on the translations dialog when a translation error appears, used to dismiss the dialog and return to the browser. --> <string name="translations_bottom_sheet_negative_button_error">Done</string> <!-- Button text on the translations dialog to begin a translation of the website. --> @@ -2576,6 +2639,8 @@ <string name="debug_drawer_title">Debug Tools</string> <!-- Content description (not visible, for screen readers etc.): Navigate back within the debug drawer. --> <string name="debug_drawer_back_button_content_description">Navigate back</string> + <!-- Content description (not visible, for screen readers etc.): Open debug drawer. --> + <string name="debug_drawer_fab_content_description">Open debug drawer</string> <!-- Debug drawer tabs tools --> <!-- The title of the Tab Tools feature in the Debug Drawer. --> @@ -2583,7 +2648,10 @@ <!-- The title of the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_title">Tab count</string> <!-- The active tab count category in the tab count section in Tab Tools. --> - <string name="debug_drawer_tab_tools_tab_count_normal">Active</string> + <string name="debug_drawer_tab_tools_tab_count_normal" moz:removedIn="127" + tools:ignore="UnusedResources">Active</string> + <!-- The active tab count category in the tab count section in Tab Tools. --> + <string name="debug_drawer_tab_tools_tab_count_active">Active</string> <!-- The inactive tab count category in the tab count section in Tab Tools. --> <string name="debug_drawer_tab_tools_tab_count_inactive">Inactive</string> <!-- The private tab count category in the tab count section in Tab Tools. --> @@ -2601,6 +2669,31 @@ <!-- The button text to add tabs to the private tab group in the tab creation tool. --> <string name="debug_drawer_tab_tools_tab_creation_tool_button_text_private">Add to private tabs</string> + <!-- Micro survey --> + + <!-- The continue button label --> + <string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Continue</string> + <!-- The survey header --> + <string name="micro_survey_survey_header">Complete this survey</string> + <!-- The privacy notice link --> + <string name="micro_survey_privacy_notice">Privacy Notice</string> + <!-- The submit button label text --> + <string name="micro_survey_submit_button_label" tools:ignore="UnusedResources">Submit</string> + <!-- The close button label text --> + <string name="micro_survey_close_button_label">Close</string> + <!-- The survey completion confirmation text --> + <string name="micro_survey_feedback_confirmation" tools:ignore="UnusedResources">Thanks for your feedback!</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_1" tools:ignore="UnusedResources">Very Satisfied</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_2" tools:ignore="UnusedResources">Satisfied</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_3" tools:ignore="UnusedResources">Neutral</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_4" tools:ignore="UnusedResources">Dissatisfied</string> + <!-- Option for likert scale --> + <string name="likert_scale_option_5" tools:ignore="UnusedResources">Very Dissatisfied</string> + <!-- Debug drawer logins --> <!-- The title of the Logins feature in the Debug Drawer. --> <string name="debug_drawer_logins_title">Logins</string> diff --git a/mobile/android/fenix/app/src/main/res/values/styles.xml b/mobile/android/fenix/app/src/main/res/values/styles.xml index c7a7932b8a..420511a5e2 100644 --- a/mobile/android/fenix/app/src/main/res/values/styles.xml +++ b/mobile/android/fenix/app/src/main/res/values/styles.xml @@ -34,9 +34,9 @@ <item name="android:textColorLink">@color/fx_mobile_text_color_accent</item> <item name="mozacInputLayoutErrorTextColor" - tools:ignore="UnusedResources">@color/fx_mobile_text_color_warning</item> + tools:ignore="UnusedResources">@color/fx_mobile_text_color_critical</item> <item name="mozacInputLayoutErrorIconColor" - tools:ignore="UnusedResources">@color/fx_mobile_text_color_warning</item> + tools:ignore="UnusedResources">@color/fx_mobile_text_color_critical</item> <item name="mozacLoginSelectHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> <item name="mozacSelectCreditCardHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> <item name="mozacSelectAddressHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> @@ -67,7 +67,7 @@ <!-- Disabled text --> <item name="textDisabled">@color/fx_mobile_text_color_disabled</item> <!-- Warning text --> - <item name="textWarning">@color/fx_mobile_text_color_warning</item> + <item name="textCritical">@color/fx_mobile_text_color_critical</item> <!-- Small heading, Text link --> <item name="textAccent">@color/fx_mobile_text_color_accent</item> <!-- Text Inverted/On Color --> @@ -230,9 +230,9 @@ <item name="bottomSheetDialogTheme">@style/BottomSheetPrivate</item> <item name="mozacInputLayoutErrorTextColor" - tools:ignore="UnusedResources">@color/fx_mobile_private_text_color_warning</item> + tools:ignore="UnusedResources">@color/fx_mobile_private_text_color_critical</item> <item name="mozacInputLayoutErrorIconColor" - tools:ignore="UnusedResources">@color/fx_mobile_private_text_color_warning</item> + tools:ignore="UnusedResources">@color/fx_mobile_private_text_color_critical</item> <item name="mozacLoginSelectHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> <item name="mozacSelectCreditCardHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> <item name="mozacSelectAddressHeaderTextStyle" tools:ignore="UnusedResources">@style/SelectPromptHeaderTextStyle</item> @@ -263,7 +263,7 @@ <!-- Disabled text --> <item name="textDisabled">@color/fx_mobile_private_text_color_disabled</item> <!-- Warning text --> - <item name="textWarning">@color/fx_mobile_private_text_color_warning</item> + <item name="textCritical">@color/fx_mobile_private_text_color_critical</item> <!-- Small heading, Text link --> <item name="textAccent">@color/fx_mobile_private_text_color_accent</item> <!-- Text Inverted/On Color --> @@ -378,8 +378,8 @@ </style> <style name="DestructiveButton" parent="NeutralButton"> - <item name="iconTint">@color/fx_mobile_icon_color_warning_button</item> - <item name="android:textColor">@color/fx_mobile_text_color_warning_button</item> + <item name="iconTint">@color/fx_mobile_icon_color_critical_button</item> + <item name="android:textColor">@color/fx_mobile_text_color_critical_button</item> </style> <style name="PositiveButton" parent="NeutralButton"> diff --git a/mobile/android/fenix/app/src/main/res/xml/home_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/home_preferences.xml index 35d97891d5..5ca4cff86d 100644 --- a/mobile/android/fenix/app/src/main/res/xml/home_preferences.xml +++ b/mobile/android/fenix/app/src/main/res/xml/home_preferences.xml @@ -20,8 +20,8 @@ android:title="@string/customize_toggle_jump_back_in" /> <androidx.preference.SwitchPreference - android:key="@string/pref_key_recent_bookmarks" - android:title="@string/customize_toggle_recent_bookmarks" /> + android:key="@string/pref_key_customization_bookmarks" + android:title="@string/customize_toggle_bookmarks" /> <androidx.preference.SwitchPreference android:key="@string/pref_key_history_metadata_feature" diff --git a/mobile/android/fenix/app/src/main/res/xml/preferences.xml b/mobile/android/fenix/app/src/main/res/xml/preferences.xml index 0bc93722fe..9560b96efd 100644 --- a/mobile/android/fenix/app/src/main/res/xml/preferences.xml +++ b/mobile/android/fenix/app/src/main/res/xml/preferences.xml @@ -82,6 +82,12 @@ app:iconSpaceReserved="false" android:title="@string/preferences_language" /> + <androidx.preference.Preference + android:key="@string/pref_key_translation" + app:iconSpaceReserved="false" + app:isPreferenceVisible="false" + android:title="@string/preferences_translations" /> + <org.mozilla.fenix.settings.DefaultBrowserPreference android:key="@string/pref_key_make_default_browser" app:iconSpaceReserved="false" diff --git a/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml index 1f81f55a3e..fb28b5782b 100644 --- a/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml +++ b/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml @@ -8,8 +8,7 @@ android:shortcutId="password_manager" android:enabled="true" android:icon="@drawable/ic_static_password_shortcut" - android:shortcutShortLabel="@string/home_screen_shortcut_passwords" - android:shortcutLongLabel="@string/home_screen_shortcut_passwords"> + android:shortcutShortLabel="@string/home_screen_shortcut_passwords"> <intent android:action="org.mozilla.fenix.OPEN_PASSWORD_MANAGER" android:targetPackage="org.mozilla.fenix" @@ -19,8 +18,7 @@ android:shortcutId="open_new_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_TAB" android:targetPackage="org.mozilla.fenix" @@ -30,8 +28,7 @@ android:shortcutId="open_new_private_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_private_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_PRIVATE_TAB" android:targetPackage="org.mozilla.fenix" diff --git a/mobile/android/fenix/app/src/main/res/xml/sync_debug_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/sync_debug_preferences.xml index bd75db07b9..3e283d121d 100644 --- a/mobile/android/fenix/app/src/main/res/xml/sync_debug_preferences.xml +++ b/mobile/android/fenix/app/src/main/res/xml/sync_debug_preferences.xml @@ -31,4 +31,13 @@ android:title="@string/preferences_use_react_fxa" app:iconSpaceReserved="false" /> + <androidx.preference.Preference + android:key="@string/pref_key_sync_debug_network_error" + android:title="@string/preferences_sync_debug_network_error_button_title" /> + <androidx.preference.Preference + android:key="@string/pref_key_sync_debug_temporary_auth_error" + android:title="@string/preferences_sync_debug_temporary_auth_error_button_title" /> + <androidx.preference.Preference + android:key="@string/pref_key_sync_debug_permanent_auth_error" + android:title="@string/preferences_sync_debug_permanent_auth_error_button_title" /> </PreferenceScreen> diff --git a/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml index 1f81f55a3e..fb28b5782b 100644 --- a/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml +++ b/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml @@ -8,8 +8,7 @@ android:shortcutId="password_manager" android:enabled="true" android:icon="@drawable/ic_static_password_shortcut" - android:shortcutShortLabel="@string/home_screen_shortcut_passwords" - android:shortcutLongLabel="@string/home_screen_shortcut_passwords"> + android:shortcutShortLabel="@string/home_screen_shortcut_passwords"> <intent android:action="org.mozilla.fenix.OPEN_PASSWORD_MANAGER" android:targetPackage="org.mozilla.fenix" @@ -19,8 +18,7 @@ android:shortcutId="open_new_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_TAB" android:targetPackage="org.mozilla.fenix" @@ -30,8 +28,7 @@ android:shortcutId="open_new_private_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_private_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_PRIVATE_TAB" android:targetPackage="org.mozilla.fenix" diff --git a/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml index d9b9b27dcc..31d6b91379 100644 --- a/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml +++ b/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml @@ -8,8 +8,7 @@ android:shortcutId="password_manager" android:enabled="true" android:icon="@drawable/ic_static_password_shortcut" - android:shortcutShortLabel="@string/home_screen_shortcut_passwords" - android:shortcutLongLabel="@string/home_screen_shortcut_passwords"> + android:shortcutShortLabel="@string/home_screen_shortcut_passwords"> <intent android:action="org.mozilla.fenix.OPEN_PASSWORD_MANAGER" android:targetPackage="org.mozilla.firefox" @@ -19,8 +18,7 @@ android:shortcutId="open_new_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_TAB" android:targetPackage="org.mozilla.firefox" @@ -30,8 +28,7 @@ android:shortcutId="open_new_private_tab" android:enabled="true" android:icon="@drawable/ic_static_shortcut_private_tab" - android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2" - android:shortcutLongLabel="@string/home_screen_shortcut_open_new_private_tab_2"> + android:shortcutShortLabel="@string/home_screen_shortcut_open_new_private_tab_2"> <intent android:action="org.mozilla.fenix.OPEN_PRIVATE_TAB" android:targetPackage="org.mozilla.firefox" diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt index b758f6d79c..f114c21bfd 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/FenixApplicationTest.kt @@ -39,6 +39,7 @@ import org.mozilla.fenix.components.metrics.MozillaProductDetector import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings +import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config @RunWith(FenixRobolectricTestRunner::class) @@ -139,7 +140,7 @@ class FenixApplicationTest { every { settings.shouldUseLightTheme } returns true every { settings.signedInFxaAccount } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.showTopSitesFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -148,7 +149,7 @@ class FenixApplicationTest { every { application.getDeviceTotalRAM() } returns 7L every { settings.inactiveTabsAreEnabled } returns true every { application.isDeviceRamAboveThreshold } returns true - every { settings.isTabletAndTabStripEnabled } returns true + every { settings.isTabStripEnabled } returns true assertTrue(settings.contileContextId.isEmpty()) assertNull(TopSites.contextId.testGetValue()) @@ -218,6 +219,20 @@ class FenixApplicationTest { } @Test + @Config(sdk = [28]) + fun `GIVEN the current etp mode is custom WHEN tracking the etp metric THEN track also the cookies option on SDK 28`() { + val settings: Settings = mockk(relaxed = true) { + every { shouldUseTrackingProtection } returns true + every { useCustomTrackingProtection } returns true + every { blockCookiesSelectionInCustomTrackingProtection } returns "Test" + } + + application.setStartupMetrics(browserStore, settings, browsersCache, mozillaProductDetector) + + assertEquals("Test", Preferences.etpCustomCookiesSelection.testGetValue()) + } + + @Test fun `GIVEN the current etp mode is custom WHEN tracking the etp metric THEN track also the cookies option`() { val settings: Settings = mockk(relaxed = true) { every { shouldUseTrackingProtection } returns true @@ -225,6 +240,10 @@ class FenixApplicationTest { every { blockCookiesSelectionInCustomTrackingProtection } returns "Test" } + val packageManager: PackageManager = testContext.packageManager + shadowOf(packageManager) + .setInstallSourceInfo(testContext.packageName, "initiating.package", "installing.package") + application.setStartupMetrics(browserStore, settings, browsersCache, mozillaProductDetector) assertEquals("Test", Preferences.etpCustomCookiesSelection.testGetValue()) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt index 8c13905920..05aa911a9a 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/BrowserFragmentTest.kt @@ -19,6 +19,7 @@ import io.mockk.spyk import io.mockk.unmockkObject import io.mockk.unmockkStatic import io.mockk.verify +import io.mockk.verifyOrder import mozilla.components.browser.state.action.RestoreCompleteAction import mozilla.components.browser.state.action.TabListAction import mozilla.components.browser.state.state.BrowserState @@ -30,6 +31,8 @@ import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.support.test.ext.joinBlocking import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.After +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Before @@ -83,6 +86,7 @@ class BrowserFragmentTest { every { browserFragment.view } returns view every { browserFragment.isAdded } returns true every { browserFragment.browserToolbarView } returns mockk(relaxed = true) + every { browserFragment.browserToolbarInteractor } returns mockk(relaxed = true) every { browserFragment.activity } returns homeActivity every { browserFragment.lifecycle } returns lifecycleOwner.lifecycle every { context.components.fenixOnboarding } returns onboarding @@ -91,6 +95,8 @@ class BrowserFragmentTest { every { browserFragment.initializeUI(any(), any()) } returns mockk() every { browserFragment.fullScreenChanged(any()) } returns Unit every { browserFragment.resumeDownloadDialogState(any(), any(), any(), any()) } returns Unit + every { browserFragment.binding } returns mockk(relaxed = true) + every { browserFragment.viewLifecycleOwner } returns mockk(relaxed = true) testTab = createTab(url = "https://mozilla.org") store = BrowserStore() @@ -132,6 +138,50 @@ class BrowserFragmentTest { } @Test + fun `WHEN isMicrosurveyEnabled and isExperimentationEnabled are true GIVEN a call to setupMicrosurvey THEN messagingFeature is initialized`() { + every { context.settings().isExperimentationEnabled } returns true + + assertNull(browserFragment.messagingFeature.get()) + + browserFragment.setupMicrosurvey(isMicrosurveyEnabled = true) + + assertNotNull(browserFragment.messagingFeature.get()) + } + + @Test + fun `WHEN isMicrosurveyEnabled and isExperimentationEnabled are false GIVEN a call to setupMicrosurvey THEN messagingFeature is not initialized`() { + every { context.settings().isExperimentationEnabled } returns false + + assertNull(browserFragment.messagingFeature.get()) + + browserFragment.setupMicrosurvey(isMicrosurveyEnabled = false) + + assertNull(browserFragment.messagingFeature.get()) + } + + @Test + fun `WHEN isMicrosurveyEnabled is true and isExperimentationEnabled false GIVEN a call to setupMicrosurvey THEN messagingFeature is not initialized`() { + every { context.settings().isExperimentationEnabled } returns false + + assertNull(browserFragment.messagingFeature.get()) + + browserFragment.setupMicrosurvey(isMicrosurveyEnabled = true) + + assertNull(browserFragment.messagingFeature.get()) + } + + @Test + fun `WHEN isMicrosurveyEnabled is false and isExperimentationEnabled true GIVEN a call to setupMicrosurvey THEN messagingFeature is not initialized`() { + every { context.settings().isExperimentationEnabled } returns true + + assertNull(browserFragment.messagingFeature.get()) + + browserFragment.setupMicrosurvey(isMicrosurveyEnabled = false) + + assertNull(browserFragment.messagingFeature.get()) + } + + @Test fun `GIVEN browser UI is initialized WHEN selected tab changes THEN toolbar is expanded`() { browserFragment.browserInitialized = true browserFragment.observeTabSelection(store) @@ -329,12 +379,22 @@ class BrowserFragmentTest { browserFragment._browserToolbarView = null browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 0) { browserFragment.onUpdateToolbarForConfigurationChange(any()) } - verify(exactly = 0) { browserFragment.updateToolbarActions(any()) } + verify(exactly = 0) { browserFragment.updateTabletToolbarActions(any()) } browserFragment._browserToolbarView = browserToolbarView + + mockkObject(ThemeManager.Companion) + every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) + + mockkStatic(AppCompatResources::class) + every { AppCompatResources.getDrawable(context, any()) } returns mockk() + browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 1) { browserFragment.onUpdateToolbarForConfigurationChange(any()) } - verify(exactly = 1) { browserFragment.updateToolbarActions(any()) } + verify(exactly = 1) { browserFragment.updateTabletToolbarActions(any()) } + + unmockkObject(ThemeManager.Companion) + unmockkStatic(AppCompatResources::class) } @Test @@ -343,15 +403,26 @@ class BrowserFragmentTest { every { browserFragment.context } returns null browserFragment._browserToolbarView = browserToolbarView + mockkObject(ThemeManager.Companion) + every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) + + mockkStatic(AppCompatResources::class) + every { AppCompatResources.getDrawable(context, any()) } returns mockk() + browserFragment.onConfigurationChanged(mockk(relaxed = true)) verify(exactly = 1) { browserToolbarView.dismissMenu() } + + unmockkObject(ThemeManager.Companion) + unmockkStatic(AppCompatResources::class) } @Test fun `WHEN fragment configuration screen size changes between tablet and mobile size THEN tablet action items added and removed`() { val browserToolbarView: BrowserToolbarView = mockk(relaxed = true) val browserToolbar: BrowserToolbar = mockk(relaxed = true) + val leadingAction: BrowserToolbar.Button = mockk(relaxed = true) + browserFragment.leadingAction = leadingAction browserFragment._browserToolbarView = browserToolbarView every { browserFragment.browserToolbarView.view } returns browserToolbar @@ -377,6 +448,8 @@ class BrowserFragmentTest { fun `WHEN fragment configuration change enables tablet size twice THEN tablet action items are only added once`() { val browserToolbarView: BrowserToolbarView = mockk(relaxed = true) val browserToolbar: BrowserToolbar = mockk(relaxed = true) + val leadingAction: BrowserToolbar.Button = mockk(relaxed = true) + browserFragment.leadingAction = leadingAction browserFragment._browserToolbarView = browserToolbarView every { browserFragment.browserToolbarView.view } returns browserToolbar @@ -401,6 +474,8 @@ class BrowserFragmentTest { fun `WHEN fragment configuration change sets mobile size twice THEN tablet action items are not added or removed`() { val browserToolbarView: BrowserToolbarView = mockk(relaxed = true) val browserToolbar: BrowserToolbar = mockk(relaxed = true) + val leadingAction: BrowserToolbar.Button = mockk(relaxed = true) + browserFragment.leadingAction = leadingAction browserFragment._browserToolbarView = browserToolbarView every { browserFragment.browserToolbarView.view } returns browserToolbar @@ -445,4 +520,181 @@ class BrowserFragmentTest { verify(exactly = 1) { settings.lastBrowseActivity = any() } } + + @Test + fun `GIVEN redesign feature is off and configuration is portrait WHEN updating navigation icons THEN only leading action is added`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = false + val isLandscape = false + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isTablet = false, + isPrivate = false, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 1) { browserFragment.addLeadingAction(any(), any(), any()) } + verify(exactly = 0) { browserFragment.addTabletActions(any()) } + verify(exactly = 0) { browserFragment.addNavigationActions(any()) } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is off and configuration is landscape WHEN updating navigation icons THEN only leading action is added`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = false + val isLandscape = true + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isTablet = false, + isPrivate = false, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 1) { browserFragment.addLeadingAction(any(), any(), any()) } + verify(exactly = 0) { browserFragment.addTabletActions(any()) } + verify(exactly = 0) { browserFragment.addNavigationActions(any()) } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is on and configuration is portrait WHEN updating navigation icons THEN no actions were added`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = true + val isLandscape = false + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isTablet = false, + isPrivate = false, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 0) { browserFragment.addLeadingAction(any(), any(), any()) } + verify(exactly = 0) { browserFragment.addTabletActions(any()) } + verify(exactly = 0) { browserFragment.addNavigationActions(any()) } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is on and configuration is landscape WHEN updating navigation icons THEN navigation buttons and a leading action are added in order`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = true + val isLandscape = true + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isTablet = false, + isPrivate = false, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 1) { browserFragment.addLeadingAction(any(), any(), any()) } + verify(exactly = 0) { browserFragment.addTabletActions(any()) } + verify(exactly = 1) { browserFragment.addNavigationActions(any()) } + + verifyOrder { + browserFragment.addNavigationActions(any()) + browserFragment.addLeadingAction(any(), any(), any()) + } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is off and is tablet WHEN updating navigation icons THEN leading action and navigation buttons are added in order`() { + mockThemeManagerAndAppCompatResources() + + val isTablet = true + + val redesignEnabled = false + val isLandscape = true + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isTablet = isTablet, + isPrivate = false, + feltPrivateBrowsingEnabled = false, + ) + + verifyOrder { + browserFragment.addLeadingAction(any(), any(), any()) + browserFragment.addNavigationActions(any()) + } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is on and orientation is portrait and it is not tablet WHEN updating navigation icons THEN navigation items and leading action are removed`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = true + val isLandscape = false + val isTablet = false + + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isPrivate = false, + isTablet = isTablet, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 1) { browserFragment.removeLeadingAction() } + verify(exactly = 1) { browserFragment.removeNavigationActions() } + + unmockThemeManagerAndAppCompatResources() + } + + @Test + fun `GIVEN redesign feature is on and orientation is portrait and it is tablet WHEN updating navigation icons THEN navigation items and leading action are added`() { + mockThemeManagerAndAppCompatResources() + + val redesignEnabled = true + val isLandscape = false + val isTablet = true + + browserFragment.updateBrowserToolbarLeadingAndNavigationActions( + context = context, + redesignEnabled = redesignEnabled, + isLandscape = isLandscape, + isPrivate = false, + isTablet = isTablet, + feltPrivateBrowsingEnabled = false, + ) + + verify(exactly = 1) { browserFragment.addLeadingAction(any(), any(), any()) } + verify(exactly = 1) { browserFragment.addNavigationActions(any()) } + + unmockThemeManagerAndAppCompatResources() + } + + private fun mockThemeManagerAndAppCompatResources() { + mockkObject(ThemeManager.Companion) + every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true) + + mockkStatic(AppCompatResources::class) + every { AppCompatResources.getDrawable(context, any()) } returns mockk() + } + + private fun unmockThemeManagerAndAppCompatResources() { + unmockkObject(ThemeManager.Companion) + unmockkStatic(AppCompatResources::class) + } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt index f102eafbb7..33bdfd9a7e 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/StandardSnackbarErrorBindingTest.kt @@ -97,7 +97,7 @@ class StandardSnackbarErrorBindingTest { snackbar.setSnackBarTextColor( ContextCompat.getColor( activity, - R.color.fx_mobile_text_color_warning, + R.color.fx_mobile_text_color_critical, ), ) snackbar.setAction( diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/TranslationsBindingTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/TranslationsBindingTest.kt index f92d8f22e2..03c95743d7 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/TranslationsBindingTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/browser/TranslationsBindingTest.kt @@ -71,6 +71,7 @@ class TranslationsBindingTest { detectedLanguages = detectedLanguages, error = null, isEngineReady = true, + hasVisibleChange = true, requestedTranslationPair = TranslationPair( fromLanguage = englishLanguage.code, toLanguage = spanishLanguage.code, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/AppStoreTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/AppStoreTest.kt index cfd2e28766..cf8674c65a 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/AppStoreTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/AppStoreTest.kt @@ -34,9 +34,9 @@ import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.components.appstate.filterOut import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getFilteredStories +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesSelectedCategory -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab @@ -262,7 +262,7 @@ class AppStoreTest { assertEquals(0, appStore.state.collections.size) assertEquals(0, appStore.state.topSites.size) assertEquals(0, appStore.state.recentTabs.size) - assertEquals(0, appStore.state.recentBookmarks.size) + assertEquals(0, appStore.state.bookmarks.size) assertEquals(0, appStore.state.recentHistory.size) assertEquals(BrowsingMode.Normal, appStore.state.mode) assertEquals( @@ -273,7 +273,7 @@ class AppStoreTest { val collections: List<TabCollection> = listOf(mockk()) val topSites: List<TopSite> = listOf(mockk(), mockk()) val recentTabs: List<RecentTab> = listOf(mockk(), mockk()) - val recentBookmarks: List<RecentBookmark> = listOf(mockk(), mockk()) + val bookmarks: List<Bookmark> = listOf(mockk(), mockk()) val group1 = RecentHistoryGroup(title = "test One") val group2 = RecentHistoryGroup(title = "testSearchTerm") val group3 = RecentHistoryGroup(title = "test two") @@ -296,7 +296,7 @@ class AppStoreTest { topSites = topSites, showCollectionPlaceholder = true, recentTabs = recentTabs, - recentBookmarks = recentBookmarks, + bookmarks = bookmarks, recentHistory = recentHistory, recentSyncedTabState = recentSyncedTabState, ), @@ -305,7 +305,7 @@ class AppStoreTest { assertEquals(collections, appStore.state.collections) assertEquals(topSites, appStore.state.topSites) assertEquals(recentTabs, appStore.state.recentTabs) - assertEquals(recentBookmarks, appStore.state.recentBookmarks) + assertEquals(bookmarks, appStore.state.bookmarks) assertEquals(listOf(group1, group2, group3, highlight), appStore.state.recentHistory) assertEquals(BrowsingMode.Private, appStore.state.mode) assertEquals( diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt index e611dc8d90..efcbc9da26 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/bookmarks/BookmarksUseCaseTest.kt @@ -8,6 +8,7 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.every import io.mockk.mockk +import io.mockk.slot import kotlinx.coroutines.test.runTest import mozilla.appservices.places.BookmarkRoot import mozilla.components.concept.storage.BookmarkNode @@ -16,11 +17,13 @@ import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.concept.storage.HistoryStorage import mozilla.components.concept.storage.VisitInfo import mozilla.components.concept.storage.VisitType +import mozilla.components.support.test.capture import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Test -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import java.util.concurrent.TimeUnit class BookmarksUseCaseTest { @@ -37,7 +40,7 @@ class BookmarksUseCaseTest { val result = useCase.addBookmark("https://mozilla.org", "Mozilla") - assertFalse(result) + assertNull(result) } @Test @@ -52,7 +55,7 @@ class BookmarksUseCaseTest { val result = useCase.addBookmark("https://mozilla.org", "Mozilla") - assertTrue(result) + assertNotNull(result) coVerify { bookmarksStorage.addItem(BookmarkRoot.Mobile.id, "https://mozilla.org", "Mozilla", null) } } @@ -69,16 +72,17 @@ class BookmarksUseCaseTest { val result = useCase.addBookmark("https://mozilla.org", "Mozilla", parentGuid = "parentGuid") - assertTrue(result) + assertNotNull(result) coVerify { bookmarksStorage.addItem("parentGuid", "https://mozilla.org", "Mozilla", null) } } @Test - fun `WHEN recently saved bookmarks exist THEN retrieve the list from storage`() = runTest { + fun `WHEN saved bookmarks exist THEN retrieve the list from storage using limited history`() = runTest { val bookmarksStorage = mockk<BookmarksStorage>(relaxed = true) val historyStorage = mockk<HistoryStorage>(relaxed = true) val useCase = BookmarksUseCase(bookmarksStorage, historyStorage) + val historyTimeFrameSlot = slot<Long>() val visitInfo = VisitInfo( url = "https://www.firefox.com", @@ -100,7 +104,7 @@ class BookmarksUseCaseTest { ) coEvery { - historyStorage.getDetailedVisits(any(), any()) + historyStorage.getDetailedVisits(capture(historyTimeFrameSlot), any()) }.coAnswers { listOf(visitInfo) } coEvery { @@ -111,11 +115,11 @@ class BookmarksUseCaseTest { ) }.coAnswers { listOf(bookmarkNode) } - val result = useCase.retrieveRecentBookmarks(BookmarksUseCase.DEFAULT_BOOKMARKS_TO_RETRIEVE, 22) + val result = useCase.retrieveRecentBookmarks(BookmarksUseCase.DEFAULT_BOOKMARKS_TO_RETRIEVE) assertEquals( listOf( - RecentBookmark( + Bookmark( title = bookmarkNode.title, url = bookmarkNode.url, previewImageUrl = visitInfo.previewImageUrl, @@ -124,17 +128,23 @@ class BookmarksUseCaseTest { result, ) + val timeNow = System.currentTimeMillis() + val nineDaysAgo = timeNow - TimeUnit.DAYS.toMillis(9) + val elevenDaysAgo = timeNow - TimeUnit.DAYS.toMillis(11) + assertTrue(historyTimeFrameSlot.isCaptured) + assertTrue(historyTimeFrameSlot.captured in elevenDaysAgo..nineDaysAgo) + coVerify { bookmarksStorage.getRecentBookmarks( BookmarksUseCase.DEFAULT_BOOKMARKS_TO_RETRIEVE, - 22, + null, any(), ) } } @Test - fun `WHEN there are no recently saved bookmarks THEN retrieve the empty list from storage`() = runTest { + fun `WHEN there are no bookmarks THEN retrieve the empty list from storage`() = runTest { val bookmarksStorage = mockk<BookmarksStorage>(relaxed = true) val historyStorage = mockk<HistoryStorage>(relaxed = true) val useCase = BookmarksUseCase(bookmarksStorage, historyStorage) @@ -148,7 +158,7 @@ class BookmarksUseCaseTest { coVerify { bookmarksStorage.getRecentBookmarks( BookmarksUseCase.DEFAULT_BOOKMARKS_TO_RETRIEVE, - TimeUnit.DAYS.toMillis(BookmarksUseCase.DEFAULT_BOOKMARKS_DAYS_AGE_TO_RETRIEVE), + null, any(), ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuAccessPointTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuAccessPointTest.kt new file mode 100644 index 0000000000..616e25e160 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuAccessPointTest.kt @@ -0,0 +1,22 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu + +import org.junit.Assert.assertEquals +import org.junit.Test +import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint + +class MenuAccessPointTest { + + @Test + fun `WHEN menu access points are converted to Fenix FxA entry points THEN return the correct entry points`() { + assertEquals( + FenixFxAEntryPoint.BrowserToolbar, + MenuAccessPoint.Browser.toFenixFxAEntryPoint(), + ) + assertEquals(FenixFxAEntryPoint.Unknown, MenuAccessPoint.External.toFenixFxAEntryPoint()) + assertEquals(FenixFxAEntryPoint.HomeMenu, MenuAccessPoint.Home.toFenixFxAEntryPoint()) + } +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuDialogMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuDialogMiddlewareTest.kt new file mode 100644 index 0000000000..1dae1c3656 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuDialogMiddlewareTest.kt @@ -0,0 +1,206 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu + +import kotlinx.coroutines.test.runTest +import mozilla.appservices.places.BookmarkRoot +import mozilla.components.browser.state.state.createTab +import mozilla.components.concept.storage.BookmarksStorage +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.mockito.Mockito.never +import org.mockito.Mockito.spy +import org.mockito.Mockito.verify +import org.mozilla.fenix.components.bookmarks.BookmarksUseCase.AddBookmarksUseCase +import org.mozilla.fenix.components.menu.fake.FakeBookmarksStorage +import org.mozilla.fenix.components.menu.middleware.MenuDialogMiddleware +import org.mozilla.fenix.components.menu.store.BookmarkState +import org.mozilla.fenix.components.menu.store.BrowserMenuState +import org.mozilla.fenix.components.menu.store.MenuAction +import org.mozilla.fenix.components.menu.store.MenuState +import org.mozilla.fenix.components.menu.store.MenuStore + +class MenuDialogMiddlewareTest { + + @get:Rule + val coroutinesTestRule = MainCoroutineRule() + private val scope = coroutinesTestRule.scope + + private val bookmarksStorage: BookmarksStorage = FakeBookmarksStorage() + private val addBookmarkUseCase: AddBookmarksUseCase = + spy(AddBookmarksUseCase(storage = bookmarksStorage)) + + @Test + fun `GIVEN selected tab is bookmarked WHEN init action is dispatched THEN initial bookmark state is updated`() = runTest { + val url = "https://www.mozilla.org" + val title = "Mozilla" + + val guid = bookmarksStorage.addItem( + parentGuid = BookmarkRoot.Mobile.id, + url = url, + title = title, + position = 5u, + ) + + val browserMenuState = BrowserMenuState( + selectedTab = createTab( + url = url, + title = title, + ), + ) + val store = createStore( + menuState = MenuState( + browserMenuState = browserMenuState, + ), + ) + + assertNull(store.state.browserMenuState!!.bookmarkState.guid) + assertFalse(store.state.browserMenuState!!.bookmarkState.isBookmarked) + + store.dispatch(MenuAction.InitAction).join() + store.waitUntilIdle() + + assertEquals(guid, store.state.browserMenuState!!.bookmarkState.guid) + assertTrue(store.state.browserMenuState!!.bookmarkState.isBookmarked) + } + + @Test + fun `GIVEN selected tab is not bookmarked WHEN init action is dispatched THEN initial bookmark state is not updated`() = runTest { + val url = "https://www.mozilla.org" + val title = "Mozilla" + val browserMenuState = BrowserMenuState( + selectedTab = createTab( + url = url, + title = title, + ), + ) + val store = createStore( + menuState = MenuState( + browserMenuState = browserMenuState, + ), + ) + + assertNull(store.state.browserMenuState!!.bookmarkState.guid) + assertFalse(store.state.browserMenuState!!.bookmarkState.isBookmarked) + + store.dispatch(MenuAction.InitAction).join() + store.waitUntilIdle() + + assertNull(store.state.browserMenuState!!.bookmarkState.guid) + assertFalse(store.state.browserMenuState!!.bookmarkState.isBookmarked) + } + + @Test + fun `WHEN add bookmark action is dispatched THEN bookmark state is updated`() = runTest { + val url = "https://www.mozilla.org" + val title = "Mozilla" + val browserMenuState = BrowserMenuState( + selectedTab = createTab( + url = url, + title = title, + ), + ) + val store = createStore( + menuState = MenuState( + browserMenuState = browserMenuState, + ), + ) + + store.waitUntilIdle() + + assertNull(store.state.browserMenuState!!.bookmarkState.guid) + assertFalse(store.state.browserMenuState!!.bookmarkState.isBookmarked) + + store.dispatch(MenuAction.AddBookmark).join() + store.waitUntilIdle() + + assertNotNull(store.state.browserMenuState!!.bookmarkState.guid) + assertTrue(store.state.browserMenuState!!.bookmarkState.isBookmarked) + } + + @Test + fun `GIVEN no browser state WHEN add bookmark action is dispatched THEN bookmark state is not updated`() = runTest { + val store = createStore( + menuState = MenuState( + browserMenuState = null, + ), + ) + + assertNull(store.state.browserMenuState) + + store.dispatch(MenuAction.AddBookmark).join() + store.waitUntilIdle() + + assertNull(store.state.browserMenuState) + } + + @Test + fun `GIVEN selected tab is bookmarked WHEN add bookmark action is dispatched THEN bookmark state is not updated`() = runTest { + val url = "https://www.mozilla.org" + val title = "Mozilla" + + val guid = bookmarksStorage.addItem( + parentGuid = BookmarkRoot.Mobile.id, + url = url, + title = title, + position = 5u, + ) + + val browserMenuState = BrowserMenuState( + selectedTab = createTab( + url = url, + title = title, + ), + ) + val store = spy( + createStore( + menuState = MenuState( + browserMenuState = browserMenuState, + ), + ), + ) + + store.waitUntilIdle() + + assertNotNull(store.state.browserMenuState!!.bookmarkState.guid) + assertTrue(store.state.browserMenuState!!.bookmarkState.isBookmarked) + + store.dispatch(MenuAction.AddBookmark).join() + store.waitUntilIdle() + + verify(addBookmarkUseCase, never()).invoke(url = url, title = title) + verify(store, never()).dispatch( + MenuAction.UpdateBookmarkState( + bookmarkState = BookmarkState( + guid = guid, + isBookmarked = true, + ), + ), + ) + + assertNotNull(store.state.browserMenuState!!.bookmarkState.guid) + assertTrue(store.state.browserMenuState!!.bookmarkState.isBookmarked) + } + + private fun createStore( + menuState: MenuState = MenuState(), + ) = MenuStore( + initialState = menuState, + middleware = listOf( + MenuDialogMiddleware( + bookmarksStorage = bookmarksStorage, + addBookmarkUseCase = addBookmarkUseCase, + scope = scope, + ), + ), + ) +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuNavigationMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuNavigationMiddlewareTest.kt index 5b6ddb184a..39b96003d0 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuNavigationMiddlewareTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuNavigationMiddlewareTest.kt @@ -5,20 +5,37 @@ package org.mozilla.fenix.components.menu import androidx.navigation.NavController +import androidx.navigation.NavHostController import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.test.runTest import mozilla.appservices.places.BookmarkRoot +import mozilla.components.browser.state.state.ReaderState +import mozilla.components.browser.state.state.createTab +import mozilla.components.concept.engine.prompt.ShareData +import mozilla.components.service.fxa.manager.AccountState.Authenticated +import mozilla.components.service.fxa.manager.AccountState.AuthenticationProblem +import mozilla.components.service.fxa.manager.AccountState.NotAuthenticated import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R +import org.mozilla.fenix.browser.browsingmode.BrowsingMode +import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager +import org.mozilla.fenix.browser.browsingmode.SimpleBrowsingModeManager +import org.mozilla.fenix.components.accounts.FenixFxAEntryPoint +import org.mozilla.fenix.components.menu.compose.EXTENSIONS_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.SAVE_MENU_ROUTE +import org.mozilla.fenix.components.menu.compose.TOOLS_MENU_ROUTE import org.mozilla.fenix.components.menu.middleware.MenuNavigationMiddleware +import org.mozilla.fenix.components.menu.store.BrowserMenuState import org.mozilla.fenix.components.menu.store.MenuAction import org.mozilla.fenix.components.menu.store.MenuState import org.mozilla.fenix.components.menu.store.MenuStore import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.SupportUtils.AMO_HOMEPAGE_FOR_ANDROID import org.mozilla.fenix.settings.SupportUtils.SumoTopic class MenuNavigationMiddlewareTest { @@ -28,6 +45,74 @@ class MenuNavigationMiddlewareTest { private val scope = coroutinesTestRule.scope private val navController: NavController = mockk(relaxed = true) + private val navHostController: NavHostController = mockk(relaxed = true) + + @Test + fun `GIVEN account state is authenticated WHEN navigate to Mozilla account action is dispatched THEN dispatch navigate action to Mozilla account settings`() = runTest { + val store = createStore() + val accountState = Authenticated + val accesspoint = MenuAccessPoint.Home + + store.dispatch( + MenuAction.Navigate.MozillaAccount( + accountState = accountState, + accesspoint = accesspoint, + ), + ).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAccountSettingsFragment(), + ) + } + } + + @Test + fun `GIVEN account state is authentication problem WHEN navigate to Mozilla account action is dispatched THEN dispatch navigate action to Mozilla account problem`() = runTest { + val store = createStore() + val accountState = AuthenticationProblem + val accesspoint = MenuAccessPoint.Home + + store.dispatch( + MenuAction.Navigate.MozillaAccount( + accountState = accountState, + accesspoint = accesspoint, + ), + ).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAccountProblemFragment( + entrypoint = FenixFxAEntryPoint.BrowserToolbar, + ), + ) + } + } + + @Test + fun `GIVEN account state is not authenticated WHEN navigate to Mozilla account action is dispatched THEN dispatch navigate action to turn on sync`() = runTest { + val store = createStore() + val accountState = NotAuthenticated + val accesspoint = MenuAccessPoint.Home + + store.dispatch( + MenuAction.Navigate.MozillaAccount( + accountState = accountState, + accesspoint = accesspoint, + ), + ).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalTurnOnSync( + entrypoint = FenixFxAEntryPoint.HomeMenu, + ), + ) + } + } @Test fun `WHEN navigate to settings action is dispatched THEN navigate to settings`() = runTest { @@ -44,16 +129,16 @@ class MenuNavigationMiddlewareTest { @Test fun `WHEN navigate to help action is dispatched THEN navigate to SUMO Help topic`() = runTest { - var topic: SumoTopic? = null + var params: BrowserNavigationParams? = null val store = createStore( - openSumoTopic = { - topic = it + openToBrowser = { + params = it }, ) store.dispatch(MenuAction.Navigate.Help).join() - assertEquals(SumoTopic.HELP, topic) + assertEquals(SumoTopic.HELP, params?.sumoTopic) } @Test @@ -108,14 +193,239 @@ class MenuNavigationMiddlewareTest { } } + @Test + fun `WHEN navigate to customize homepage action is dispatched THEN navigate to homepage settings`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.CustomizeHomepage).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalHomeSettingsFragment(), + ) + } + } + + @Test + fun `WHEN navigate to release notes action is dispatched THEN navigate to SUMO topic`() = runTest { + var params: BrowserNavigationParams? = null + val store = createStore( + openToBrowser = { + params = it + }, + ) + + store.dispatch(MenuAction.Navigate.ReleaseNotes).join() + + assertEquals(SupportUtils.WHATS_NEW_URL, params?.url) + } + + @Test + fun `WHEN navigate to tools action is dispatched THEN navigate to tools submenu route`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.Tools).join() + + verify { + navHostController.navigate(route = TOOLS_MENU_ROUTE) + } + } + + @Test + fun `WHEN navigate to save action is dispatched THEN navigate to save submenu route`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.Save).join() + + verify { + navHostController.navigate(route = SAVE_MENU_ROUTE) + } + } + + @Test + fun `WHEN navigate to extensions action is dispatched THEN navigate to extensions submenu route`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.Extensions).join() + + verify { + navHostController.navigate(route = EXTENSIONS_MENU_ROUTE) + } + } + + @Test + fun `WHEN navigate back action is dispatched THEN pop back stack`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.Back).join() + + verify { navHostController.popBackStack() } + } + + @Test + fun `WHEN navigate to translate action is dispatched THEN navigate to translation dialog`() = runTest { + val tab = createTab(url = "https://www.mozilla.org") + val store = createStore( + menuState = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = tab, + ), + ), + ) + + store.dispatch(MenuAction.Navigate.Translate).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionMenuDialogFragmentToTranslationsDialogFragment(), + ) + } + } + + @Test + fun `GIVEN reader view is active WHEN navigate to share action is dispatched THEN navigate to share sheet`() = runTest { + val title = "Mozilla" + val readerUrl = "moz-extension://1234" + val activeUrl = "https://mozilla.org" + val readerTab = createTab( + url = readerUrl, + readerState = ReaderState(active = true, activeUrl = activeUrl), + title = title, + ) + val store = createStore( + menuState = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = readerTab, + ), + ), + ) + + store.dispatch(MenuAction.Navigate.Share).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalShareFragment( + sessionId = readerTab.id, + data = arrayOf( + ShareData( + url = activeUrl, + title = title, + ), + ), + showPage = true, + ), + ) + } + } + + @Test + fun `GIVEN reader view is inactive WHEN navigate to share action is dispatched THEN navigate to share sheet`() = runTest { + val url = "https://www.mozilla.org" + val title = "Mozilla" + val tab = createTab( + url = url, + title = title, + ) + val store = createStore( + menuState = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = tab, + ), + ), + ) + + store.dispatch(MenuAction.Navigate.Share).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalShareFragment( + sessionId = tab.id, + data = arrayOf( + ShareData( + url = url, + title = title, + ), + ), + showPage = true, + ), + ) + } + } + + @Test + fun `WHEN navigate to manage extensions action is dispatched THEN navigate to the extensions management`() = runTest { + val store = createStore() + store.dispatch(MenuAction.Navigate.ManageExtensions).join() + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalAddonsManagementFragment(), + ) + } + } + + @Test + fun `WHEN navigate to discover more extensions action is dispatched THEN navigate to the AMO page`() = runTest { + var params: BrowserNavigationParams? = null + val store = createStore( + openToBrowser = { + params = it + }, + ) + + store.dispatch(MenuAction.Navigate.DiscoverMoreExtensions).join() + + assertEquals(AMO_HOMEPAGE_FOR_ANDROID, params?.url) + } + + @Test + fun `WHEN navigate to new tab action is dispatched THEN navigate to the home screen`() = runTest { + val browsingModeManager = SimpleBrowsingModeManager(BrowsingMode.Private) + val store = createStore( + browsingModeManager = browsingModeManager, + ) + store.dispatch(MenuAction.Navigate.NewTab).join() + + assertEquals(BrowsingMode.Normal, browsingModeManager.mode) + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true), + ) + } + } + + @Test + fun `WHEN navigate to new private tab action is dispatched THEN navigate to the home screen in private mode`() = runTest { + val browsingModeManager = SimpleBrowsingModeManager(BrowsingMode.Normal) + val store = createStore( + browsingModeManager = browsingModeManager, + ) + store.dispatch(MenuAction.Navigate.NewPrivateTab).join() + + assertEquals(BrowsingMode.Private, browsingModeManager.mode) + + verify { + navController.nav( + R.id.menuDialogFragment, + MenuDialogFragmentDirections.actionGlobalHome(focusOnAddressBar = true), + ) + } + } + private fun createStore( - openSumoTopic: (topic: SumoTopic) -> Unit = {}, + menuState: MenuState = MenuState(), + browsingModeManager: BrowsingModeManager = mockk(relaxed = true), + openToBrowser: (params: BrowserNavigationParams) -> Unit = {}, ) = MenuStore( - initialState = MenuState(), + initialState = menuState, middleware = listOf( MenuNavigationMiddleware( navController = navController, - openSumoTopic = openSumoTopic, + navHostController = navHostController, + browsingModeManager = browsingModeManager, + openToBrowser = openToBrowser, scope = scope, ), ), diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuStoreTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuStoreTest.kt index 6c6bd73b50..2ddab49262 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuStoreTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/MenuStoreTest.kt @@ -5,33 +5,130 @@ package org.mozilla.fenix.components.menu import kotlinx.coroutines.test.runTest +import mozilla.components.browser.state.state.ContentState +import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.lib.state.Middleware +import mozilla.components.support.test.libstate.ext.waitUntilIdle +import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue -import org.junit.Before import org.junit.Test +import org.mozilla.fenix.components.menu.store.BookmarkState +import org.mozilla.fenix.components.menu.store.BrowserMenuState import org.mozilla.fenix.components.menu.store.MenuAction import org.mozilla.fenix.components.menu.store.MenuState import org.mozilla.fenix.components.menu.store.MenuStore +import org.mozilla.fenix.components.menu.store.copyWithBrowserMenuState class MenuStoreTest { - private lateinit var state: MenuState - private lateinit var store: MenuStore + @Test + fun `WHEN store is created THEN init action is dispatched`() { + var initActionObserved = false + val testMiddleware: Middleware<MenuState, MenuAction> = { _, next, action -> + if (action == MenuAction.InitAction) { + initActionObserved = true + } + + next(action) + } + + val store = MenuStore( + initialState = MenuState(), + middleware = listOf(testMiddleware), + ) + store.waitUntilIdle() + assertTrue(initActionObserved) + } + + @Test + fun `GIVEN a browser menu state update WHEN copying the browser menu state THEN return the updated browser menu state`() { + val selectedTab = TabSessionState( + id = "tabId1", + content = ContentState( + url = "www.mozilla.com", + ), + ) + val firefoxTab = TabSessionState( + id = "tabId2", + content = ContentState( + url = "www.firefox.com", + ), + ) + val state = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = selectedTab, + bookmarkState = BookmarkState(), + ), + ) + + assertEquals(selectedTab, state.browserMenuState!!.selectedTab) + assertNull(state.browserMenuState!!.bookmarkState.guid) + assertFalse(state.browserMenuState!!.bookmarkState.isBookmarked) + + var newState = state.copyWithBrowserMenuState { + it.copy(selectedTab = firefoxTab) + } + + assertEquals(firefoxTab, newState.browserMenuState!!.selectedTab) + assertNull(state.browserMenuState!!.bookmarkState.guid) + assertFalse(state.browserMenuState!!.bookmarkState.isBookmarked) + + val bookmarkState = BookmarkState(guid = "id", isBookmarked = true) + newState = newState.copyWithBrowserMenuState { + it.copy(bookmarkState = bookmarkState) + } + + assertEquals(firefoxTab, newState.browserMenuState!!.selectedTab) + assertEquals(bookmarkState, newState.browserMenuState!!.bookmarkState) + } + + @Test + fun `WHEN add bookmark action is dispatched THEN state is not updated`() = runTest { + val initialState = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = TabSessionState( + id = "tabId", + content = ContentState( + url = "www.google.com", + ), + ), + bookmarkState = BookmarkState(), + ), + ) + val store = MenuStore(initialState = initialState) + + store.dispatch(MenuAction.AddBookmark).join() - @Before - fun setup() { - state = MenuState() - store = MenuStore(initialState = state) + assertEquals(initialState, store.state) } @Test - fun `WHEN update bookmarked action is dispatched THEN bookmarked state is updated`() = runTest { - assertFalse(store.state.isBookmarked) + fun `WHEN update bookmark state action is dispatched THEN bookmark state is updated`() = runTest { + val initialState = MenuState( + browserMenuState = BrowserMenuState( + selectedTab = TabSessionState( + id = "tabId", + content = ContentState( + url = "www.google.com", + ), + ), + bookmarkState = BookmarkState(), + ), + ) + val store = MenuStore(initialState = initialState) - store.dispatch(MenuAction.UpdateBookmarked(isBookmarked = true)).join() - assertTrue(store.state.isBookmarked) + assertNotNull(store.state.browserMenuState) + assertNull(store.state.browserMenuState!!.bookmarkState.guid) + assertFalse(store.state.browserMenuState!!.bookmarkState.isBookmarked) - store.dispatch(MenuAction.UpdateBookmarked(isBookmarked = false)).join() - assertFalse(store.state.isBookmarked) + val newBookmarkState = BookmarkState( + guid = "id1", + isBookmarked = true, + ) + store.dispatch(MenuAction.UpdateBookmarkState(bookmarkState = newBookmarkState)).join() + assertEquals(newBookmarkState, store.state.browserMenuState!!.bookmarkState) } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/fake/FakeBookmarksStorage.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/fake/FakeBookmarksStorage.kt new file mode 100644 index 0000000000..f51dd3b3b8 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/menu/fake/FakeBookmarksStorage.kt @@ -0,0 +1,104 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.components.menu.fake + +import mozilla.components.concept.storage.BookmarkInfo +import mozilla.components.concept.storage.BookmarkNode +import mozilla.components.concept.storage.BookmarkNodeType +import mozilla.components.concept.storage.BookmarksStorage +import java.util.UUID + +class FakeBookmarksStorage() : BookmarksStorage { + private val bookmarkMap: HashMap<String, BookmarkNode> = hashMapOf() + + override suspend fun warmUp() { + throw NotImplementedError() + } + + override suspend fun getTree(guid: String, recursive: Boolean): BookmarkNode? { + throw NotImplementedError() + } + + override suspend fun getBookmark(guid: String): BookmarkNode? { + throw NotImplementedError() + } + + override suspend fun getBookmarksWithUrl(url: String): List<BookmarkNode> { + return bookmarkMap.values.filter { it.url == url } + } + + override suspend fun getRecentBookmarks( + limit: Int, + maxAge: Long?, + currentTime: Long, + ): List<BookmarkNode> { + throw NotImplementedError() + } + + override suspend fun searchBookmarks(query: String, limit: Int): List<BookmarkNode> { + throw NotImplementedError() + } + + override suspend fun countBookmarksInTrees(guids: List<String>): UInt { + throw NotImplementedError() + } + + override suspend fun addItem( + parentGuid: String, + url: String, + title: String, + position: UInt?, + ): String { + val id = UUID.randomUUID().toString() + bookmarkMap[id] = + BookmarkNode( + type = BookmarkNodeType.ITEM, + guid = id, + parentGuid = parentGuid, + position = position, + title = title, + url = url, + dateAdded = 0, + children = null, + ) + return id + } + + override suspend fun addFolder(parentGuid: String, title: String, position: UInt?): String { + throw NotImplementedError() + } + + override suspend fun addSeparator(parentGuid: String, position: UInt?): String { + throw NotImplementedError() + } + + override suspend fun updateNode(guid: String, info: BookmarkInfo) { + throw NotImplementedError() + } + + override suspend fun deleteNode(guid: String): Boolean { + throw NotImplementedError() + } + + override suspend fun runMaintenance(dbSizeLimit: UInt) { + throw NotImplementedError() + } + + override fun cleanup() { + throw NotImplementedError() + } + + override fun cancelWrites() { + throw NotImplementedError() + } + + override fun cancelReads() { + throw NotImplementedError() + } + + override fun cancelReads(nextQuery: String) { + throw NotImplementedError() + } +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index 8b1819ac1c..3289257fbc 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -454,9 +454,7 @@ class DefaultBrowserToolbarControllerTest { verify { navController.navigate( - BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( - sessionId = "1", - ), + BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment(), ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt index 781cb8b3cf..3a5a4a303b 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarMenuControllerTest.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.components.toolbar import android.content.Intent import android.view.ViewGroup +import androidx.fragment.app.Fragment import androidx.navigation.NavController import io.mockk.MockKAnnotations import io.mockk.Runs @@ -22,7 +23,6 @@ import io.mockk.unmockkObject import io.mockk.unmockkStatic import io.mockk.verify import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import mozilla.appservices.places.BookmarkRoot import mozilla.components.browser.state.action.CustomTabListAction @@ -79,7 +79,6 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit import org.mozilla.fenix.utils.Settings -@OptIn(ExperimentalCoroutinesApi::class) @RunWith(FenixRobolectricTestRunner::class) class DefaultBrowserToolbarMenuControllerTest { @@ -91,6 +90,8 @@ class DefaultBrowserToolbarMenuControllerTest { @MockK private lateinit var snackbarParent: ViewGroup + @RelaxedMockK private lateinit var fragment: Fragment + @RelaxedMockK private lateinit var activity: HomeActivity @RelaxedMockK private lateinit var navController: NavController @@ -836,9 +837,7 @@ class DefaultBrowserToolbarMenuControllerTest { verify { navController.navigate( directionsEq( - BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment( - sessionId = selectedTab.id, - ), + BrowserFragmentDirections.actionBrowserFragmentToTranslationsDialogFragment(), ), ) } @@ -855,6 +854,7 @@ class DefaultBrowserToolbarMenuControllerTest { findInPageLauncher: () -> Unit = { }, bookmarkTapped: (String, String) -> Unit = { _, _ -> }, ) = DefaultBrowserToolbarMenuController( + fragment = fragment, store = store, activity = activity, navController = navController, @@ -871,7 +871,8 @@ class DefaultBrowserToolbarMenuControllerTest { sessionFeature = sessionFeatureWrapper, topSitesStorage = topSitesStorage, pinnedSiteStorage = pinnedSiteStorage, - browserStore = browserStore, + onShowPinVerification = {}, + onBiometricAuthenticationSuccessful = {}, ).apply { ioScope = scope } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/BitmapTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/BitmapTest.kt new file mode 100644 index 0000000000..865ec4a031 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/BitmapTest.kt @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import android.view.View +import io.mockk.every +import io.mockk.mockk +import org.junit.Assert.assertEquals +import org.junit.Test + +class BitmapTest { + @Test + fun `WHEN keyboard is considered closed THEN safeHeight returns the same value as the given view height`() { + val view = mockk<View>(relaxed = true) { + every { height } returns 100 + every { getKeyboardHeight() } returns 0 + } + assertEquals(view.height, view.safeHeight()) + } + + @Test + fun `WHEN keyboard is considered open THEN safeHeight returns the given view height plus the keyboard height`() { + val view = mockk<View>(relaxed = true) { + every { height } returns 100 + every { getKeyboardHeight() } returns 50 + } + + val expected = view.height.plus(view.getKeyboardHeight()) + assertEquals(expected, view.safeHeight()) + } +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/ViewTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/ViewTest.kt index a0a8df86ac..f259656026 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/ViewTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/ViewTest.kt @@ -177,4 +177,26 @@ class ViewTest { assertEquals(250, outRect.right) assertEquals(450, outRect.bottom) } + + @Test + fun `getKeyboardHeight returns the keyboard height when keyboard is considered open`() { + val windowVisibleDisplayFrame = Rect(0, 0, 500, 1000) + val keyboardHeight = 500 + every { view.getWindowVisibleDisplayFrame() } returns windowVisibleDisplayFrame + every { view.rootView.height } returns windowVisibleDisplayFrame.bottom.plus(keyboardHeight) + every { view.rootWindowInsets } returns null + + assertEquals(keyboardHeight, view.getKeyboardHeight()) + } + + @Test + fun `getKeyboardHeight returns zero when keyboard is considered closed`() { + val windowVisibleDisplayFrame = Rect(0, 0, 500, 1000) + val keyboardHeight = 0 + every { view.getWindowVisibleDisplayFrame() } returns windowVisibleDisplayFrame + every { view.rootView.height } returns windowVisibleDisplayFrame.bottom.plus(keyboardHeight) + every { view.rootWindowInsets } returns null + + assertEquals(keyboardHeight, view.getKeyboardHeight()) + } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 9061bd669d..dae78a49fe 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -46,9 +46,9 @@ import org.junit.runner.RunWith import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.Events +import org.mozilla.fenix.GleanMetrics.HomeBookmarks import org.mozilla.fenix.GleanMetrics.HomeScreen import org.mozilla.fenix.GleanMetrics.Pings -import org.mozilla.fenix.GleanMetrics.RecentBookmarks import org.mozilla.fenix.GleanMetrics.RecentTabs import org.mozilla.fenix.GleanMetrics.TopSites import org.mozilla.fenix.HomeActivity @@ -62,7 +62,7 @@ import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recenttabs.RecentTab import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.messaging.MessageController @@ -142,7 +142,7 @@ class DefaultSessionControlControllerTest { topSites = emptyList(), showCollectionPlaceholder = true, recentTabs = emptyList(), - recentBookmarks = emptyList(), + bookmarks = emptyList(), ) every { navController.currentDestination } returns mockk { @@ -152,7 +152,6 @@ class DefaultSessionControlControllerTest { every { activity.settings() } returns settings every { activity.components.analytics } returns analytics every { activity.filesDir } returns filesDir - every { filesDir.path } returns "/test" } @Test @@ -1187,28 +1186,28 @@ class DefaultSessionControlControllerTest { } @Test - fun `WHEN handleReportSessionMetrics is called AND there are zero recent bookmarks THEN report Event#RecentBookmarkCount(0)`() { - every { appState.recentBookmarks } returns emptyList() + fun `WHEN handleReportSessionMetrics is called AND there are zero bookmarks THEN report Event#BookmarkCount(0)`() { + every { appState.bookmarks } returns emptyList() every { appState.recentTabs } returns emptyList() - assertNull(RecentBookmarks.recentBookmarksCount.testGetValue()) + assertNull(HomeBookmarks.bookmarksCount.testGetValue()) createController().handleReportSessionMetrics(appState) - assertNotNull(RecentBookmarks.recentBookmarksCount.testGetValue()) - assertEquals(0L, RecentBookmarks.recentBookmarksCount.testGetValue()) + assertNotNull(HomeBookmarks.bookmarksCount.testGetValue()) + assertEquals(0L, HomeBookmarks.bookmarksCount.testGetValue()) } @Test - fun `WHEN handleReportSessionMetrics is called AND there is at least one recent bookmark THEN report Event#RecentBookmarkCount(1)`() { - val recentBookmark: RecentBookmark = mockk(relaxed = true) - every { appState.recentBookmarks } returns listOf(recentBookmark) + fun `WHEN handleReportSessionMetrics is called AND there is at least one bookmark THEN report Event#BookmarkCount(1)`() { + val bookmark: Bookmark = mockk(relaxed = true) + every { appState.bookmarks } returns listOf(bookmark) every { appState.recentTabs } returns emptyList() - assertNull(RecentBookmarks.recentBookmarksCount.testGetValue()) + assertNull(HomeBookmarks.bookmarksCount.testGetValue()) createController().handleReportSessionMetrics(appState) - assertNotNull(RecentBookmarks.recentBookmarksCount.testGetValue()) - assertEquals(1L, RecentBookmarks.recentBookmarksCount.testGetValue()) + assertNotNull(HomeBookmarks.bookmarksCount.testGetValue()) + assertEquals(1L, HomeBookmarks.bookmarksCount.testGetValue()) } @Test diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/HomeMenuViewTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/HomeMenuViewTest.kt index ba7e07e352..3f2e32285a 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/HomeMenuViewTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/HomeMenuViewTest.kt @@ -47,6 +47,7 @@ class HomeMenuViewTest { private lateinit var view: View private lateinit var lifecycleOwner: LifecycleOwner private lateinit var homeActivity: HomeActivity + private lateinit var homeFragment: HomeFragment private lateinit var navController: NavController private lateinit var menuButton: MenuButton private lateinit var homeMenuView: HomeMenuView @@ -56,6 +57,7 @@ class HomeMenuViewTest { view = mockk(relaxed = true) lifecycleOwner = mockk(relaxed = true) homeActivity = mockk(relaxed = true) + homeFragment = mockk(relaxed = true) navController = mockk(relaxed = true) menuButton = spyk(MenuButton(testContext)) @@ -66,7 +68,10 @@ class HomeMenuViewTest { lifecycleOwner = lifecycleOwner, homeActivity = homeActivity, navController = navController, + homeFragment = homeFragment, menuButton = WeakReference(menuButton), + onShowPinVerification = {}, + onBiometricAuthenticationSuccessful = {}, ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt index 78cc69b01b..2020c894c0 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/SessionControlInteractorTest.kt @@ -15,11 +15,11 @@ import org.junit.Before import org.junit.Test import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.appstate.AppState +import org.mozilla.fenix.home.bookmarks.Bookmark +import org.mozilla.fenix.home.bookmarks.controller.BookmarksController import org.mozilla.fenix.home.pocket.PocketRecommendedStoriesCategory import org.mozilla.fenix.home.pocket.PocketStoriesController import org.mozilla.fenix.home.privatebrowsing.controller.PrivateBrowsingController -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark -import org.mozilla.fenix.home.recentbookmarks.controller.RecentBookmarksController import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.controller.RecentSyncedTabController import org.mozilla.fenix.home.recenttabs.controller.RecentTabController @@ -35,7 +35,7 @@ class SessionControlInteractorTest { private val controller: DefaultSessionControlController = mockk(relaxed = true) private val recentTabController: RecentTabController = mockk(relaxed = true) private val recentSyncedTabController: RecentSyncedTabController = mockk(relaxed = true) - private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true) + private val bookmarksController: BookmarksController = mockk(relaxed = true) private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true) private val privateBrowsingController: PrivateBrowsingController = mockk(relaxed = true) private val searchSelectorController: SearchSelectorController = mockk(relaxed = true) @@ -52,7 +52,7 @@ class SessionControlInteractorTest { controller, recentTabController, recentSyncedTabController, - recentBookmarksController, + bookmarksController, recentVisitsController, pocketStoriesController, privateBrowsingController, @@ -195,11 +195,11 @@ class SessionControlInteractorTest { } @Test - fun `WHEN a recently saved bookmark is clicked THEN the selected bookmark is handled`() { - val bookmark = RecentBookmark() + fun `WHEN a bookmark is clicked THEN the selected bookmark is handled`() { + val bookmark = Bookmark() - interactor.onRecentBookmarkClicked(bookmark) - verify { recentBookmarksController.handleBookmarkClicked(bookmark) } + interactor.onBookmarkClicked(bookmark) + verify { bookmarksController.handleBookmarkClicked(bookmark) } } @Test @@ -209,9 +209,9 @@ class SessionControlInteractorTest { } @Test - fun `WHEN Show All recently saved bookmarks button is clicked THEN the click is handled`() { + fun `WHEN Show All bookmarks button is clicked THEN the click is handled`() { interactor.onShowAllBookmarksClicked() - verify { recentBookmarksController.handleShowAllBookmarksClicked() } + verify { bookmarksController.handleShowAllBookmarksClicked() } } @Test @@ -300,7 +300,7 @@ class SessionControlInteractorTest { @Test fun reportSessionMetrics() { val appState: AppState = mockk(relaxed = true) - every { appState.recentBookmarks } returns emptyList() + every { appState.bookmarks } returns emptyList() interactor.reportSessionMetrics(appState) verify { controller.handleReportSessionMetrics(appState) } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistHandlerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistHandlerTest.kt index c41002088e..d0a0167aea 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistHandlerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistHandlerTest.kt @@ -15,7 +15,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab @@ -47,7 +47,7 @@ class BlocklistHandlerTest { @Test fun `GIVEN bookmark is not in blocklist THEN will not be filtered`() { - val bookmarks = listOf(RecentBookmark(url = "test")) + val bookmarks = listOf(Bookmark(url = "test")) every { mockSettings.homescreenBlocklist } returns setOf() val filtered = with(blocklistHandler) { @@ -60,7 +60,7 @@ class BlocklistHandlerTest { @Test fun `GIVEN bookmark is in blocklist THEN will be filtered`() { val blockedUrl = "test" - val bookmarks = listOf(RecentBookmark(url = blockedUrl)) + val bookmarks = listOf(Bookmark(url = blockedUrl)) every { mockSettings.homescreenBlocklist } returns setOf(blockedUrl.stripAndHash()) val filtered = with(blocklistHandler) { diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt index 3339df1ee9..44dd6b385f 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/blocklist/BlocklistMiddlewareTest.kt @@ -19,7 +19,7 @@ import org.mozilla.fenix.components.AppStore import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.helpers.FenixRobolectricTestRunner -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTab import org.mozilla.fenix.home.recentsyncedtabs.RecentSyncedTabState import org.mozilla.fenix.home.recenttabs.RecentTab @@ -32,7 +32,7 @@ class BlocklistMiddlewareTest { @Test fun `GIVEN empty blocklist WHEN action intercepted THEN unchanged by middleware`() { - val updatedBookmark = RecentBookmark(url = "https://www.mozilla.org/") + val updatedBookmark = Bookmark(url = "https://www.mozilla.org/") every { mockSettings.homescreenBlocklist } returns setOf() val middleware = BlocklistMiddleware(blocklistHandler) @@ -48,18 +48,18 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.bookmarks[0]) } @Test fun `GIVEN non-empty blocklist WHEN action intercepted with no matching elements THEN unchanged by middleware`() { - val updatedBookmark = RecentBookmark(url = "https://www.mozilla.org/") + val updatedBookmark = Bookmark(url = "https://www.mozilla.org/") every { mockSettings.homescreenBlocklist } returns setOf("https://www.github.org/".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -75,18 +75,18 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.bookmarks[0]) } @Test fun `GIVEN non-empty blocklist with specific pages WHEN action intercepted with matching host THEN unchanged by middleware`() { - val updatedBookmark = RecentBookmark(url = "https://github.com/") + val updatedBookmark = Bookmark(url = "https://github.com/") every { mockSettings.homescreenBlocklist } returns setOf("https://github.com/mozilla-mobile/fenix".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -102,18 +102,18 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(updatedBookmark, appStore.state.recentBookmarks[0]) + assertEquals(updatedBookmark, appStore.state.bookmarks[0]) } @Test fun `GIVEN non-empty blocklist WHEN action intercepted with matching elements THEN filtered by middleware`() { - val updatedBookmark = RecentBookmark(url = "https://www.mozilla.org/") + val updatedBookmark = Bookmark(url = "https://www.mozilla.org/") every { mockSettings.homescreenBlocklist } returns setOf("https://www.mozilla.org/".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -129,19 +129,19 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.bookmarks.isEmpty()) } @Test fun `GIVEN non-empty blocklist WHEN action intercepted with matching elements THEN all relevant sections filtered by middleware`() { val blockedUrl = "https://www.mozilla.org/" - val updatedBookmarks = listOf(RecentBookmark(url = blockedUrl)) + val updatedBookmarks = listOf(Bookmark(url = blockedUrl)) val updatedRecentTabs = listOf(RecentTab.Tab(createTab(url = blockedUrl))) every { mockSettings.homescreenBlocklist } returns setOf(blockedUrl.stripAndHash()) @@ -158,13 +158,13 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = updatedRecentTabs, - recentBookmarks = updatedBookmarks, + bookmarks = updatedBookmarks, recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.bookmarks.isEmpty()) assertTrue(appStore.state.recentTabs.isEmpty()) } @@ -172,9 +172,9 @@ class BlocklistMiddlewareTest { fun `GIVEN non-empty blocklist WHEN action intercepted with matching elements THEN only matching urls removed`() { val blockedUrl = "https://www.mozilla.org/" val unblockedUrl = "https://www.github.org/" - val unblockedBookmark = RecentBookmark(unblockedUrl) + val unblockedBookmark = Bookmark(unblockedUrl) val updatedBookmarks = listOf( - RecentBookmark(url = blockedUrl), + Bookmark(url = blockedUrl), unblockedBookmark, ) val unblockedRecentTab = RecentTab.Tab(createTab(url = unblockedUrl)) @@ -196,13 +196,13 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = updatedRecentTabs, - recentBookmarks = updatedBookmarks, + bookmarks = updatedBookmarks, recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertEquals(unblockedBookmark, appStore.state.recentBookmarks[0]) + assertEquals(unblockedBookmark, appStore.state.bookmarks[0]) assertEquals(unblockedRecentTab, appStore.state.recentTabs[0]) } @@ -210,30 +210,30 @@ class BlocklistMiddlewareTest { fun `WHEN remove action intercepted THEN hashed url added to blocklist and Change action dispatched`() { val captureMiddleware = CaptureActionsMiddleware<AppState, AppAction>() val removedUrl = "https://www.mozilla.org/" - val removedBookmark = RecentBookmark(url = removedUrl) + val removedBookmark = Bookmark(url = removedUrl) val updateSlot = slot<Set<String>>() every { mockSettings.homescreenBlocklist } returns setOf() andThen setOf(removedUrl.stripAndHash()) every { mockSettings.homescreenBlocklist = capture(updateSlot) } returns Unit val middleware = BlocklistMiddleware(blocklistHandler) val appStore = AppStore( - AppState(recentBookmarks = listOf(removedBookmark)), + AppState(bookmarks = listOf(removedBookmark)), middlewares = listOf(middleware, captureMiddleware), ) appStore.dispatch( - AppAction.RemoveRecentBookmark(removedBookmark), + AppAction.RemoveBookmark(removedBookmark), ).joinBlocking() val capturedAction = captureMiddleware.findFirstAction(AppAction.Change::class) - assertEquals(emptyList<RecentBookmark>(), capturedAction.recentBookmarks) + assertEquals(emptyList<Bookmark>(), capturedAction.bookmarks) assertEquals(setOf(removedUrl.stripAndHash()), updateSlot.captured) } @Test fun `WHEN urls are compared to blocklist THEN protocols are stripped`() { val host = "www.mozilla.org/" - val updatedBookmark = RecentBookmark(url = "http://$host") + val updatedBookmark = Bookmark(url = "http://$host") every { mockSettings.homescreenBlocklist } returns setOf("https://$host".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -249,19 +249,19 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.bookmarks.isEmpty()) } @Test fun `WHEN urls are compared to blocklist THEN common subdomains are stripped`() { val host = "mozilla.org/" - val updatedBookmark = RecentBookmark(url = host) + val updatedBookmark = Bookmark(url = host) every { mockSettings.homescreenBlocklist } returns setOf(host.stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -277,19 +277,19 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.bookmarks.isEmpty()) } @Test fun `WHEN urls are compared to blocklist THEN trailing slashes are stripped`() { val host = "www.mozilla.org" - val updatedBookmark = RecentBookmark(url = "http://$host/") + val updatedBookmark = Bookmark(url = "http://$host/") every { mockSettings.homescreenBlocklist } returns setOf("https://$host".stripAndHash()) val middleware = BlocklistMiddleware(blocklistHandler) @@ -305,13 +305,13 @@ class BlocklistMiddlewareTest { collections = appStore.state.collections, showCollectionPlaceholder = appStore.state.showCollectionPlaceholder, recentTabs = appStore.state.recentTabs, - recentBookmarks = listOf(updatedBookmark), + bookmarks = listOf(updatedBookmark), recentHistory = appStore.state.recentHistory, recentSyncedTabState = appStore.state.recentSyncedTabState, ), ).joinBlocking() - assertTrue(appStore.state.recentBookmarks.isEmpty()) + assertTrue(appStore.state.bookmarks.isEmpty()) } @Test diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/RecentBookmarksFeatureTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/bookmarks/BookmarksFeatureTest.kt index 74553b9b5b..8709b7601b 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/RecentBookmarksFeatureTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/bookmarks/BookmarksFeatureTest.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks +package org.mozilla.fenix.home.bookmarks import io.mockk.coEvery import io.mockk.coVerify @@ -24,12 +24,12 @@ import org.mozilla.fenix.components.appstate.AppState import org.mozilla.fenix.components.bookmarks.BookmarksUseCase @OptIn(ExperimentalCoroutinesApi::class) -class RecentBookmarksFeatureTest { +class BookmarksFeatureTest { private val middleware = CaptureActionsMiddleware<AppState, AppAction>() private val appStore = AppStore(middlewares = listOf(middleware)) private val bookmarksUseCases: BookmarksUseCase = mockk(relaxed = true) - private val bookmark = RecentBookmark( + private val bookmark = Bookmark( title = null, url = "https://www.example.com", previewImageUrl = null, @@ -46,16 +46,16 @@ class RecentBookmarksFeatureTest { } @Test - fun `GIVEN no recent bookmarks WHEN feature starts THEN fetch bookmarks and notify store`() = + fun `GIVEN no bookmarks WHEN feature starts THEN fetch bookmarks and notify store`() = runTestOnMain { - val feature = RecentBookmarksFeature( + val feature = BookmarksFeature( appStore, bookmarksUseCases, scope, testDispatcher, ) - assertEquals(emptyList<BookmarkNode>(), appStore.state.recentBookmarks) + assertEquals(emptyList<BookmarkNode>(), appStore.state.bookmarks) feature.start() @@ -66,8 +66,8 @@ class RecentBookmarksFeatureTest { bookmarksUseCases.retrieveRecentBookmarks() } - middleware.assertLastAction(AppAction.RecentBookmarksChange::class) { - assertEquals(listOf(bookmark), it.recentBookmarks) + middleware.assertLastAction(AppAction.BookmarksChange::class) { + assertEquals(listOf(bookmark), it.bookmarks) } } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/bookmarks/DefaultBookmarksControllerTest.kt index 6f03ddbf9a..e5fced4130 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentbookmarks/DefaultRecentBookmarksControllerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/bookmarks/DefaultBookmarksControllerTest.kt @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix.home.recentbookmarks +package org.mozilla.fenix.home.bookmarks import androidx.navigation.NavController import io.mockk.Runs @@ -28,15 +28,15 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.BrowserDirection -import org.mozilla.fenix.GleanMetrics.RecentBookmarks +import org.mozilla.fenix.GleanMetrics.HomeBookmarks import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.HomeFragmentDirections -import org.mozilla.fenix.home.recentbookmarks.controller.DefaultRecentBookmarksController +import org.mozilla.fenix.home.bookmarks.controller.DefaultBookmarksController @RunWith(FenixRobolectricTestRunner::class) -class DefaultRecentBookmarksControllerTest { +class DefaultBookmarksControllerTest { @get:Rule val gleanTestRule = GleanTestRule(testContext) @@ -49,7 +49,7 @@ class DefaultRecentBookmarksControllerTest { private val selectTabUseCase: TabsUseCases = mockk(relaxed = true) private val browserStore: BrowserStore = mockk(relaxed = true) - private lateinit var controller: DefaultRecentBookmarksController + private lateinit var controller: DefaultBookmarksController @Before fun setup() { @@ -57,7 +57,7 @@ class DefaultRecentBookmarksControllerTest { every { browserStore.state.tabs }.returns(emptyList()) controller = spyk( - DefaultRecentBookmarksController( + DefaultBookmarksController( activity = activity, navController = navController, appStore = mockk(), @@ -68,10 +68,10 @@ class DefaultRecentBookmarksControllerTest { } @Test - fun `GIVEN no tabs WHEN a recently saved bookmark is clicked THEN the selected bookmark is opened in a new tab`() { - assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) + fun `GIVEN no tabs WHEN a bookmark is clicked THEN the selected bookmark is opened in a new tab`() { + assertNull(HomeBookmarks.bookmarkClicked.testGetValue()) - val bookmark = RecentBookmark(title = null, url = "https://www.example.com") + val bookmark = Bookmark(title = null, url = "https://www.example.com") controller.handleBookmarkClicked(bookmark) verify { @@ -82,17 +82,17 @@ class DefaultRecentBookmarksControllerTest { from = BrowserDirection.FromHome, ) } - assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) + assertNotNull(HomeBookmarks.bookmarkClicked.testGetValue()) } @Test - fun `GIVEN no matching tabs WHEN a recently saved bookmark is clicked THEN the selected bookmark is opened in a new tab`() { - assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) + fun `GIVEN no matching tabs WHEN a bookmark is clicked THEN the selected bookmark is opened in a new tab`() { + assertNull(HomeBookmarks.bookmarkClicked.testGetValue()) val testTab = createTab("https://www.not_example.com") every { browserStore.state.tabs }.returns(listOf(testTab)) - val bookmark = RecentBookmark(title = null, url = "https://www.example.com") + val bookmark = Bookmark(title = null, url = "https://www.example.com") controller.handleBookmarkClicked(bookmark) verify { @@ -103,30 +103,30 @@ class DefaultRecentBookmarksControllerTest { from = BrowserDirection.FromHome, ) } - assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) + assertNotNull(HomeBookmarks.bookmarkClicked.testGetValue()) } @Test - fun `GIVEN matching tab WHEN a recently saved bookmark is clicked THEN the existing tab is opened`() { - assertNull(RecentBookmarks.bookmarkClicked.testGetValue()) + fun `GIVEN matching tab WHEN a bookmark is clicked THEN the existing tab is opened`() { + assertNull(HomeBookmarks.bookmarkClicked.testGetValue()) val testUrl = "https://www.example.com" val testTab = createTab(testUrl) every { browserStore.state.tabs }.returns(listOf(testTab)) - val bookmark = RecentBookmark(title = null, url = testUrl) + val bookmark = Bookmark(title = null, url = testUrl) controller.handleBookmarkClicked(bookmark) verify { selectTabUseCase.invoke(testTab.id) navController.navigate(R.id.browserFragment) } - assertNotNull(RecentBookmarks.bookmarkClicked.testGetValue()) + assertNotNull(HomeBookmarks.bookmarkClicked.testGetValue()) } @Test - fun `WHEN show all recently saved bookmark is clicked THEN the bookmarks root is opened`() = runTestOnMain { - assertNull(RecentBookmarks.showAllBookmarks.testGetValue()) + fun `WHEN show all bookmarks is clicked THEN the bookmarks root is opened`() = runTestOnMain { + assertNull(HomeBookmarks.showAllBookmarks.testGetValue()) controller.handleShowAllBookmarksClicked() @@ -134,12 +134,12 @@ class DefaultRecentBookmarksControllerTest { verify { navController.navigate(directions) } - assertNotNull(RecentBookmarks.showAllBookmarks.testGetValue()) + assertNotNull(HomeBookmarks.showAllBookmarks.testGetValue()) } @Test - fun `WHEN show all is clicked from behind search dialog THEN open bookmarks root`() { - assertNull(RecentBookmarks.showAllBookmarks.testGetValue()) + fun `WHEN show all bppkmarks is clicked from behind search dialog THEN open bookmarks root`() { + assertNull(HomeBookmarks.showAllBookmarks.testGetValue()) controller.handleShowAllBookmarksClicked() @@ -148,6 +148,6 @@ class DefaultRecentBookmarksControllerTest { verify { navController.navigate(directions) } - assertNotNull(RecentBookmarks.showAllBookmarks.testGetValue()) + assertNotNull(HomeBookmarks.showAllBookmarks.testGetValue()) } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessorTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessorTest.kt new file mode 100644 index 0000000000..ec26cdd132 --- /dev/null +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/intent/OpenRecentlyClosedIntentProcessorTest.kt @@ -0,0 +1,74 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.home.intent + +import android.content.Intent +import androidx.navigation.NavController +import io.mockk.Called +import io.mockk.mockk +import io.mockk.verify +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.NavGraphDirections +import org.mozilla.fenix.ext.nav +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner + +@RunWith(FenixRobolectricTestRunner::class) +class OpenRecentlyClosedIntentProcessorTest { + private lateinit var activity: HomeActivity + private lateinit var navController: NavController + private lateinit var out: Intent + private lateinit var processor: OpenRecentlyClosedIntentProcessor + + @Before + fun setup() { + activity = mockk(relaxed = true) + navController = mockk(relaxed = true) + out = mockk(relaxed = true) + processor = OpenRecentlyClosedIntentProcessor() + } + + @Test + fun `GIVEN a blank intent WHEN it is processed THEN nothing should happen`() { + assertFalse(processor.process(Intent(), navController, out)) + + verify { activity wasNot Called } + verify { navController wasNot Called } + verify { out wasNot Called } + } + + @Test + fun `GIVEN an intent with wrong action WHEN it is processed THEN nothing should happen`() { + val intent = Intent().apply { + action = TEST_WRONG_ACTION + } + + assertFalse(processor.process(intent, navController, out)) + + verify { activity wasNot Called } + verify { navController wasNot Called } + verify { out wasNot Called } + } + + @Test + fun `GIVEN an intent with correct action WHEN it is processed THEN navigate to the recently closed fragment`() { + val intent = Intent().apply { + action = OpenRecentlyClosedIntentProcessor.ACTION_OPEN_RECENTLY_CLOSED + } + + assertTrue(processor.process(intent, navController, out)) + + verify { navController.nav(null, NavGraphDirections.actionGlobalRecentlyClosed()) } + verify { out wasNot Called } + } + + companion object { + const val TEST_WRONG_ACTION = "test-action" + } +} diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt index e0be6f843c..eb5d9ec51f 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/recentvisits/interactor/RecentVisitsInteractorTest.kt @@ -11,9 +11,9 @@ import mozilla.components.concept.storage.HistoryMetadata import mozilla.components.concept.storage.HistoryMetadataKey import org.junit.Before import org.junit.Test +import org.mozilla.fenix.home.bookmarks.controller.BookmarksController import org.mozilla.fenix.home.pocket.PocketStoriesController import org.mozilla.fenix.home.privatebrowsing.controller.PrivateBrowsingController -import org.mozilla.fenix.home.recentbookmarks.controller.RecentBookmarksController import org.mozilla.fenix.home.recentsyncedtabs.controller.RecentSyncedTabController import org.mozilla.fenix.home.recenttabs.controller.RecentTabController import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGroup @@ -29,7 +29,7 @@ class RecentVisitsInteractorTest { mockk(relaxed = true) private val recentTabController: RecentTabController = mockk(relaxed = true) private val recentSyncedTabController: RecentSyncedTabController = mockk(relaxed = true) - private val recentBookmarksController: RecentBookmarksController = mockk(relaxed = true) + private val bookmarksController: BookmarksController = mockk(relaxed = true) private val recentVisitsController: RecentVisitsController = mockk(relaxed = true) private val pocketStoriesController: PocketStoriesController = mockk(relaxed = true) private val privateBrowsingController: PrivateBrowsingController = mockk(relaxed = true) @@ -44,7 +44,7 @@ class RecentVisitsInteractorTest { defaultSessionControlController, recentTabController, recentSyncedTabController, - recentBookmarksController, + bookmarksController, recentVisitsController, pocketStoriesController, privateBrowsingController, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/SessionControlViewTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/SessionControlViewTest.kt index 22239dfc86..9094f09f99 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/SessionControlViewTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/sessioncontrol/SessionControlViewTest.kt @@ -14,7 +14,7 @@ import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test -import org.mozilla.fenix.home.recentbookmarks.RecentBookmark +import org.mozilla.fenix.home.bookmarks.Bookmark import org.mozilla.fenix.home.recentvisits.RecentlyVisitedItem.RecentHistoryGroup import org.mozilla.fenix.utils.Settings @@ -26,13 +26,13 @@ class SessionControlViewTest { val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf(RecentBookmark()) + val bookmarks = listOf(Bookmark()) val historyMetadata = emptyList<RecentHistoryGroup>() val pocketStories = emptyList<PocketStory>() every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -41,7 +41,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, false, @@ -51,8 +51,8 @@ class SessionControlViewTest { ) assertTrue(results[0] is AdapterItem.TopPlaceholderItem) - assertTrue(results[1] is AdapterItem.RecentBookmarksHeader) - assertTrue(results[2] is AdapterItem.RecentBookmarks) + assertTrue(results[1] is AdapterItem.BookmarksHeader) + assertTrue(results[2] is AdapterItem.Bookmarks) assertTrue(results[3] is AdapterItem.CustomizeHomeButton) } @@ -62,14 +62,14 @@ class SessionControlViewTest { val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf(RecentBookmark()) + val bookmarks = listOf(Bookmark()) val historyMetadata = emptyList<RecentHistoryGroup>() val pocketStories = emptyList<PocketStory>() val nimbusMessageCard: Message = mockk() every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -78,7 +78,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, nimbusMessageCard, false, @@ -96,13 +96,13 @@ class SessionControlViewTest { val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf<RecentBookmark>() + val bookmarks = listOf<Bookmark>() val historyMetadata = emptyList<RecentHistoryGroup>() val pocketStories = emptyList<PocketStory>() every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -111,7 +111,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, true, @@ -132,13 +132,13 @@ class SessionControlViewTest { val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf<RecentBookmark>() + val bookmarks = listOf<Bookmark>() val historyMetadata = listOf(RecentHistoryGroup("title", emptyList())) val pocketStories = emptyList<PocketStory>() every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -147,7 +147,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, false, @@ -168,13 +168,13 @@ class SessionControlViewTest { val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf<RecentBookmark>() + val bookmarks = listOf<Bookmark>() val historyMetadata = emptyList<RecentHistoryGroup>() val pocketStories = listOf(PocketRecommendedStory("", "", "", "", "", 1, 1)) every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -183,7 +183,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, false, @@ -205,7 +205,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, false, @@ -220,18 +220,18 @@ class SessionControlViewTest { } @Test - fun `GIVEN none recentBookmarks,recentTabs, historyMetadata or pocketArticles WHEN normalModeAdapterItems is called THEN the customize home button is not added`() { + fun `GIVEN none bookmarks, recentTabs, historyMetadata or pocketArticles WHEN normalModeAdapterItems is called THEN the customize home button is not added`() { val settings: Settings = mockk() val topSites = emptyList<TopSite>() val collections = emptyList<TabCollection>() val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf<RecentBookmark>() + val bookmarks = listOf<Bookmark>() val historyMetadata = emptyList<RecentHistoryGroup>() val pocketStories = emptyList<PocketStory>() every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true @@ -240,7 +240,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, false, @@ -261,13 +261,13 @@ class SessionControlViewTest { val topSites = listOf<TopSite>(mockk()) val collections = listOf(collection) val expandedCollections = emptySet<Long>() - val recentBookmarks = listOf<RecentBookmark>(mockk()) + val bookmarks = listOf<Bookmark>(mockk()) val historyMetadata = listOf<RecentHistoryGroup>(mockk()) val pocketStories = listOf<PocketStory>(mockk()) every { settings.showTopSitesFeature } returns true every { settings.showRecentTabsFeature } returns true - every { settings.showRecentBookmarksFeature } returns true + every { settings.showBookmarksHomeFeature } returns true every { settings.historyMetadataUIFeature } returns true every { settings.showPocketRecommendationsFeature } returns true every { settings.enableComposeTopSites } returns false @@ -277,7 +277,7 @@ class SessionControlViewTest { topSites, collections, expandedCollections, - recentBookmarks, + bookmarks, false, null, true, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt index f16d3cef42..48106fbd2f 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/library/bookmarks/BookmarkItemMenuTest.kt @@ -52,7 +52,7 @@ class BookmarkItemMenuTest { assertNotNull(deleteItem) assertEquals("Delete", deleteItem!!.text) assertEquals( - TextStyle(color = context.getColorFromAttr(R.attr.textWarning)), + TextStyle(color = context.getColorFromAttr(R.attr.textCritical)), deleteItem!!.textStyle, ) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/MessagingFeatureTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/MessagingFeatureTest.kt index 838e852f42..b56dcbca42 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/MessagingFeatureTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/messaging/MessagingFeatureTest.kt @@ -21,7 +21,10 @@ class MessagingFeatureTest { @Test fun `WHEN start is called THEN evaluate messages`() { val appStore: AppStore = spyk(AppStore()) - val binding = MessagingFeature(appStore) + val binding = MessagingFeature( + appStore = appStore, + surface = FenixMessageSurfaceId.HOMESCREEN, + ) binding.start() diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt index 5aa5baf8d9..3edb9798eb 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/toolbar/ToolbarViewTest.kt @@ -146,8 +146,8 @@ class ToolbarViewTest { every { context.settings().showUnifiedSearchFeature } returns true every { context.settings().shouldShowHistorySuggestions } returns true every { context.settings().shouldShowBookmarkSuggestions } returns true - every { context.settings().isTabletAndTabStripEnabled } returns false every { context.settings().enableIncompleteToolbarRedesign } returns false + every { context.settings().shouldAutocompleteInAwesomebar } returns false val view = buildToolbarView(false) mockkObject(FeatureFlags) @@ -163,7 +163,6 @@ class ToolbarViewTest { every { context.settings().showUnifiedSearchFeature } returns true every { context.settings().shouldShowHistorySuggestions } returns true every { context.settings().shouldShowBookmarkSuggestions } returns true - every { context.settings().isTabletAndTabStripEnabled } returns false every { context.settings().enableIncompleteToolbarRedesign } returns false val view = buildToolbarView(false) mockkObject(FeatureFlags) @@ -450,7 +449,6 @@ class ToolbarViewTest { fun `GIVEN autocomplete disabled WHEN the toolbar view is initialized THEN create an autocomplete with disabled functionality`() { val settings: Settings = mockk { every { shouldAutocompleteInAwesomebar } returns false - every { isTabletAndTabStripEnabled } returns false } val toolbarView = buildToolbarView(true, settings) @@ -463,7 +461,6 @@ class ToolbarViewTest { fun `GIVEN autocomplete enabled WHEN the toolbar view is initialized THEN create an autocomplete with enabled functionality`() { val settings: Settings = mockk { every { shouldAutocompleteInAwesomebar } returns true - every { isTabletAndTabStripEnabled } returns false } val toolbarView = buildToolbarView(true, settings) diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/PreferenceBackedRadioButtonTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/PreferenceBackedRadioButtonTest.kt index 734db75ec9..7dcdd5bf2d 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/PreferenceBackedRadioButtonTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/PreferenceBackedRadioButtonTest.kt @@ -137,6 +137,7 @@ class PreferenceBackedRadioButtonTest { fun `WHEN the button gets enabled THEN set isChecked based on the value from the backing preference`() { every { testContext.settings().preferences.getBoolean(any(), any()) } returns true val button = spyk(PreferenceBackedRadioButton(testContext)) + every { button.isChecked = any() } returns Unit button.isEnabled = true diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt index 6545d11d09..6a6d01d58f 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/creditcards/CreditCardEditorViewTest.kt @@ -168,7 +168,7 @@ class CreditCardEditorViewTest { assertNotNull(fragmentCreditCardEditorBinding.cardNumberLayout.error) assertEquals( fragmentCreditCardEditorBinding.cardNumberLayout.errorCurrentTextColors, - fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textWarning), + fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textCritical), ) verify(exactly = 0) { @@ -193,7 +193,7 @@ class CreditCardEditorViewTest { assertNotNull(fragmentCreditCardEditorBinding.cardNumberLayout.error) assertEquals( fragmentCreditCardEditorBinding.cardNumberLayout.errorCurrentTextColors, - fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textWarning), + fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textCritical), ) verify(exactly = 0) { @@ -269,7 +269,7 @@ class CreditCardEditorViewTest { assertNotNull(fragmentCreditCardEditorBinding.nameOnCardLayout.error) assertEquals( fragmentCreditCardEditorBinding.nameOnCardLayout.errorCurrentTextColors, - fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textWarning), + fragmentCreditCardEditorBinding.root.context.getColorFromAttr(R.attr.textCritical), ) verify(exactly = 0) { diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt index 72db3c97cb..bcbdf6fc3f 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/share/SaveToPDFMiddlewareTest.kt @@ -4,7 +4,6 @@ package org.mozilla.fenix.share -import android.content.Context import io.mockk.every import io.mockk.mockk import io.mockk.verify @@ -15,7 +14,6 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.EngineSession import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.libstate.ext.waitUntilIdle -import mozilla.components.support.test.mock import mozilla.components.support.test.robolectric.testContext import mozilla.components.support.test.rule.MainCoroutineRule import mozilla.components.support.test.rule.runTestOnMain @@ -25,6 +23,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mozilla.experiments.nimbus.NimbusEventStore import org.mozilla.fenix.GleanMetrics.Events import org.mozilla.fenix.R import org.mozilla.fenix.browser.StandardSnackbarError @@ -48,8 +47,15 @@ class SaveToPDFMiddlewareTest { // Only ERROR_PRINT_SETTINGS_SERVICE_NOT_AVAILABLE is available for testing class MockGeckoPrintException() : GeckoSession.GeckoPrintException() + private lateinit var middleware: SaveToPDFMiddleware + + private lateinit var eventStore: NimbusEventStore + @Before fun setup() { + eventStore = mockk(relaxed = true) + middleware = + SaveToPDFMiddleware(context = testContext, nimbusEventStore = eventStore) appStore = mockk(relaxed = true) every { testContext.components.appStore } returns appStore } @@ -58,7 +64,6 @@ class SaveToPDFMiddlewareTest { fun `GIVEN a save to pdf request WHEN it fails unexpectedly THEN unknown failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = RuntimeException("reader save to pdf failed") - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -104,7 +109,6 @@ class SaveToPDFMiddlewareTest { fun `GIVEN a save to pdf request WHEN it fails due to io THEN io failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = IOException() - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -148,7 +152,6 @@ class SaveToPDFMiddlewareTest { fun `GIVEN a save to pdf request WHEN it fails due to print exception THEN print exception failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = MockGeckoPrintException() - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -191,7 +194,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a save to pdf request WHEN it completes THEN completed telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -223,7 +225,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a save to pdf request WHEN it the action begins THEN tapped telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -254,8 +255,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a save as pdf exception THEN should calculate the correct failure reason for telemetry`() = runTestOnMain { - val mockContext: Context = mock() - val middleware = SaveToPDFMiddleware(mockContext) val noSettingsService = middleware.telemetryErrorReason(MockGeckoPrintException()) assertEquals("no_settings_service", noSettingsService) val ioException = middleware.telemetryErrorReason(IOException()) @@ -266,8 +265,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a save as pdf page type THEN should calculate the correct page source for telemetry`() = runTestOnMain { - val mockContext: Context = mock() - val middleware = SaveToPDFMiddleware(mockContext) assertEquals("pdf", middleware.telemetrySource(isPdfViewer = true)) assertEquals("non-pdf", middleware.telemetrySource(isPdfViewer = false)) assertEquals("unknown", middleware.telemetrySource(isPdfViewer = null)) @@ -276,7 +273,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a print request WHEN it fails unexpectedly THEN unknown failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = RuntimeException("No Print Spooler") - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -321,7 +317,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a print request WHEN it fails due to print exception THEN print exception failure telemetry is sent AND a snackbar error is shown`() = runTestOnMain { val exceptionToThrow = MockGeckoPrintException() - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -363,7 +358,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a print request WHEN it completes THEN completed telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -394,7 +388,6 @@ class SaveToPDFMiddlewareTest { @Test fun `GIVEN a print request WHEN it the action begins THEN tapped telemetry is sent`() = runTestOnMain { - val middleware = SaveToPDFMiddleware(testContext) val mockEngineSession: EngineSession = mockk<EngineSession>().apply { every { checkForPdfViewer(any(), any()) @@ -421,5 +414,8 @@ class SaveToPDFMiddlewareTest { assertNotNull(response) val source = response?.firstOrNull()?.extra?.get("source") assertEquals("non-pdf", source) + verify { + eventStore.recordEvent("print_tapped") + } } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt index acf66374bc..56bc49203d 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/sync/ext/SyncedDeviceTabsTest.kt @@ -9,12 +9,14 @@ import io.mockk.mockk import mozilla.components.browser.storage.sync.SyncedDeviceTabs import mozilla.components.browser.storage.sync.Tab import mozilla.components.browser.storage.sync.TabEntry +import mozilla.components.concept.sync.DeviceCapability import mozilla.components.concept.sync.DeviceType import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test import org.mozilla.fenix.tabstray.ext.toComposeList import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListItem +import org.mozilla.fenix.tabstray.syncedtabs.SyncedTabsListSupportedFeature class SyncedDeviceTabsTest { private val noTabDevice = SyncedDeviceTabs( @@ -22,15 +24,17 @@ class SyncedDeviceTabsTest { every { displayName } returns "Charcoal" every { id } returns "123" every { deviceType } returns DeviceType.DESKTOP + every { capabilities } returns emptyList() }, tabs = emptyList(), ) - private val oneTabDevice = SyncedDeviceTabs( + private val oneTabDeviceWithoutCapabilities = SyncedDeviceTabs( device = mockk { every { displayName } returns "Charcoal" every { id } returns "1234" every { deviceType } returns DeviceType.DESKTOP + every { capabilities } returns emptyList() }, tabs = listOf( Tab( @@ -48,11 +52,35 @@ class SyncedDeviceTabsTest { ), ) + private val oneTabDeviceWithCapabilities = SyncedDeviceTabs( + device = mockk { + every { displayName } returns "Sapphire" + every { id } returns "123456" + every { deviceType } returns DeviceType.MOBILE + every { capabilities } returns listOf(DeviceCapability.CLOSE_TABS) + }, + tabs = listOf( + Tab( + history = listOf( + TabEntry( + title = "Thunderbird", + url = "https://getthunderbird.org", + iconUrl = null, + ), + ), + active = 0, + lastUsed = 0L, + inactive = false, + ), + ), + ) + private val twoTabDevice = SyncedDeviceTabs( device = mockk { every { displayName } returns "Emerald" every { id } returns "12345" every { deviceType } returns DeviceType.MOBILE + every { capabilities } returns emptyList() }, tabs = listOf( Tab( @@ -84,12 +112,12 @@ class SyncedDeviceTabsTest { @Test fun `GIVEN two synced devices WHEN the compose list is generated THEN two device section is returned`() { - val syncedDeviceList = listOf(oneTabDevice, twoTabDevice) + val syncedDeviceList = listOf(oneTabDeviceWithoutCapabilities, twoTabDevice) val listData = syncedDeviceList.toComposeList() assertEquals(2, listData.count()) assertTrue(listData[0] is SyncedTabsListItem.DeviceSection) - assertEquals(oneTabDevice.tabs.size, (listData[0] as SyncedTabsListItem.DeviceSection).tabs.size) + assertEquals(oneTabDeviceWithoutCapabilities.tabs.size, (listData[0] as SyncedTabsListItem.DeviceSection).tabs.size) assertTrue(listData[1] is SyncedTabsListItem.DeviceSection) assertEquals(twoTabDevice.tabs.size, (listData[1] as SyncedTabsListItem.DeviceSection).tabs.size) } @@ -103,4 +131,30 @@ class SyncedDeviceTabsTest { assertTrue(listData[0] is SyncedTabsListItem.DeviceSection) assertEquals(0, (listData[0] as SyncedTabsListItem.DeviceSection).tabs.size) } + + @Test + fun `GIVEN two synced devices AND one device supports closing synced tabs AND closing synced tabs is enabled WHEN the compose list is generated THEN two device sections are returned`() { + val syncedDeviceList = listOf(oneTabDeviceWithoutCapabilities, oneTabDeviceWithCapabilities) + val listData = syncedDeviceList.toComposeList(setOf(SyncedTabsListSupportedFeature.CLOSE_TABS)) + val deviceSections = listData.filterIsInstance<SyncedTabsListItem.DeviceSection>() + + assertEquals(2, listData.size) + assertEquals(listData.size, deviceSections.size) + + assertEquals(setOf(SyncedTabsListItem.Tab.Action.None), deviceSections[0].tabs.map { it.action }.toSet()) + assertEquals(setOf(SyncedTabsListItem.Tab.Action.Close(deviceId = "123456")), deviceSections[1].tabs.map { it.action }.toSet()) + } + + @Test + fun `GIVEN two synced devices AND one device supports closing synced tabs AND closing synced tabs is disabled WHEN the compose list is generated THEN two device sections are returned`() { + val syncedDeviceList = listOf(oneTabDeviceWithoutCapabilities, oneTabDeviceWithCapabilities) + val listData = syncedDeviceList.toComposeList(emptySet()) + val deviceSections = listData.filterIsInstance<SyncedTabsListItem.DeviceSection>() + + assertEquals(2, listData.size) + assertEquals(listData.size, deviceSections.size) + + assertEquals(setOf(SyncedTabsListItem.Tab.Action.None), deviceSections[0].tabs.map { it.action }.toSet()) + assertEquals(setOf(SyncedTabsListItem.Tab.Action.None), deviceSections[1].tabs.map { it.action }.toSet()) + } } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt index 3f522dea41..87f0b9b232 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/tabstray/DefaultTabsTrayControllerTest.kt @@ -31,6 +31,7 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.storage.sync.Tab import mozilla.components.browser.storage.sync.TabEntry import mozilla.components.concept.base.profiler.Profiler +import mozilla.components.feature.accounts.push.CloseTabsUseCases import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.service.glean.testing.GleanTestRule import mozilla.components.support.test.ext.joinBlocking @@ -103,6 +104,7 @@ class DefaultTabsTrayControllerTest { private val settings: Settings = mockk(relaxed = true) private val bookmarksUseCase: BookmarksUseCase = mockk(relaxed = true) + private val closeSyncedTabsUseCases: CloseTabsUseCases = mockk(relaxed = true) private val collectionStorage: TabCollectionStorage = mockk(relaxed = true) private val bookmarksSharedViewModel: BookmarksSharedViewModel = mockk(relaxed = true) @@ -570,6 +572,19 @@ class DefaultTabsTrayControllerTest { } @Test + fun `WHEN a synced tab is closed THEN a command to close the tab is sent`() { + val tab = mockk<Tab>() + val entry = mockk<TabEntry>() + + every { tab.active() }.answers { entry } + every { entry.url }.answers { "https://mozilla.org" } + + createController().handleSyncedTabClosed(deviceId = "1234", tab) + + coVerify(exactly = 1) { closeSyncedTabsUseCases.close("1234", any()) } + } + + @Test fun `GIVEN no tabs selected and the user is not in multi select mode WHEN the user long taps a tab THEN that tab will become selected`() { trayStore = TabsTrayStore() val controller = spyk(createController()) @@ -1153,6 +1168,7 @@ class DefaultTabsTrayControllerTest { navigationInteractor = navigationInteractor, tabsUseCases = tabsUseCases, bookmarksUseCase = bookmarksUseCase, + closeSyncedTabsUseCases = closeSyncedTabsUseCases, collectionStorage = collectionStorage, ioDispatcher = testDispatcher, selectTabPosition = selectTabPosition, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogBindingTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogBindingTest.kt index 6b860a6212..ed8b290395 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogBindingTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogBindingTest.kt @@ -56,7 +56,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -138,7 +137,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -184,7 +182,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -231,7 +228,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -249,6 +245,31 @@ class TranslationsDialogBindingTest { ), ).joinBlocking() + // Simulate success response post-translate + val detectedLanguages = DetectedLanguages( + documentLangTag = "en", + supportedDocumentLang = true, + userPreferredLangTag = "es", + ) + + val translationEngineState = TranslationEngineState( + detectedLanguages = detectedLanguages, + error = null, + isEngineReady = true, + hasVisibleChange = true, + requestedTranslationPair = TranslationPair( + fromLanguage = "en", + toLanguage = "es", + ), + ) + + browserStore.dispatch( + TranslationsAction.TranslateStateChangeAction( + tabId = tabId, + translationEngineState = translationEngineState, + ), + ).joinBlocking() + verify(translationsDialogStore).dispatch( TranslationsDialogAction.UpdateTranslated( true, @@ -281,7 +302,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -321,7 +341,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -359,7 +378,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, @@ -410,7 +428,6 @@ class TranslationsDialogBindingTest { val binding = TranslationsDialogBinding( browserStore = browserStore, translationsDialogStore = translationsDialogStore, - sessionId = tabId, getTranslatedPageTitle = { localizedFrom, localizedTo -> testContext.getString( R.string.translations_bottom_sheet_title_translation_completed, diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogMiddlewareTest.kt index c03c74de5c..e0e2aa1ffe 100644 --- a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogMiddlewareTest.kt +++ b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/translations/TranslationsDialogMiddlewareTest.kt @@ -4,11 +4,12 @@ package org.mozilla.fenix.translations -import android.content.Context -import io.mockk.mockk +import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.test.runTest import mozilla.components.browser.state.action.TranslationsAction +import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.translate.Language import mozilla.components.concept.engine.translate.TranslationOperation @@ -25,11 +26,17 @@ import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class TranslationsDialogMiddlewareTest { - private val browserStore = mockk<BrowserStore>(relaxed = true) - private val context = mockk<Context>(relaxed = true) + private val browserStore = spyk( + BrowserStore( + BrowserState( + tabs = listOf(createTab("https://www.mozilla.org", id = "tab1")), + selectedTabId = "tab1", + ), + ), + ) private val settings = Settings(testContext) private val translationsDialogMiddleware = - TranslationsDialogMiddleware(browserStore = browserStore, sessionId = "tab1", settings = settings) + TranslationsDialogMiddleware(browserStore = browserStore, settings = settings) @Test fun `GIVEN translationState WHEN FetchSupportedLanguages action is called THEN call OperationRequestedAction from BrowserStore`() = @@ -166,10 +173,8 @@ class TranslationsDialogMiddlewareTest { verify { browserStore.dispatch( - TranslationsAction.UpdatePageSettingAction( - tabId = "tab1", - operation = TranslationPageSettingOperation.UPDATE_ALWAYS_OFFER_POPUP, - setting = false, + TranslationsAction.SetGlobalOfferTranslateSettingAction( + offerTranslation = false, ), ) } diff --git a/mobile/android/fenix/app/src/test/resources/robolectric.properties b/mobile/android/fenix/app/src/test/resources/robolectric.properties index e341e6bfbb..5ef22e717d 100644 --- a/mobile/android/fenix/app/src/test/resources/robolectric.properties +++ b/mobile/android/fenix/app/src/test/resources/robolectric.properties @@ -1,2 +1 @@ -sdk=28 application=org.mozilla.fenix.helpers.FenixRobolectricTestApplication diff --git a/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-robo-test.yml b/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-robo-test.yml index 813452db47..118c57631c 100644 --- a/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-robo-test.yml +++ b/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-robo-test.yml @@ -31,6 +31,7 @@ gcloud: locale: en_US type: robo + robo-script: ./automation/taskcluster/androidTest/robo-scripts/default-browser-dismissal.json flank: project: GOOGLE_PROJECT diff --git a/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-start-test-robo.yml b/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-start-test-robo.yml index 503eae25f4..f97a9c347b 100644 --- a/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-start-test-robo.yml +++ b/mobile/android/fenix/automation/taskcluster/androidTest/flank-arm-start-test-robo.yml @@ -19,6 +19,7 @@ gcloud: locale: en_US type: robo + robo-script: ./automation/taskcluster/androidTest/robo-scripts/default-browser-dismissal.json flank: project: GOOGLE_PROJECT diff --git a/mobile/android/fenix/automation/taskcluster/androidTest/robo-scripts/default-browser-dismissal.json b/mobile/android/fenix/automation/taskcluster/androidTest/robo-scripts/default-browser-dismissal.json new file mode 100644 index 0000000000..c5728c74e6 --- /dev/null +++ b/mobile/android/fenix/automation/taskcluster/androidTest/robo-scripts/default-browser-dismissal.json @@ -0,0 +1,11 @@ +[ + { + "eventType": "VIEW_CLICKED", + "elementDescriptors": [ + { + "resourceId": "android:id/button2" + } + ], + "optional": true + } +] diff --git a/mobile/android/fenix/benchmark/src/main/AndroidManifest.xml b/mobile/android/fenix/benchmark/src/main/AndroidManifest.xml index 251d1c7b21..f3783c33ae 100644 --- a/mobile/android/fenix/benchmark/src/main/AndroidManifest.xml +++ b/mobile/android/fenix/benchmark/src/main/AndroidManifest.xml @@ -1,4 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <queries> diff --git a/mobile/android/fenix/docs/UI-Tests.md b/mobile/android/fenix/docs/UI-Tests.md new file mode 100644 index 0000000000..f09d2cb942 --- /dev/null +++ b/mobile/android/fenix/docs/UI-Tests.md @@ -0,0 +1,73 @@ +# UI Tests + +## Espresso Instrumented UI Tests in Android + +UI tests, including Espresso for Android development, play a crucial role in ensuring quality, reliability, and performance of Firefox and Focus for Android. They facilitate user interaction by simulating real-world scenarios, thereby catching real issues on devices that might not be apparent during manual testing or development. By integrating UI tests into the development process, developers can ensure their applications meet user expectations and provide a high-quality user experience across different devices and Android versions. By writing and executing these tests, developers can catch and fix issues earlier in the development cycle, significantly improving the quality and reliability of Firefox. This approach not only enhances the user experience but also saves time and resources by identifying and resolving problems before Firefox reaches end-users. + +This page documents how to write and run UI tests locally in Android Studio. + +## Writing UI Tests + +A simple Espresso UI test looks like: + +```Kotlin +@Test +fun displaySaysHello() { + onView(withId(R.id.name_field)).perform(typeText("Firefox")) + onView(withId(R.id.display_button)).perform(click()) + onView(withText("Hello Firefox!")).check(matches(isDisplayed())) +} +``` + +## Structuring Your Test + +1. **Create a Test Class**: Start by creating a new test class which should extend a base test setup class (`TestSetup`) +2. **Use Test Rules**: Utilize test rules to manage the lifecycle of the test activity. Examples include `HomeActivityIntentTestRule` +3. **Define Test Methods**: Write test methods to cover the functionality you want to test. Each method should represent a specific test case. +4. **Leverage the Robot Pattern:** Use the Robot Pattern to encapsulate UI interactions and assertions. This pattern involves creating a separate class for each screen or feature under test. Each robo class encapsulates the actions and assertions related to that specific screen or feature. + + +## Writing Test Cases + +1. **Set Up Your Test**: Before running your test, set up the necessary conditions. This might involve navigating to a specific screen, or preparing Firefox state. +2. **Perform Actions**: Use the robot classes to perform actions on the UI. This could involve entering text, clicking buttons, or navigation throughout Firefox. +3. **Verify Outcomes**: After performing actions, verify the expected outcomes. This could involve checking if a UI element is displayed, or if text matches. +4. **Clean Up**: After your test, clean up any changes you made to the app state. This might involve clearing history, or resetting to initial application state. + +## Running UI Tests + +To run UI tests, you can either use the built-in test runner in Android Studio or run them from the command line using Gradle commands. + +## Gradle + +To run UI tests under `androidTest` using Gradle, you can utilize the `connectedFenixDebugAndroidTest` task, which is specifically tailored for running instrumented tests on the `FenixDebug` build variant. This task is part of the Android Gradle Plugin’s suite of commands that allow for the execution of tests directly from the command line. For instance, to run a specific test class, such as `org.mozilla.fenix.ui.ComposeSearchTest`, you would navigate to Fenix’s root directory in the terminal and execute the following command: + +``` +./gradlew connectedFenixDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=org.mozilla.fenix.ui.ComposeSearchTest +``` + +This command targets the `FenixDebug` build variant and runs only the tests within the `ComposeSearchTest` class. + +Similarly, to run a single test within the `ComposeSearchTest` class, you can append the test method name to the class using the `#` symbol. This syntax allows you to specify a particular test method to execute. + +For example, if you have a test method named `testSearchFunctionality` within `ComposeSearchTest` class, you would modify the above example to look like `org.mozilla.fenix.ui.ComposeSearchTest#testSearchFunctionality` + +Lastly, to run all tests in a package simply replace `.class` property with `.package` and specify a package name. This approach allows you to target a specific package for test execution, ensuring only the tests within that package are run. + +The results of these tests can be found in the `app/build/reports` directory, where you will find both HTML and XML reports detailing the outcomes of your test execution. + +## Android Studio + +To run UI tests directly in Android Studio, you can follow a straightforward process that leverages the IDE’s built-in test runner. This method allows you to execute tests directly from the Project window, providing a convenient way to run individual tests or groups of tests without leaving the development environment. + +1. **Open the Project Window**: On the left side of Android Studio, you’ll find the Project window. This window displays the structure of Fenix, including the `src/androidTest/java/org.mozilla.fenix/ui` directory where UI tests are located. +2. **Navigate to the target test Class**: In the Project window, navigate to the `src/androidTest/java/org.mozilla.fenix.ui` directory. Here you will find all test classes. +3. **Run a Single Test**: To run a single test, right-click on the test class file you wish to run. From the context menu that appears, select “Run ‘ClassNameTest’”. Replace `ClassNameTest` with the actual name of your test class. Android Studio will compile your app and run the test class on the selected device or emulator. +4. **Run All Tests in a Class**: To run all tests within a specific test class, right-click on the class file and select “Run ‘ClassNameTest”. This will execute all test methods within that class. +5. **Run All Tests in a Package**: To run all tests within a package, right-click on the package name in the Project window and select “Run Tests”. This will execute all test classes within the selected package. +6. **View Test Results**: After running your tests, you can view the results in the Run window at the bottom of Android Studio. This window displays the outcome of each test, including passed, failed, and skipped tests. You can click on individual tests to see more details about their execution. + +## Testing Resources + +* [Espresso](https://developer.android.com/training/testing/espresso) +* [Espresso Basics](https://developer.android.com/training/testing/espresso/basics) diff --git a/mobile/android/fenix/docs/index.rst b/mobile/android/fenix/docs/index.rst index d6ddb75f62..e1936a867b 100644 --- a/mobile/android/fenix/docs/index.rst +++ b/mobile/android/fenix/docs/index.rst @@ -15,7 +15,7 @@ Specific documentation on a few topics is available at: Creating a release branch<Creating-a-release-branch.md> Data practises <Data-Practices.md> Development Test Plan <Development-Test-Plan.md> - Fennec Migration <Fennec-Migration.md> + Fennec Legacy: Migration <Fennec-Migration.md> Firebase Cloud Messaging for WebPush <Firebase-Cloud-Messaging-for-WebPush.md> Firefox for Android Team Processes <Firefox-for-Android-Team-Processes.md> Guide to merging contributor PRs <Guide-to-merging-contributor-PRs.md> @@ -40,3 +40,4 @@ Specific documentation on a few topics is available at: Substituting Local GeckoView <substituting-local-gv.md> Sync Integration Tests <syncIntegrationTests.md> Telemetry <telemetry.md> + UI Tests <UI-Tests.md> diff --git a/mobile/android/fenix/gradle/wrapper/gradle-wrapper.properties b/mobile/android/fenix/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f..23e87f9b0b 100644 --- a/mobile/android/fenix/gradle/wrapper/gradle-wrapper.properties +++ b/mobile/android/fenix/gradle/wrapper/gradle-wrapper.properties @@ -1,3 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip diff --git a/mobile/android/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt b/mobile/android/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt index 9df93af3fa..2a945447e5 100644 --- a/mobile/android/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt +++ b/mobile/android/fenix/plugins/fenixdependencies/src/main/java/FenixDependenciesPlugin.kt @@ -19,11 +19,10 @@ object FenixVersions { const val fastlane = "2.1.1" const val androidx_activity = "1.7.2" - const val androidx_benchmark = "1.2.3" + const val androidx_benchmark = "1.2.4" const val androidx_profileinstaller = "1.3.1" const val androidx_splash_screen = "1.0.1" - const val androidx_transition = "1.4.1" - const val androidx_datastore = "1.0.0" + const val androidx_transition = "1.5.0" const val google_accompanist = "0.32.0" const val adjust = "4.38.2" @@ -53,7 +52,6 @@ object FenixDependencies { const val androidx_profileinstaller = "androidx.profileinstaller:profileinstaller:${FenixVersions.androidx_profileinstaller}" const val androidx_activity_ktx = "androidx.activity:activity-ktx:${FenixVersions.androidx_activity}" const val androidx_transition = "androidx.transition:transition:${FenixVersions.androidx_transition}" - const val androidx_datastore = "androidx.datastore:datastore:${FenixVersions.androidx_datastore}" const val google_accompanist_drawablepainter = "com.google.accompanist:accompanist-drawablepainter:${FenixVersions.google_accompanist}" diff --git a/mobile/android/fenix/settings.gradle b/mobile/android/fenix/settings.gradle index 9c1fa496b3..5a8eb1841c 100644 --- a/mobile/android/fenix/settings.gradle +++ b/mobile/android/fenix/settings.gradle @@ -33,6 +33,7 @@ plugins { ext.topsrcdir = rootProject.projectDir.absolutePath.minus("mobile/android/fenix") apply from: file('../shared-settings.gradle') +apply from: file('../autopublish-settings.gradle') include ':app' include ':mozilla-detekt-rules' @@ -52,90 +53,16 @@ gradle.projectsLoaded { -> } } } - - def appServicesSrcDir = null - if (gradle.hasProperty('localProperties.autoPublish.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.autoPublish.application-services.dir') - } else if (gradle.hasProperty('localProperties.branchBuild.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.branchBuild.application-services.dir') - } - if (appServicesSrcDir) { - if (appServicesSrcDir.startsWith("/")) { - apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } else { - apply from: "${rootProject.projectDir}/${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } - } } } -def log(message) { - logger.lifecycle("[settings] ${message}") -} - -def runCmd(cmd, workingDir, successMessage, captureStdout=true) { - def proc = cmd.execute(null, new File(workingDir)) - def standardOutput = captureStdout ? new ByteArrayOutputStream() : System.out - proc.consumeProcessOutput(standardOutput, System.err) - proc.waitFor() - - if (proc.exitValue() != 0) { - throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}"); - } else { - log(successMessage) +def projectLocalProperties = file("local.properties").with { localPropertiesFile -> + def localProperties = new Properties() + if (localPropertiesFile.canRead()) { + localPropertiesFile.withInputStream { localProperties.load(it) } } - return captureStdout ? standardOutput : null -} - -////////////////////////////////////////////////////////////////////////// -// Local Development overrides -////////////////////////////////////////////////////////////////////////// - -Properties localProperties = null -String settingAppServicesPath = "autoPublish.application-services.dir" -String settingGleanPath = "autoPublish.glean.dir" - -if (file('local.properties').canRead()) { - localProperties = new Properties() - localProperties.load(file('local.properties').newDataInputStream()) - log('Loaded local.properties') -} else { - log('Missing local.properties; see https://github.com/mozilla-mobile/fenix/blob/main/README.md#local-properties-helpers for instructions.') + localProperties } - -if (localProperties != null) { - localProperties.each { prop -> - gradle.ext.set("localProperties.${prop.key}", prop.value) - } - - String appServicesLocalPath = localProperties.getProperty(settingAppServicesPath) - - if (appServicesLocalPath != null) { - log("Enabling automatic publication of application-services from: $appServicesLocalPath") - // Windows can't execute .py files directly, so we assume a "manually installed" python, - // which comes with a "py" launcher and respects the shebang line to specify the version. - def publishAppServicesCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishAppServicesCmd << "py"; - } - publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py"; - runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.", false) - } else { - log("Disabled auto-publication of application-services. Enable it by settings '$settingAppServicesPath' in local.properties") - } - - String gleanLocalPath = localProperties.getProperty(settingGleanPath) - - if (gleanLocalPath != null) { - log("Enabling automatic publication of Glean from: $gleanLocalPath") - // As above, hacks to execute .py files on Windows. - def publishGleanCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishGleanCmd << "py"; - } - publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py"; - runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.", false) - } else { - log("Disabled auto-publication of Glean. Enable it by settings '$settingGleanPath' in local.properties") - } +projectLocalProperties.each { prop -> + gradle.ext."localProperties.${prop.key}" = prop.value } diff --git a/mobile/android/fenix/tools/setup-startup-profiling.py b/mobile/android/fenix/tools/setup-startup-profiling.py index d11fcdb0f2..fa28397201 100755 --- a/mobile/android/fenix/tools/setup-startup-profiling.py +++ b/mobile/android/fenix/tools/setup-startup-profiling.py @@ -23,7 +23,7 @@ PRODUCTS = [PROD_FENIX, PROD_GVE] GV_CONFIG = b"""env: MOZ_PROFILER_STARTUP: 1 MOZ_PROFILER_STARTUP_INTERVAL: 5 - MOZ_PROFILER_STARTUP_FEATURES: js,stackwalk,leaf,screenshots,ipcmessages,java,cpu + MOZ_PROFILER_STARTUP_FEATURES: js,stackwalk,leaf,screenshots,ipcmessages,java,cpu,memory MOZ_PROFILER_STARTUP_FILTERS: GeckoMain,Compositor,Renderer,IPDL Background """ diff --git a/mobile/android/focus-android/app/build.gradle b/mobile/android/focus-android/app/build.gradle index 3a82291ce9..6369e0df97 100644 --- a/mobile/android/focus-android/app/build.gradle +++ b/mobile/android/focus-android/app/build.gradle @@ -276,6 +276,7 @@ dependencies { implementation ComponentsDependencies.androidx_appcompat implementation ComponentsDependencies.androidx_browser implementation ComponentsDependencies.androidx_cardview + implementation ComponentsDependencies.androidx_collection implementation ComponentsDependencies.androidx_compose_ui implementation ComponentsDependencies.androidx_compose_ui_tooling implementation ComponentsDependencies.androidx_compose_foundation @@ -294,7 +295,7 @@ dependencies { implementation FocusDependencies.androidx_splashscreen implementation FocusDependencies.androidx_transition implementation ComponentsDependencies.androidx_work_runtime - implementation ComponentsDependencies.androidx_data_store_preferences + implementation ComponentsDependencies.androidx_datastore_preferences implementation FocusDependencies.google_play @@ -707,11 +708,6 @@ if (project.hasProperty("coverage")) { } } -if (gradle.hasProperty('localProperties.autoPublish.glean.dir')) { - ext.gleanSrcDir = gradle."localProperties.autoPublish.glean.dir" - apply from: "../${gleanSrcDir}/build-scripts/substitute-local-glean.gradle" -} - // ------------------------------------------------------------------------------------------------- // Task for printing APK information for the requested variant // Taskgraph Usage: "./gradlew printVariants diff --git a/mobile/android/focus-android/app/lint-baseline.xml b/mobile/android/focus-android/app/lint-baseline.xml index b230739f68..3686530fbd 100644 --- a/mobile/android/focus-android/app/lint-baseline.xml +++ b/mobile/android/focus-android/app/lint-baseline.xml @@ -1,4 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <issues format="6" by="lint 8.2.2" type="baseline" client="gradle" dependencies="false" name="AGP (8.2.2)" variant="all" version="8.2.2"> <issue diff --git a/mobile/android/focus-android/app/src/androidTest/assets/audioPage.html b/mobile/android/focus-android/app/src/androidTest/assets/audioPage.html index f45ba6410f..887602dfed 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/audioPage.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/audioPage.html @@ -1,37 +1,36 @@ <html> -<head> + <head> <title>Audio_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: audio player</p> + </head> + <body> + <p id="testContent">Page content: audio player</p> -<div class="audioPlayer"> - <audio id="audioSample" controls loop> - <source src="resources/audioSample.mp3"> - </audio> -</div> + <div class="audioPlayer"> + <audio id="audioSample" controls loop> + <source src="resources/audioSample.mp3" /> + </audio> + </div> -<div class="playbackState"> -</div> + <div class="playbackState"></div> -<script> - const audio = document.querySelector('audio'); - var showPlayingAlert=true; + <script> + const audio = document.querySelector("audio"); + var showPlayingAlert = true; - audio.addEventListener('playing', (event) => { - <!--document.querySelector('.playbackState').innerText="Media file is playing"--> - <!--Need this hack to verify that the video is playing,--> - <!--the test cannot currently verify the text displayed on the page--> - if(showPlayingAlert===true){ - showPlayingAlert=false; - alert("Media file is playing"); - } - }); + audio.addEventListener("playing", event => { + <!--document.querySelector('.playbackState').innerText="Media file is playing"--> + <!--Need this hack to verify that the video is playing,--> + <!--the test cannot currently verify the text displayed on the page--> + if (showPlayingAlert === true) { + showPlayingAlert = false; + alert("Media file is playing"); + } + }); - audio.addEventListener('pause', (event) => { + audio.addEventListener("pause", event => { <!--document.querySelector('.playbackState').innerText="Media file is paused"--> alert("Media file is paused"); - }); -</script> -</body> + }); + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/cross-site-cookies.html b/mobile/android/focus-android/app/src/androidTest/assets/cross-site-cookies.html index 5cf99f3881..82531c202f 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/cross-site-cookies.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/cross-site-cookies.html @@ -1,12 +1,16 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html> -<meta name="viewport" content="width=device-width"> -<body> -<h3>known-tracker.englehardt-tracker.com</h3> -<h4>different site, cross-origin iframe, on blocklist</h4> -<iframe width=500 height=600 src="https://known-tracker.englehardt-tracker.com/set_storage_simple.html"></iframe> -</body> + <meta name="viewport" content="width=device-width" /> + <body> + <h3>known-tracker.englehardt-tracker.com</h3> + <h4>different site, cross-origin iframe, on blocklist</h4> + <iframe + width="500" + height="600" + src="https://known-tracker.englehardt-tracker.com/set_storage_simple.html" + ></iframe> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/adsTrackers.html b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/adsTrackers.html index b8e0f7bc55..f043cdc7ce 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/adsTrackers.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/adsTrackers.html @@ -1,21 +1,22 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html dir="ltr" xml:lang="en-US" lang="en-US"> -<meta name="viewport" content="width=device-width"> -<head> - <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width" /> + <head> + <meta charset="UTF-8" /> <title>adsTrackers</title> -</head> -<body> -<!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> -<!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> -<p>ads trackers:</p> -<p>if you can read this, then: </p> -<p>ads trackers not blocked</p> -<img - src="https://ads-track-digest256.dummytracker.org/test_not_blocked.png" - onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('ads trackers blocked')"> -</body> + </head> + <body> + <!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> + <!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> + <p>ads trackers:</p> + <p>if you can read this, then:</p> + <p>ads trackers not blocked</p> + <img + src="https://ads-track-digest256.dummytracker.org/test_not_blocked.png" + onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('ads trackers blocked')" + /> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/analyticsTrackers.html b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/analyticsTrackers.html index e97a7e35c6..69e617f495 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/analyticsTrackers.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/analyticsTrackers.html @@ -1,21 +1,22 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html dir="ltr" xml:lang="en-US" lang="en-US"> -<meta name="viewport" content="width=device-width"> -<head> - <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width" /> + <head> + <meta charset="UTF-8" /> <title>analyticsTrackers</title> -</head> -<body> -<!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> -<!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> -<p>analytics trackers</p> -<p>if you can read this, then: </p> -<p>analytics trackers not blocked</p> -<img - src="https://analytics-track-digest256.dummytracker.org/test_not_blocked.png" - onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('analytics trackers blocked')"> -</body> + </head> + <body> + <!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> + <!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> + <p>analytics trackers</p> + <p>if you can read this, then:</p> + <p>analytics trackers not blocked</p> + <img + src="https://analytics-track-digest256.dummytracker.org/test_not_blocked.png" + onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('analytics trackers blocked')" + /> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/otherTrackers.html b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/otherTrackers.html index 5e4bd63a78..c7c42dde5c 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/otherTrackers.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/otherTrackers.html @@ -1,22 +1,23 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html dir="ltr" xml:lang="en-US" lang="en-US"> -<meta name="viewport" content="width=device-width"> -<head> - <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width" /> + <head> + <meta charset="UTF-8" /> <title>otherTrackers</title> -</head> -<body> -<!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> -<!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> -<h3>Level 2 (Strict List) Tracker Blocking</h3> -<p>other content trackers</p> -<p>if you can read this, then: </p> -<p>other content trackers not blocked</p> -<img - src="https://content-track-digest256.dummytracker.org/test_not_blocked.png" - onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('other content trackers blocked')"> -</body> + </head> + <body> + <!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> + <!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> + <h3>Level 2 (Strict List) Tracker Blocking</h3> + <p>other content trackers</p> + <p>if you can read this, then:</p> + <p>other content trackers not blocked</p> + <img + src="https://content-track-digest256.dummytracker.org/test_not_blocked.png" + onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('other content trackers blocked')" + /> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/socialTrackers.html b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/socialTrackers.html index 5f1afd19aa..fbbb2144b6 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/etpPages/socialTrackers.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/etpPages/socialTrackers.html @@ -1,21 +1,22 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html dir="ltr" xml:lang="en-US" lang="en-US"> -<meta name="viewport" content="width=device-width"> -<head> - <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width" /> + <head> + <meta charset="UTF-8" /> <title>socialTrackers</title> -</head> -<body> -<!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> -<!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> -<p>social trackers</p> -<p>if you can read this, then: </p> -<p>social trackers not blocked</p> -<img - src="https://social-track-digest256.dummytracker.org/test_not_blocked.png" - onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('social trackers blocked')"> -</body> + </head> + <body> + <!--Level 1 Tracker blocking with separate lists (social-track-digest256,ads-track-digest256,analytics-track-digest256).--> + <!--using the https://senglehardt.com/test/trackingprotection/test_pages/tracking_protection.html test page--> + <p>social trackers</p> + <p>if you can read this, then:</p> + <p>social trackers not blocked</p> + <img + src="https://social-track-digest256.dummytracker.org/test_not_blocked.png" + onerror="this.onerror=null;this.src='https://not-a-tracker.dummytracker.org/test_blocked.png';alert('social trackers blocked')" + /> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/genericPage.html b/mobile/android/focus-android/app/src/androidTest/assets/genericPage.html index 46f36bf6d1..0ab2034c3f 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/genericPage.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/genericPage.html @@ -1,15 +1,14 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> + <head> + <meta charset="UTF-8" /> <!-- random words that should not end up on disk --> <title>GenericPage</title> -</head> -<body> -<h1 id="header">focus test page</h1> -<!-- More random words that should not end up on disk --> -<p>groovy rabbits</p> -<p>This test page does nothing.</p> - -</body> + </head> + <body> + <h1 id="header">focus test page</h1> + <!-- More random words that should not end up on disk --> + <p>groovy rabbits</p> + <p>This test page does nothing.</p> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/global_privacy_control.html b/mobile/android/focus-android/app/src/androidTest/assets/global_privacy_control.html index e08df8c17f..d8961ebc0a 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/global_privacy_control.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/global_privacy_control.html @@ -1,15 +1,14 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> -<script type = "text/javascript" > - const gpcValue = navigator.globalPrivacyControl - if (gpcValue) { - document.write('<p>GPC is enabled.</p>'); - } else { - document.write('<p>GPC not enabled.</p>'); - } -</script> - -</body> + <meta name="viewport" content="width=device-width" /> + <body> + <script type="text/javascript"> + const gpcValue = navigator.globalPrivacyControl; + if (gpcValue) { + document.write("<p>GPC is enabled.</p>"); + } else { + document.write("<p>GPC not enabled.</p>"); + } + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/htmlControls.html b/mobile/android/focus-android/app/src/androidTest/assets/htmlControls.html index 3677417a28..90eee7dd3d 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/htmlControls.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/htmlControls.html @@ -1,43 +1,45 @@ <!DOCTYPE html> <html> -<head> + <head> <title>Html_Control_Form</title> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width"> -</head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width" /> + </head> -<p>Misc Link Types</p> -<section> + <p>Misc Link Types</p> + <section> <a href="https://duckduckgo.com/">External link</a> -</section> + </section> -<section> + <section> <a href="mailto://example@example.com">Email link</a> <a href="tel://1234567890">Telephone link</a> -</section> + </section> -<p>Drop-down Form</p> -<select id="dropDown"> + <p>Drop-down Form</p> + <select id="dropDown"> <option type="text" text="The Only Ones">The Only Ones</option> <option type="text" text="The National">The National</option> -</select> -<button onclick="printOption()" id="submitOption"> Submit drop down option </button> -<div id="displayOption"></div> + </select> + <button onclick="printOption()" id="submitOption"> + Submit drop down option + </button> + <div id="displayOption"></div> -<section> - <p>Copy <input type="text" placeholder="and Paste" id="textInput"> me</p> - <button onclick="printInput()" id="submitInput"> Submit input </button> + <section> + <p>Copy <input type="text" placeholder="and Paste" id="textInput" /> me</p> + <button onclick="printInput()" id="submitInput">Submit input</button> <div id="displayInput"></div> -</section> + </section> -<p>Calendar Form</p> -<section> - <input type="date" id="calendar"> - <button onclick="printDate()" id="submitDate"> Submit date </button> + <p>Calendar Form</p> + <section> + <input type="date" id="calendar" /> + <button onclick="printDate()" id="submitDate">Submit date</button> <div id="displayDate"></div> -</section> + </section> -<script> + <script> function printOption() { let dropDown = document.querySelector("#dropDown"); let displayOption = document.querySelector("#displayOption"); @@ -46,7 +48,7 @@ } </script> -<script> + <script> function printInput() { let textInput = document.querySelector("#textInput"); let displayInput = document.querySelector("#displayInput"); @@ -55,7 +57,7 @@ } </script> -<script> + <script> function printDate() { let calendar = document.querySelector("#calendar"); let displayDate = document.querySelector("#displayDate"); diff --git a/mobile/android/focus-android/app/src/androidTest/assets/image_test.html b/mobile/android/focus-android/app/src/androidTest/assets/image_test.html index ea8ea10f53..a155e6c438 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/image_test.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/image_test.html @@ -1,20 +1,31 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> + <head> + <meta charset="UTF-8" /> <!-- random words that should not end up on disk --> <title>gigantic experience</title> -</head> -<body> -<h1 id="header">focus test page</h1> + </head> + <body> + <h1 id="header">focus test page</h1> -<!-- More random words that should not end up on disk --> -<p>groovy rabbits</p> -<img id="rabbitImage" src="rabbit.jpg" alt="rabbit.jpg" width="251" height="201"> + <!-- More random words that should not end up on disk --> + <p>groovy rabbits</p> + <img + id="rabbitImage" + src="rabbit.jpg" + alt="rabbit.jpg" + width="251" + height="201" + /> -<a id="download" href="download.jpg" download="mozillaLogo"> - <img border="0" src="download.jpg" alt="download icon" width="104" height="142"> -</a> - -</body> + <a id="download" href="download.jpg" download="mozillaLogo"> + <img + border="0" + src="download.jpg" + alt="download icon" + width="104" + height="142" + /> + </a> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/mutedVideoPage.html b/mobile/android/focus-android/app/src/androidTest/assets/mutedVideoPage.html index 8c4fbfc686..9283ff296b 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/mutedVideoPage.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/mutedVideoPage.html @@ -1,53 +1,52 @@ <html> -<head> + <head> <title>Muted_Video_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: muted video player</p> -<div class="playbackState"> -</div> -<div id="video-container" style="text-align:center"> - <button onclick="play()">Play</button> - <button onclick="pause()">Pause</button> - <button onclick="fullscreen()">Full Screen</button> - <br><br> - <video id="mutedVideo" width="420" autoplay muted controls loop> - <source src="resources/clip.mp4" type="video/mp4"> + </head> + <body> + <p id="testContent">Page content: muted video player</p> + <div class="playbackState"></div> + <div id="video-container" style="text-align: center"> + <button onclick="play()">Play</button> + <button onclick="pause()">Pause</button> + <button onclick="fullscreen()">Full Screen</button> + <br /><br /> + <video id="mutedVideo" width="420" autoplay muted controls loop> + <source src="resources/clip.mp4" type="video/mp4" /> Your browser does not support HTML video. - </video> -</div> + </video> + </div> -<script> - const mutedVideo = document.getElementById("mutedVideo"); + <script> + const mutedVideo = document.getElementById("mutedVideo"); - function play() { + function play() { mutedVideo.play(); - } + } - function pause() { + function pause() { mutedVideo.pause(); - } + } - function fullscreen() { + function fullscreen() { mutedVideo.requestFullscreen(); - } + } - var showPlayAlert=true; + var showPlayAlert = true; - mutedVideo.addEventListener('playing', (event) => { - <!-- document.querySelector('.playbackState').innerHTML="Media file is playing";--> - <!-- Need this hack to verify that the video is playing, --> - <!-- the test cannot currently verify the text displayed on the page--> - if(showPlayAlert===true){ - showPlayAlert=false; - alert("Media file is playing"); - } - }); + mutedVideo.addEventListener("playing", event => { + <!-- document.querySelector('.playbackState').innerHTML="Media file is playing";--> + <!-- Need this hack to verify that the video is playing, --> + <!-- the test cannot currently verify the text displayed on the page--> + if (showPlayAlert === true) { + showPlayAlert = false; + alert("Media file is playing"); + } + }); - mutedVideo.addEventListener('pause', (event) => { - // document.querySelector('.playbackState').innerHTML="Media file is paused"; - alert("Media file is paused"); - }); -</script> -</body> + mutedVideo.addEventListener("pause", event => { + // document.querySelector('.playbackState').innerHTML="Media file is paused"; + alert("Media file is paused"); + }); + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/same-site-cookies.html b/mobile/android/focus-android/app/src/androidTest/assets/same-site-cookies.html index dd4fa31be7..07e75434a6 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/same-site-cookies.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/same-site-cookies.html @@ -1,125 +1,139 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <html lang="en-US" dir="ltr"> -<head> - <meta name="viewport" content="width=device-width"> - <script src="https://cdn.jsdelivr.net/npm/idb-keyval@3/dist/idb-keyval-iife.min.js"></script> -</head> -<body> -<button onclick="setAllStorageLocations();">Rerun Tests</button> -<br> -<h4>cookies</h4> -<pre id="cookie_message"></pre> + <head> + <meta name="viewport" content="width=device-width" /> + <script src="https://cdn.jsdelivr.net/npm/idb-keyval@3/dist/idb-keyval-iife.min.js"></script> + </head> + <body> + <button onclick="setAllStorageLocations();">Rerun Tests</button> + <br /> + <h4>cookies</h4> + <pre id="cookie_message"></pre> -<h4>localStorage</h4> -<pre id="ls_message"></pre> + <h4>localStorage</h4> + <pre id="ls_message"></pre> -<!-- + <!-- <h4>sessionStorage</h4> <pre id="ss_message"></pre> <h4>Indexed DB</h4> <pre id="idb_message"></pre> --> -<!-- Storage access API --> -<br /> -<h4>Storage Access API</h4> -<button onclick='requestSA()'>requestStorageAccess()</button><br /> -<p>Return value of requestStorageAccess():</p><pre id='request_storage_access'>not yet called</pre><br /> -<button onclick='hasSA()'>hasStorageAccess()</button><br /> -<p>Return value of hasStorageAccess():</p><pre id='has_storage_access'>not yet called</pre><br /> + <!-- Storage access API --> + <br /> + <h4>Storage Access API</h4> + <button onclick="requestSA()">requestStorageAccess()</button><br /> + <p>Return value of requestStorageAccess():</p> + <pre id="request_storage_access">not yet called</pre> + <br /> + <button onclick="hasSA()">hasStorageAccess()</button><br /> + <p>Return value of hasStorageAccess():</p> + <pre id="has_storage_access">not yet called</pre> + <br /> + <script> + var newRandVal = Math.random(); -<script> - var newRandVal = Math.random(); - - function outputResult(value, output_id) { - var msg = document.getElementById(output_id); - document.hasStorageAccess().then( - (hasStorageAccess) => { - if (hasStorageAccess === false) { - msg.innerHTML = "BLOCKED"; - } else if (value === "" & hasStorageAccess === true) { - msg.innerHTML = "UNEXPECTED. We have storage access but value is empty..."; - } else if (hasStorageAccess === true) { - msg.innerHTML = "UNRESTRICTED"; - } - }, - (reason) => {msg.innerHTML = 'promise rejected for reason' + reason} - ); - } - - function setCookies() { - var cookies = document.cookie; - if (cookies === "") { - document.cookie = 'foo='+newRandVal+'; SameSite=None; Secure'; - cookies = document.cookie; - } - outputResult(cookies, 'cookie_message'); - } - function setLocalStorage() { - try { - var foo = window.localStorage.getItem('foo'); - if (foo === null) { - window.localStorage.setItem('foo', newRandVal); - foo = window.localStorage.getItem('foo'); + function outputResult(value, output_id) { + var msg = document.getElementById(output_id); + document.hasStorageAccess().then( + hasStorageAccess => { + if (hasStorageAccess === false) { + msg.innerHTML = "BLOCKED"; + } else if ((value === "") & (hasStorageAccess === true)) { + msg.innerHTML = + "UNEXPECTED. We have storage access but value is empty..."; + } else if (hasStorageAccess === true) { + msg.innerHTML = "UNRESTRICTED"; } - } catch (error) { - foo = ""; + }, + reason => { + msg.innerHTML = "promise rejected for reason" + reason; } - outputResult(foo, 'ls_message'); + ); + } + + function setCookies() { + var cookies = document.cookie; + if (cookies === "") { + document.cookie = "foo=" + newRandVal + "; SameSite=None; Secure"; + cookies = document.cookie; } - function setSessionStorage() { - try { - var foo = window.sessionStorage.getItem('foo'); - if (foo === null) { - window.sessionStorage.setItem('foo', newRandVal); - foo = window.sessionStorage.getItem('foo'); - } - } catch (error) { - foo = ""; + outputResult(cookies, "cookie_message"); + } + function setLocalStorage() { + try { + var foo = window.localStorage.getItem("foo"); + if (foo === null) { + window.localStorage.setItem("foo", newRandVal); + foo = window.localStorage.getItem("foo"); } - outputResult(foo, 'ss_message'); + } catch (error) { + foo = ""; } - async function setIndexedDB() { - try { - var foo = await idbKeyval.get('foo'); - if (foo === undefined) { - await idbKeyval.set('foo', newRandVal); - foo = await idbKeyval.get('foo'); - } - } catch (error) { - foo = ""; + outputResult(foo, "ls_message"); + } + function setSessionStorage() { + try { + var foo = window.sessionStorage.getItem("foo"); + if (foo === null) { + window.sessionStorage.setItem("foo", newRandVal); + foo = window.sessionStorage.getItem("foo"); } - outputResult(foo, 'idb_message'); + } catch (error) { + foo = ""; } - function setAllStorageLocations() { - setCookies(); - setLocalStorage(); - //setSessionStorage(); - //setIndexedDB(); + outputResult(foo, "ss_message"); + } + async function setIndexedDB() { + try { + var foo = await idbKeyval.get("foo"); + if (foo === undefined) { + await idbKeyval.set("foo", newRandVal); + foo = await idbKeyval.get("foo"); + } + } catch (error) { + foo = ""; } - setAllStorageLocations(); + outputResult(foo, "idb_message"); + } + function setAllStorageLocations() { + setCookies(); + setLocalStorage(); + //setSessionStorage(); + //setIndexedDB(); + } + setAllStorageLocations(); - // Storage Access API - function requestSA() { - var result = document.getElementById('request_storage_access'); - document.requestStorageAccess().then( - () => {result.innerHTML = 'access granted'}, - () => {result.innerHTML = 'access denied'} - ); - } + // Storage Access API + function requestSA() { + var result = document.getElementById("request_storage_access"); + document.requestStorageAccess().then( + () => { + result.innerHTML = "access granted"; + }, + () => { + result.innerHTML = "access denied"; + } + ); + } - function hasSA() { - var result = document.getElementById('has_storage_access'); - document.hasStorageAccess().then( - (hasAccess) => {result.innerHTML = hasAccess}, - (reason) => {result.innerHTML = 'promise rejected for reason' + reason} - ); - } - hasSA(); - </script> -</body> + function hasSA() { + var result = document.getElementById("has_storage_access"); + document.hasStorageAccess().then( + hasAccess => { + result.innerHTML = hasAccess; + }, + reason => { + result.innerHTML = "promise rejected for reason" + reason; + } + ); + } + hasSA(); + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/storage_check.html b/mobile/android/focus-android/app/src/androidTest/assets/storage_check.html index c52cae9b7b..dc7cdc0248 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/storage_check.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/storage_check.html @@ -1,23 +1,21 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> + <meta name="viewport" content="width=device-width" /> + <body> + <h1>Storage check</h1> -<h1>Storage check</h1> + <script type="text/javascript"> + if (sessionStorage.getItem("focusSessionTest") == "caterpillar") { + document.write("<p>Session storage has value</p>"); + } else { + document.write("<p>Session storage empty</p>"); + } -<script type="text/javascript"> - if (sessionStorage.getItem('focusSessionTest') == 'caterpillar') { - document.write('<p>Session storage has value</p>'); - } else { - document.write('<p>Session storage empty</p>'); - } - - if (localStorage.getItem('focusLocalTest') == 'caterpillar') { - document.write('<p>Local storage has value</p>'); - } else { - document.write('<p>Local storage empty</p>'); - } -</script> - -</body> + if (localStorage.getItem("focusLocalTest") == "caterpillar") { + document.write("<p>Local storage has value</p>"); + } else { + document.write("<p>Local storage empty</p>"); + } + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/storage_start.html b/mobile/android/focus-android/app/src/androidTest/assets/storage_start.html index e88f7f06d1..2387b21243 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/storage_start.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/storage_start.html @@ -1,28 +1,30 @@ <!DOCTYPE html> <html> -<meta name="viewport" content="width=device-width"> -<body> + <meta name="viewport" content="width=device-width" /> + <body> + <h1>Storage Start</h1> -<h1>Storage Start</h1> + <p id="cookies"></p> + <button id="setCookies">Set cookies</button> -<p id="cookies"></p> -<button id="setCookies">Set cookies</button> + <script type="text/javascript"> + (function () { + document.getElementById("cookies").textContent = document.cookie + ? document.cookie + : "No cookies set"; + })(); -<script type="text/javascript"> - (function() { - document.getElementById("cookies").textContent = document.cookie?document.cookie:"No cookies set"; - })(); + document + .getElementById("setCookies") + .addEventListener("click", function () { + document.cookie = "user=android"; + document.getElementById("cookies").textContent = document.cookie; + }); - document.getElementById("setCookies").addEventListener("click", function() { - document.cookie = "user=android"; - document.getElementById("cookies").textContent = document.cookie; - }); + sessionStorage.setItem("focusSessionTest", "caterpillar"); + localStorage.setItem("focusLocalTest", "butterfly"); - sessionStorage.setItem('focusSessionTest', 'caterpillar'); - localStorage.setItem('focusLocalTest', 'butterfly'); - - document.write('<p>Values written to storage</p>'); -</script> - -</body> + document.write("<p>Values written to storage</p>"); + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/tab1.html b/mobile/android/focus-android/app/src/androidTest/assets/tab1.html index 4a9c8ce88e..c788eae33e 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/tab1.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/tab1.html @@ -1,11 +1,11 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width" /> <title>tab1</title> -</head> -<body> + </head> + <body> <h1 id="content">Tab 1</h1> <a href="tab2.html" id="tab2">Tab 2</a> @@ -14,16 +14,17 @@ <!-- here we display if the page is in mobile or desktop view mode --> <p id="viewMode"></p> -</body> -<script> -window.mobileCheck = function() { - let check = false; - (function(a){ - if (a.includes("Android")) - check = true; - }) (navigator.userAgent) - return check; -}; -document.getElementById('viewMode').textContent=mobileCheck()? "mobile-site":"desktop-site"; -</script> + </body> + <script> + window.mobileCheck = function () { + let check = false; + (function (a) { + if (a.includes("Android")) check = true; + })(navigator.userAgent); + return check; + }; + document.getElementById("viewMode").textContent = mobileCheck() + ? "mobile-site" + : "desktop-site"; + </script> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/tab2.html b/mobile/android/focus-android/app/src/androidTest/assets/tab2.html index be5f65e6a5..e38e6ba985 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/tab2.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/tab2.html @@ -1,16 +1,14 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> + <head> + <meta charset="UTF-8" /> <title>tab2</title> -</head> -<body> - + </head> + <body> <h1 id="content">Tab 2</h1> <a href="tab1.html" id="tab1">Tab 1</a> <a href="tab3.html" id="tab3">Tab 3</a> - -</body> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/tab3.html b/mobile/android/focus-android/app/src/androidTest/assets/tab3.html index fc8c08446c..651afe13c1 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/tab3.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/tab3.html @@ -1,11 +1,10 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> + <head> + <meta charset="UTF-8" /> <title>tab3</title> -</head> -<body> - + </head> + <body> <h1 id="content">Tab 3</h1> <a href="tab2.html" id="tab1">Tab 1</a> @@ -13,8 +12,9 @@ <a href="tab3.html" id="tab2">Tab 2</a> <p> - <a href="https://www.youtube.com/c/MozillaChannel/videos">Mozilla Youtube link</a> + <a href="https://www.youtube.com/c/MozillaChannel/videos" + >Mozilla Youtube link</a + > </p> - -</body> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/test.html b/mobile/android/focus-android/app/src/androidTest/assets/test.html index 7273622e6f..ad8eea883d 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/test.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/test.html @@ -1,38 +1,48 @@ <!DOCTYPE html> <html> -<head> - <meta charset="UTF-8"> + <head> + <meta charset="UTF-8" /> <!-- random words that should not end up on disk --> <title>gigantic experience</title> -</head> -<body> -<h1>focus test page</h1> -<!-- More random words that should not end up on disk --> -<p>groovy rabbits</p> -<p>This test page installs a service worker and saves a cookie.</p> + </head> + <body> + <h1>focus test page</h1> + <!-- More random words that should not end up on disk --> + <p>groovy rabbits</p> + <p>This test page installs a service worker and saves a cookie.</p> -<h2 id="cookieHeading">Cookie</h2> -<p>Initial: <script type="text/javascript">document.write(document.cookie);</script></p> -<p> - <!-- Setting a cookie --> - <script type="text/javascript"> - document.cookie = "birthday=armchair; expires=Tue, 18 Dec 2035 12:00:00 UTC; path=/"; - document.write("Cookie saved"); - </script> -</p> -<p>Afterwards: <script type="text/javascript">document.write(document.cookie);</script></p> + <h2 id="cookieHeading">Cookie</h2> + <p> + Initial: + <script type="text/javascript"> + document.write(document.cookie); + </script> + </p> + <p> + <!-- Setting a cookie --> + <script type="text/javascript"> + document.cookie = + "birthday=armchair; expires=Tue, 18 Dec 2035 12:00:00 UTC; path=/"; + document.write("Cookie saved"); + </script> + </p> + <p> + Afterwards: + <script type="text/javascript"> + document.write(document.cookie); + </script> + </p> -<h2>Service worker</h2> -<p id="status"></p> + <h2>Service worker</h2> + <p id="status"></p> -<script type="text/javascript"> - // Add a key value pair to local storage. This is required by WebViewDataTest which asserts - // that the local storage directory should exist - var script = document.createElement('script'); - script.src = "service-worker.js"; + <script type="text/javascript"> + // Add a key value pair to local storage. This is required by WebViewDataTest which asserts + // that the local storage directory should exist + var script = document.createElement("script"); + script.src = "service-worker.js"; - document.head.appendChild(script); //or something of the likes + document.head.appendChild(script); //or something of the likes </script> - -</body> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/assets/videoPage.html b/mobile/android/focus-android/app/src/androidTest/assets/videoPage.html index cd352268b3..01aaafab5b 100644 --- a/mobile/android/focus-android/app/src/androidTest/assets/videoPage.html +++ b/mobile/android/focus-android/app/src/androidTest/assets/videoPage.html @@ -1,53 +1,52 @@ <html> -<head> + <head> <title>Video_Test_Page</title> -</head> -<body> -<p id="testContent">Page content: video player</p> -<div class="playbackState"> -</div> -<div id="video-container" style="text-align:center"> - <button onclick="play()">Play</button> - <button onclick="pause()">Pause</button> - <button onclick="fullscreen()">Full Screen</button> - <br><br> - <video id="video" width="420" autoplay controls loop> - <source src="resources/clip.mp4" type="video/mp4"> + </head> + <body> + <p id="testContent">Page content: video player</p> + <div class="playbackState"></div> + <div id="video-container" style="text-align: center"> + <button onclick="play()">Play</button> + <button onclick="pause()">Pause</button> + <button onclick="fullscreen()">Full Screen</button> + <br /><br /> + <video id="video" width="420" autoplay controls loop> + <source src="resources/clip.mp4" type="video/mp4" /> Your browser does not support HTML video. - </video> -</div> + </video> + </div> -<script> - const video = document.getElementById("video"); + <script> + const video = document.getElementById("video"); - function play() { + function play() { video.play(); - } + } - function pause() { + function pause() { video.pause(); - } + } - function fullscreen() { + function fullscreen() { video.requestFullscreen(); - } + } - var showPlayingAlert=true; + var showPlayingAlert = true; - video.addEventListener('playing', (event) => { - <!-- document.querySelector('.playbackState').innerHTML="Media file is playing";--> - <!-- Need this hack to verify that the video is playing, --> - <!-- the test cannot currently verify the text displayed on the page--> - if(showPlayingAlert===true){ - showPlayingAlert=false; - alert("Media file is playing"); - } - }); + video.addEventListener("playing", event => { + <!-- document.querySelector('.playbackState').innerHTML="Media file is playing";--> + <!-- Need this hack to verify that the video is playing, --> + <!-- the test cannot currently verify the text displayed on the page--> + if (showPlayingAlert === true) { + showPlayingAlert = false; + alert("Media file is playing"); + } + }); - video.addEventListener('pause', (event) => { - // document.querySelector('.playbackState').innerHTML="Media file is paused"; - alert("Media file is paused"); - }); -</script> -</body> + video.addEventListener("pause", event => { + // document.querySelector('.playbackState').innerHTML="Media file is paused"; + alert("Media file is paused"); + }); + </script> + </body> </html> diff --git a/mobile/android/focus-android/app/src/androidTest/java/org/mozilla/focus/activity/SearchTest.kt b/mobile/android/focus-android/app/src/androidTest/java/org/mozilla/focus/activity/SearchTest.kt index 82b7384965..f6fad539d7 100644 --- a/mobile/android/focus-android/app/src/androidTest/java/org/mozilla/focus/activity/SearchTest.kt +++ b/mobile/android/focus-android/app/src/androidTest/java/org/mozilla/focus/activity/SearchTest.kt @@ -22,7 +22,7 @@ import org.mozilla.focus.testAnnotations.SmokeTest // This test checks the search engine can be changed and that search suggestions appear class SearchTest { private lateinit var searchString: String - private val enginesList = listOf("DuckDuckGo", "Google", "Amazon.com", "Wikipedia") + private val enginesList = listOf("DuckDuckGo", "Google", "Wikipedia") private val featureSettingsHelper = FeatureSettingsHelper() @get: Rule diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/FocusApplication.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/FocusApplication.kt index 0aa99630df..65ba6c9677 100644 --- a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/FocusApplication.kt +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/FocusApplication.kt @@ -8,6 +8,8 @@ import android.content.Context import android.os.Build import android.os.StrictMode import android.util.Log.INFO +import androidx.annotation.OpenForTesting +import androidx.annotation.VisibleForTesting import androidx.appcompat.app.AppCompatDelegate import androidx.lifecycle.ProcessLifecycleOwner import androidx.preference.PreferenceManager @@ -68,8 +70,8 @@ open class FocusApplication : LocaleAwareApplication(), Provider, CoroutineScope setTheme(this) components.engine.warmUp() - components.metrics.initialize(this) - FactsProcessor.initialize() + initializeTelemetry() + finishSetupMegazord() ProfilerMarkerFactProcessor.create { components.engine.profiler }.register() @@ -121,6 +123,11 @@ open class FocusApplication : LocaleAwareApplication(), Provider, CoroutineScope FocusNimbus.initialize { nimbus } } + protected open fun initializeTelemetry() { + components.metrics.initialize(this) + FactsProcessor.initialize() + } + /** * Initiate Megazord sequence! Megazord Battle Mode! * @@ -144,8 +151,12 @@ open class FocusApplication : LocaleAwareApplication(), Provider, CoroutineScope RustLog.enable() } + /** + * Finish Megazord setup sequence. + */ @OptIn(DelicateCoroutinesApi::class) // GlobalScope usage - private fun finishSetupMegazord() { + @OpenForTesting + open fun finishSetupMegazord() { GlobalScope.launch(Dispatchers.IO) { // We need to use an unwrapped client because native components do not support private // requests. @@ -219,7 +230,9 @@ open class FocusApplication : LocaleAwareApplication(), Provider, CoroutineScope StrictMode.setVmPolicy(vmPolicyBuilder.build()) } - private fun initializeWebExtensionSupport() { + @VisibleForTesting + @OpenForTesting + internal open fun initializeWebExtensionSupport() { WebExtensionSupport.initialize( components.engine, components.store, diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/fragment/BrowserFragment.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/fragment/BrowserFragment.kt index a25f26ef85..0f768c1c4d 100644 --- a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/fragment/BrowserFragment.kt +++ b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/fragment/BrowserFragment.kt @@ -310,6 +310,7 @@ class BrowserFragment : SessionFeature( components.store, components.sessionUseCases.goBack, + components.sessionUseCases.goForward, binding.engineView, tab.id, ), diff --git a/mobile/android/focus-android/app/src/main/res/raw/about.html b/mobile/android/focus-android/app/src/main/res/raw/about.html index 7e24fcbca7..e6df9512bd 100644 --- a/mobile/android/focus-android/app/src/main/res/raw/about.html +++ b/mobile/android/focus-android/app/src/main/res/raw/about.html @@ -1,55 +1,60 @@ -<!doctype html> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this file, - You can obtain one at http://mozilla.org/MPL/2.0/. --> <head> -<meta name="viewport" charset="utf-8" content="width=device-width, initial-scale=1"> -<style> - body, html { - background: #221F1F; - color: #FFFFFF; - font-family: sans-serif; - line-height: 24px; - font-size: 14px; + <meta + name="viewport" + charset="utf-8" + content="width=device-width, initial-scale=1" + /> + <style> + body, + html { + background: #221f1f; + color: #ffffff; + font-family: sans-serif; + line-height: 24px; + font-size: 14px; } - body{ - padding-left: 24px; - padding-right: 24px; - margin-left: 0px; - margin-right: 0px; + body { + padding-left: 24px; + padding-right: 24px; + margin-left: 0px; + margin-right: 0px; } a { - color: #0A9AF4; + color: #0a9af4; } /* Make only about page links ("learn more") white */ .about a { - color: #FFFFFF; + color: #ffffff; } p.subtitle { - text-align: center; - opacity: .7; - margin: 0; + text-align: center; + opacity: 0.7; + margin: 0; } img#wordmark { - /* We need to set the dp size here, because by default webview assumes the image is not + /* We need to set the dp size here, because by default webview assumes the image is not density specific (but since it's an android resource, we get a density specific version). */ - width: 180px; - display: block; - margin-left: auto; - margin-right: auto; - padding-top: 24px; + width: 180px; + display: block; + margin-left: auto; + margin-right: auto; + padding-top: 24px; } -</style> + </style> </head> <html> -<body class="about" dir="%dir%"> -<img src="%wordmark%" id="wordmark"/> -<p class="subtitle">%about-version%</p> -%about-content% -</body> + <body class="about" dir="%dir%"> + <img src="%wordmark%" id="wordmark" /> + <p class="subtitle">%about-version%</p> + %about-content% + </body> </html> diff --git a/mobile/android/focus-android/app/src/main/res/raw/gpl.html b/mobile/android/focus-android/app/src/main/res/raw/gpl.html index 1af9930b33..5b891f8ce7 100644 --- a/mobile/android/focus-android/app/src/main/res/raw/gpl.html +++ b/mobile/android/focus-android/app/src/main/res/raw/gpl.html @@ -1,14 +1,14 @@ -<!DOCTYPE HTML> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this file, - You can obtain one at http://mozilla.org/MPL/2.0/. --> <html lang="en"> <head> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>GNU General Public License 3.0</title> - <link rel="stylesheet" type="text/css" href="style.css"> + <link rel="stylesheet" type="text/css" href="style.css" /> <style type="text/css"> .path { font-family: monospace; @@ -18,14 +18,17 @@ font-weight: bold; } </style> - <link rel="stylesheet" href="chrome://global/skin/about.css" type="text/css"> + <link + rel="stylesheet" + href="chrome://global/skin/about.css" + type="text/css" + /> </head> -<body id="lic-info" class="aboutPageWideContainer"> + <body id="lic-info" class="aboutPageWideContainer"> + <h1 id="gpl-3.0">GNU General Public License 3.0</h1> -<h1 id="gpl-3.0">GNU General Public License 3.0</h1> - -<pre>Version 3, 29 June 2007 + <pre>Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. <<a href="http://fsf.org/">http://fsf.org/</a>> @@ -33,639 +36,820 @@ Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.</pre> -<h2><a name="preamble"></a>Preamble</h2> - -<p>The GNU General Public License is a free, copyleft license for -software and other kinds of works.</p> - -<p>The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too.</p> - -<p>When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things.</p> - -<p>To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others.</p> - -<p>For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights.</p> - -<p>Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it.</p> - -<p>For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions.</p> - -<p>Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users.</p> - -<p>Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free.</p> - -<p>The precise terms and conditions for copying, distribution and -modification follow.</p> - -<h2><a name="terms"></a>TERMS AND CONDITIONS</h2> - -<h3><a name="section0"></a>0. Definitions.</h3> - -<p>“This License” refers to version 3 of the GNU General Public License.</p> - -<p>“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks.</p> - -<p>“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations.</p> - -<p>To “modify” a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a “modified version” of the -earlier work or a work “based on” the earlier work.</p> - -<p>A “covered work” means either the unmodified Program or a work based -on the Program.</p> - -<p>To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well.</p> - -<p>To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying.</p> - -<p>An interactive user interface displays “Appropriate Legal Notices” -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion.</p> - -<h3><a name="section1"></a>1. Source Code.</h3> - -<p>The “source code” for a work means the preferred form of the work -for making modifications to it. “Object code” means any non-source -form of a work.</p> - -<p>A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language.</p> - -<p>The “System Libraries” of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -“Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it.</p> - -<p>The “Corresponding Source” for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work.</p> - -<p>The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source.</p> - -<p>The Corresponding Source for a work in source code form is that -same work.</p> - -<h3><a name="section2"></a>2. Basic Permissions.</h3> - -<p>All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law.</p> - -<p>You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you.</p> - -<p>Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary.</p> - -<h3><a name="section3"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h3> - -<p>No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures.</p> - -<p>When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures.</p> - -<h3><a name="section4"></a>4. Conveying Verbatim Copies.</h3> - -<p>You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program.</p> - -<p>You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee.</p> - -<h3><a name="section5"></a>5. Conveying Modified Source Versions.</h3> - -<p>You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions:</p> - -<ul> -<li>a) The work must carry prominent notices stating that you modified - it, and giving a relevant date.</li> - -<li>b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - “keep intact all notices”.</li> - -<li>c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it.</li> - -<li>d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so.</li> -</ul> - -<p>A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -“aggregate” if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate.</p> - -<h3><a name="section6"></a>6. Conveying Non-Source Forms.</h3> - -<p>You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways:</p> - -<ul> -<li>a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange.</li> - -<li>b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge.</li> - -<li>c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b.</li> - -<li>d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements.</li> - -<li>e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d.</li> -</ul> - -<p>A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work.</p> - -<p>A “User Product” is either (1) a “consumer product”, which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, “normally used” refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product.</p> - -<p>“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made.</p> - -<p>If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM).</p> - -<p>The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network.</p> - -<p>Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying.</p> - -<h3><a name="section7"></a>7. Additional Terms.</h3> - -<p>“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions.</p> - -<p>When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission.</p> - -<p>Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms:</p> - -<ul> -<li>a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or</li> - -<li>b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or</li> - -<li>c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or</li> - -<li>d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or</li> - -<li>e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or</li> - -<li>f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors.</li> -</ul> - -<p>All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying.</p> - -<p>If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms.</p> - -<p>Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way.</p> - -<h3><a name="section8"></a>8. Termination.</h3> - -<p>You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11).</p> - -<p>However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation.</p> - -<p>Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice.</p> - -<p>Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10.</p> - -<h3><a name="section9"></a>9. Acceptance Not Required for Having Copies.</h3> - -<p>You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so.</p> - -<h3><a name="section10"></a>10. Automatic Licensing of Downstream Recipients.</h3> - -<p>Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License.</p> - -<p>An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts.</p> - -<p>You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it.</p> - -<h3><a name="section11"></a>11. Patents.</h3> - -<p>A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's “contributor version”.</p> - -<p>A contributor's “essential patent claims” are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License.</p> - -<p>Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version.</p> - -<p>In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To “grant” such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party.</p> - -<p>If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. “Knowingly relying” means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid.</p> - -<p>If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it.</p> - -<p>A patent license is “discriminatory” if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007.</p> - -<p>Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law.</p> - -<h3><a name="section12"></a>12. No Surrender of Others' Freedom.</h3> - -<p>If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program.</p> - -<h3><a name="section13"></a>13. Use with the GNU Affero General Public License.</h3> - -<p>Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such.</p> - -<h3><a name="section14"></a>14. Revised Versions of this License.</h3> - -<p>The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns.</p> - -<p>Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License “or any later version” applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation.</p> - -<p>If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program.</p> - -<p>Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version.</p> - -<h3><a name="section15"></a>15. Disclaimer of Warranty.</h3> - -<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p> - -<h3><a name="section16"></a>16. Limitation of Liability.</h3> - -<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES.</p> - -<h3><a name="section17"></a>17. Interpretation of Sections 15 and 16.</h3> - -<p>If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee.</p> - -<p>END OF TERMS AND CONDITIONS</p> - -<h2><a name="howto"></a>How to Apply These Terms to Your New Programs</h2> - -<p>If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms.</p> - -<p>To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the “copyright” line and a pointer to where the full notice is found.</p> - -<pre> <one line to give the program's name and a brief idea of what it does.> + <h2><a name="preamble"></a>Preamble</h2> + + <p> + The GNU General Public License is a free, copyleft license for software + and other kinds of works. + </p> + + <p> + The licenses for most software and other practical works are designed to + take away your freedom to share and change the works. By contrast, the GNU + General Public License is intended to guarantee your freedom to share and + change all versions of a program--to make sure it remains free software + for all its users. We, the Free Software Foundation, use the GNU General + Public License for most of our software; it applies also to any other work + released this way by its authors. You can apply it to your programs, too. + </p> + + <p> + When we speak of free software, we are referring to freedom, not price. + Our General Public Licenses are designed to make sure that you have the + freedom to distribute copies of free software (and charge for them if you + wish), that you receive source code or can get it if you want it, that you + can change the software or use pieces of it in new free programs, and that + you know you can do these things. + </p> + + <p> + To protect your rights, we need to prevent others from denying you these + rights or asking you to surrender the rights. Therefore, you have certain + responsibilities if you distribute copies of the software, or if you + modify it: responsibilities to respect the freedom of others. + </p> + + <p> + For example, if you distribute copies of such a program, whether gratis or + for a fee, you must pass on to the recipients the same freedoms that you + received. You must make sure that they, too, receive or can get the source + code. And you must show them these terms so they know their rights. + </p> + + <p> + Developers that use the GNU GPL protect your rights with two steps: (1) + assert copyright on the software, and (2) offer you this License giving + you legal permission to copy, distribute and/or modify it. + </p> + + <p> + For the developers' and authors' protection, the GPL clearly explains that + there is no warranty for this free software. For both users' and authors' + sake, the GPL requires that modified versions be marked as changed, so + that their problems will not be attributed erroneously to authors of + previous versions. + </p> + + <p> + Some devices are designed to deny users access to install or run modified + versions of the software inside them, although the manufacturer can do so. + This is fundamentally incompatible with the aim of protecting users' + freedom to change the software. The systematic pattern of such abuse + occurs in the area of products for individuals to use, which is precisely + where it is most unacceptable. Therefore, we have designed this version of + the GPL to prohibit the practice for those products. If such problems + arise substantially in other domains, we stand ready to extend this + provision to those domains in future versions of the GPL, as needed to + protect the freedom of users. + </p> + + <p> + Finally, every program is threatened constantly by software patents. + States should not allow patents to restrict development and use of + software on general-purpose computers, but in those that do, we wish to + avoid the special danger that patents applied to a free program could make + it effectively proprietary. To prevent this, the GPL assures that patents + cannot be used to render the program non-free. + </p> + + <p> + The precise terms and conditions for copying, distribution and + modification follow. + </p> + + <h2><a name="terms"></a>TERMS AND CONDITIONS</h2> + + <h3><a name="section0"></a>0. Definitions.</h3> + + <p> + “This License” refers to version 3 of the GNU General Public + License. + </p> + + <p> + “Copyright” also means copyright-like laws that apply to other + kinds of works, such as semiconductor masks. + </p> + + <p> + “The Program” refers to any copyrightable work licensed under + this License. Each licensee is addressed as “you”. + “Licensees” and “recipients” may be individuals or + organizations. + </p> + + <p> + To “modify” a work means to copy from or adapt all or part of + the work in a fashion requiring copyright permission, other than the + making of an exact copy. The resulting work is called a “modified + version” of the earlier work or a work “based on” the + earlier work. + </p> + + <p> + A “covered work” means either the unmodified Program or a work + based on the Program. + </p> + + <p> + To “propagate” a work means to do anything with it that, + without permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + </p> + + <p> + To “convey” a work means any kind of propagation that enables + other parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not conveying. + </p> + + <p> + An interactive user interface displays “Appropriate Legal + Notices” to the extent that it includes a convenient and prominently + visible feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the work + under this License, and how to view a copy of this License. If the + interface presents a list of user commands or options, such as a menu, a + prominent item in the list meets this criterion. + </p> + + <h3><a name="section1"></a>1. Source Code.</h3> + + <p> + The “source code” for a work means the preferred form of the + work for making modifications to it. “Object code” means any + non-source form of a work. + </p> + + <p> + A “Standard Interface” means an interface that either is an + official standard defined by a recognized standards body, or, in the case + of interfaces specified for a particular programming language, one that is + widely used among developers working in that language. + </p> + + <p> + The “System Libraries” of an executable work include anything, + other than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that Major + Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + “Major Component”, in this context, means a major essential + component (kernel, window system, and so on) of the specific operating + system (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + </p> + + <p> + The “Corresponding Source” for a work in object code form + means all the source code needed to generate, install, and (for an + executable work) run the object code and to modify the work, including + scripts to control those activities. However, it does not include the + work's System Libraries, or general-purpose tools or generally available + free programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source includes + interface definition files associated with source files for the work, and + the source code for shared libraries and dynamically linked subprograms + that the work is specifically designed to require, such as by intimate + data communication or control flow between those subprograms and other + parts of the work. + </p> + + <p> + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding Source. + </p> + + <p> + The Corresponding Source for a work in source code form is that same work. + </p> + + <h3><a name="section2"></a>2. Basic Permissions.</h3> + + <p> + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your rights + of fair use or other equivalent, as provided by copyright law. + </p> + + <p> + You may make, run and propagate covered works that you do not convey, + without conditions so long as your license otherwise remains in force. You + may convey covered works to others for the sole purpose of having them + make modifications exclusively for you, or provide you with facilities for + running those works, provided that you comply with the terms of this + License in conveying all material for which you do not control copyright. + Those thus making or running the covered works for you must do so + exclusively on your behalf, under your direction and control, on terms + that prohibit them from making any copies of your copyrighted material + outside their relationship with you. + </p> + + <p> + Conveying under any other circumstances is permitted solely under the + conditions stated below. Sublicensing is not allowed; section 10 makes it + unnecessary. + </p> + + <h3> + <a name="section3"></a>3. Protecting Users' Legal Rights From + Anti-Circumvention Law. + </h3> + + <p> + No covered work shall be deemed part of an effective technological measure + under any applicable law fulfilling obligations under article 11 of the + WIPO copyright treaty adopted on 20 December 1996, or similar laws + prohibiting or restricting circumvention of such measures. + </p> + + <p> + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to the + covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + </p> + + <h3><a name="section4"></a>4. Conveying Verbatim Copies.</h3> + + <p> + You may convey verbatim copies of the Program's source code as you receive + it, in any medium, provided that you conspicuously and appropriately + publish on each copy an appropriate copyright notice; keep intact all + notices stating that this License and any non-permissive terms added in + accord with section 7 apply to the code; keep intact all notices of the + absence of any warranty; and give all recipients a copy of this License + along with the Program. + </p> + + <p> + You may charge any price or no price for each copy that you convey, and + you may offer support or warranty protection for a fee. + </p> + + <h3><a name="section5"></a>5. Conveying Modified Source Versions.</h3> + + <p> + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the terms of + section 4, provided that you also meet all of these conditions: + </p> + + <ul> + <li> + a) The work must carry prominent notices stating that you modified it, + and giving a relevant date. + </li> + + <li> + b) The work must carry prominent notices stating that it is released + under this License and any conditions added under section 7. This + requirement modifies the requirement in section 4 to “keep intact + all notices”. + </li> + + <li> + c) You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will therefore + apply, along with any applicable section 7 additional terms, to the + whole of the work, and all its parts, regardless of how they are + packaged. This License gives no permission to license the work in any + other way, but it does not invalidate such permission if you have + separately received it. + </li> + + <li> + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your work need + not make them do so. + </li> + </ul> + + <p> + A compilation of a covered work with other separate and independent works, + which are not by their nature extensions of the covered work, and which + are not combined with it such as to form a larger program, in or on a + volume of a storage or distribution medium, is called an + “aggregate” if the compilation and its resulting copyright are + not used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work in an + aggregate does not cause this License to apply to the other parts of the + aggregate. + </p> + + <h3><a name="section6"></a>6. Conveying Non-Source Forms.</h3> + + <p> + You may convey a covered work in object code form under the terms of + sections 4 and 5, provided that you also convey the machine-readable + Corresponding Source under the terms of this License, in one of these + ways: + </p> + + <ul> + <li> + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium customarily used + for software interchange. + </li> + + <li> + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a written + offer, valid for at least three years and valid for as long as you offer + spare parts or customer support for that product model, to give anyone + who possesses the object code either (1) a copy of the Corresponding + Source for all the software in the product that is covered by this + License, on a durable physical medium customarily used for software + interchange, for a price no more than your reasonable cost of physically + performing this conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + </li> + + <li> + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This alternative is + allowed only occasionally and noncommercially, and only if you received + the object code with such an offer, in accord with subsection 6b. + </li> + + <li> + d) Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to copy + the object code is a network server, the Corresponding Source may be on + a different server (operated by you or a third party) that supports + equivalent copying facilities, provided you maintain clear directions + next to the object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you remain + obligated to ensure that it is available for as long as needed to + satisfy these requirements. + </li> + + <li> + e) Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of the + work are being offered to the general public at no charge under + subsection 6d. + </li> + </ul> + + <p> + A separable portion of the object code, whose source code is excluded from + the Corresponding Source as a System Library, need not be included in + conveying the object code work. + </p> + + <p> + A “User Product” is either (1) a “consumer + product”, which means any tangible personal property which is + normally used for personal, family, or household purposes, or (2) anything + designed or sold for incorporation into a dwelling. In determining whether + a product is a consumer product, doubtful cases shall be resolved in favor + of coverage. For a particular product received by a particular user, + “normally used” refers to a typical or common use of that + class of product, regardless of the status of the particular user or of + the way in which the particular user actually uses, or expects or is + expected to use, the product. A product is a consumer product regardless + of whether the product has substantial commercial, industrial or + non-consumer uses, unless such uses represent the only significant mode of + use of the product. + </p> + + <p> + “Installation Information” for a User Product means any + methods, procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that User + Product from a modified version of its Corresponding Source. The + information must suffice to ensure that the continued functioning of the + modified object code is in no case prevented or interfered with solely + because modification has been made. + </p> + + <p> + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as part + of a transaction in which the right of possession and use of the User + Product is transferred to the recipient in perpetuity or for a fixed term + (regardless of how the transaction is characterized), the Corresponding + Source conveyed under this section must be accompanied by the Installation + Information. But this requirement does not apply if neither you nor any + third party retains the ability to install modified object code on the + User Product (for example, the work has been installed in ROM). + </p> + + <p> + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + </p> + + <p> + Corresponding Source conveyed, and Installation Information provided, in + accord with this section must be in a format that is publicly documented + (and with an implementation available to the public in source code form), + and must require no special password or key for unpacking, reading or + copying. + </p> + + <h3><a name="section7"></a>7. Additional Terms.</h3> + + <p> + “Additional permissions” are terms that supplement the terms + of this License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall be + treated as though they were included in this License, to the extent that + they are valid under applicable law. If additional permissions apply only + to part of the Program, that part may be used separately under those + permissions, but the entire Program remains governed by this License + without regard to the additional permissions. + </p> + + <p> + When you convey a copy of a covered work, you may at your option remove + any additional permissions from that copy, or from any part of it. + (Additional permissions may be written to require their own removal in + certain cases when you modify the work.) You may place additional + permissions on material, added by you to a covered work, for which you + have or can give appropriate copyright permission. + </p> + + <p> + Notwithstanding any other provision of this License, for material you add + to a covered work, you may (if authorized by the copyright holders of that + material) supplement the terms of this License with terms: + </p> + + <ul> + <li> + a) Disclaiming warranty or limiting liability differently from the terms + of sections 15 and 16 of this License; or + </li> + + <li> + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal Notices + displayed by works containing it; or + </li> + + <li> + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + </li> + + <li> + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + </li> + + <li> + e) Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or + </li> + + <li> + f) Requiring indemnification of licensors and authors of that material + by anyone who conveys the material (or modified versions of it) with + contractual assumptions of liability to the recipient, for any liability + that these contractual assumptions directly impose on those licensors + and authors. + </li> + </ul> + + <p> + All other non-permissive additional terms are considered “further + restrictions” within the meaning of section 10. If the Program as + you received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further restriction, + you may remove that term. If a license document contains a further + restriction but permits relicensing or conveying under this License, you + may add to a covered work material governed by the terms of that license + document, provided that the further restriction does not survive such + relicensing or conveying. + </p> + + <p> + If you add terms to a covered work in accord with this section, you must + place, in the relevant source files, a statement of the additional terms + that apply to those files, or a notice indicating where to find the + applicable terms. + </p> + + <p> + Additional terms, permissive or non-permissive, may be stated in the form + of a separately written license, or stated as exceptions; the above + requirements apply either way. + </p> + + <h3><a name="section8"></a>8. Termination.</h3> + + <p> + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or modify + it is void, and will automatically terminate your rights under this + License (including any patent licenses granted under the third paragraph + of section 11). + </p> + + <p> + However, if you cease all violation of this License, then your license + from a particular copyright holder is reinstated (a) provisionally, unless + and until the copyright holder explicitly and finally terminates your + license, and (b) permanently, if the copyright holder fails to notify you + of the violation by some reasonable means prior to 60 days after the + cessation. + </p> + + <p> + Moreover, your license from a particular copyright holder is reinstated + permanently if the copyright holder notifies you of the violation by some + reasonable means, this is the first time you have received notice of + violation of this License (for any work) from that copyright holder, and + you cure the violation prior to 30 days after your receipt of the notice. + </p> + + <p> + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under this + License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + </p> + + <h3> + <a name="section9"></a>9. Acceptance Not Required for Having Copies. + </h3> + + <p> + You are not required to accept this License in order to receive or run a + copy of the Program. Ancillary propagation of a covered work occurring + solely as a consequence of using peer-to-peer transmission to receive a + copy likewise does not require acceptance. However, nothing other than + this License grants you permission to propagate or modify any covered + work. These actions infringe copyright if you do not accept this License. + Therefore, by modifying or propagating a covered work, you indicate your + acceptance of this License to do so. + </p> + + <h3> + <a name="section10"></a>10. Automatic Licensing of Downstream Recipients. + </h3> + + <p> + Each time you convey a covered work, the recipient automatically receives + a license from the original licensors, to run, modify and propagate that + work, subject to this License. You are not responsible for enforcing + compliance by third parties with this License. + </p> + + <p> + An “entity transaction” is a transaction transferring control + of an organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered work + results from an entity transaction, each party to that transaction who + receives a copy of the work also receives whatever licenses to the work + the party's predecessor in interest had or could give under the previous + paragraph, plus a right to possession of the Corresponding Source of the + work from the predecessor in interest, if the predecessor has it or can + get it with reasonable efforts. + </p> + + <p> + You may not impose any further restrictions on the exercise of the rights + granted or affirmed under this License. For example, you may not impose a + license fee, royalty, or other charge for exercise of rights granted under + this License, and you may not initiate litigation (including a cross-claim + or counterclaim in a lawsuit) alleging that any patent claim is infringed + by making, using, selling, offering for sale, or importing the Program or + any portion of it. + </p> + + <h3><a name="section11"></a>11. Patents.</h3> + + <p> + A “contributor” is a copyright holder who authorizes use under + this License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's “contributor + version”. + </p> + + <p> + A contributor's “essential patent claims” are all patent + claims owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted by + this License, of making, using, or selling its contributor version, but do + not include claims that would be infringed only as a consequence of + further modification of the contributor version. For purposes of this + definition, “control” includes the right to grant patent + sublicenses in a manner consistent with the requirements of this License. + </p> + + <p> + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to make, + use, sell, offer for sale, import and otherwise run, modify and propagate + the contents of its contributor version. + </p> + + <p> + In the following three paragraphs, a “patent license” is any + express agreement or commitment, however denominated, not to enforce a + patent (such as an express permission to practice a patent or covenant not + to sue for patent infringement). To “grant” such a patent + license to a party means to make such an agreement or commitment not to + enforce a patent against the party. + </p> + + <p> + If you convey a covered work, knowingly relying on a patent license, and + the Corresponding Source of the work is not available for anyone to copy, + free of charge and under the terms of this License, through a publicly + available network server or other readily accessible means, then you must + either (1) cause the Corresponding Source to be so available, or (2) + arrange to deprive yourself of the benefit of the patent license for this + particular work, or (3) arrange, in a manner consistent with the + requirements of this License, to extend the patent license to downstream + recipients. “Knowingly relying” means you have actual + knowledge that, but for the patent license, your conveying the covered + work in a country, or your recipient's use of the covered work in a + country, would infringe one or more identifiable patents in that country + that you have reason to believe are valid. + </p> + + <p> + If, pursuant to or in connection with a single transaction or arrangement, + you convey, or propagate by procuring conveyance of, a covered work, and + grant a patent license to some of the parties receiving the covered work + authorizing them to use, propagate, modify or convey a specific copy of + the covered work, then the patent license you grant is automatically + extended to all recipients of the covered work and works based on it. + </p> + + <p> + A patent license is “discriminatory” if it does not include + within the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered work + if you are a party to an arrangement with a third party that is in the + business of distributing software, under which you make payment to the + third party based on the extent of your activity of conveying the work, + and under which the third party grants, to any of the parties who would + receive the covered work from you, a discriminatory patent license (a) in + connection with copies of the covered work conveyed by you (or copies made + from those copies), or (b) primarily for and in connection with specific + products or compilations that contain the covered work, unless you entered + into that arrangement, or that patent license was granted, prior to 28 + March 2007. + </p> + + <p> + Nothing in this License shall be construed as excluding or limiting any + implied license or other defenses to infringement that may otherwise be + available to you under applicable patent law. + </p> + + <h3><a name="section12"></a>12. No Surrender of Others' Freedom.</h3> + + <p> + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + </p> + + <h3> + <a name="section13"></a>13. Use with the GNU Affero General Public + License. + </h3> + + <p> + Notwithstanding any other provision of this License, you have permission + to link or combine any covered work with a work licensed under version 3 + of the GNU Affero General Public License into a single combined work, and + to convey the resulting work. The terms of this License will continue to + apply to the part which is the covered work, but the special requirements + of the GNU Affero General Public License, section 13, concerning + interaction through a network will apply to the combination as such. + </p> + + <h3><a name="section14"></a>14. Revised Versions of this License.</h3> + + <p> + The Free Software Foundation may publish revised and/or new versions of + the GNU General Public License from time to time. Such new versions will + be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + </p> + + <p> + Each version is given a distinguishing version number. If the Program + specifies that a certain numbered version of the GNU General Public + License “or any later version” applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software Foundation. + If the Program does not specify a version number of the GNU General Public + License, you may choose any version ever published by the Free Software + Foundation. + </p> + + <p> + If the Program specifies that a proxy can decide which future versions of + the GNU General Public License can be used, that proxy's public statement + of acceptance of a version permanently authorizes you to choose that + version for the Program. + </p> + + <p> + Later license versions may give you additional or different permissions. + However, no additional obligations are imposed on any author or copyright + holder as a result of your choosing to follow a later version. + </p> + + <h3><a name="section15"></a>15. Disclaimer of Warranty.</h3> + + <p> + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF + THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME + THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + </p> + + <h3><a name="section16"></a>16. Limitation of Liability.</h3> + + <p> + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL + ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE + PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + </p> + + <h3><a name="section17"></a>17. Interpretation of Sections 15 and 16.</h3> + + <p> + If the disclaimer of warranty and limitation of liability provided above + cannot be given local legal effect according to their terms, reviewing + courts shall apply local law that most closely approximates an absolute + waiver of all civil liability in connection with the Program, unless a + warranty or assumption of liability accompanies a copy of the Program in + return for a fee. + </p> + + <p>END OF TERMS AND CONDITIONS</p> + + <h2><a name="howto"></a>How to Apply These Terms to Your New Programs</h2> + + <p> + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these + terms. + </p> + + <p> + To do so, attach the following notices to the program. It is safest to + attach them to the start of each source file to most effectively state the + exclusion of warranty; and each file should have at least the + “copyright” line and a pointer to where the full notice is + found. + </p> + + <pre> + <one line to give the program's name and a brief idea of what it does.> Copyright (C) <year> <name of author> This program is free software: you can redistribute it and/or modify @@ -680,34 +864,51 @@ the “copyright” line and a pointer to where the full notice is found You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. -</pre> +</pre + > -<p>Also add information on how to contact you by electronic and paper mail.</p> + <p> + Also add information on how to contact you by electronic and paper mail. + </p> -<p>If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode:</p> + <p> + If the program does terminal interaction, make it output a short notice + like this when it starts in an interactive mode: + </p> -<pre> <program> Copyright (C) <year> <name of author> + <pre> + <program> Copyright (C) <year> <name of author> This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. -</pre> - -<p>The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an “about box”.</p> - -<p>You should also get your employer (if you work as a programmer) or school, -if any, to sign a “copyright disclaimer” for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<<a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>>.</p> - -<p>The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<<a href="http://www.gnu.org/philosophy/why-not-lgpl.html">http://www.gnu.org/philosophy/why-not-lgpl.html</a>>.</p> - +</pre + > + + <p> + The hypothetical commands `show w' and `show c' should show the + appropriate parts of the General Public License. Of course, your program's + commands might be different; for a GUI interface, you would use an + “about box”. + </p> + + <p> + You should also get your employer (if you work as a programmer) or school, + if any, to sign a “copyright disclaimer” for the program, if + necessary. For more information on this, and how to apply and follow the + GNU GPL, see <<a href="http://www.gnu.org/licenses/" + >http://www.gnu.org/licenses/</a + >>. + </p> + + <p> + The GNU General Public License does not permit incorporating your program + into proprietary programs. If your program is a subroutine library, you + may consider it more useful to permit linking proprietary applications + with the library. If this is what you want to do, use the GNU Lesser + General Public License instead of this License. But first, please read + <<a href="http://www.gnu.org/philosophy/why-not-lgpl.html" + >http://www.gnu.org/philosophy/why-not-lgpl.html</a + >>. + </p> </body> </html> diff --git a/mobile/android/focus-android/app/src/main/res/raw/licenses.html b/mobile/android/focus-android/app/src/main/res/raw/licenses.html index 3f90063160..d6d71c6c67 100644 --- a/mobile/android/focus-android/app/src/main/res/raw/licenses.html +++ b/mobile/android/focus-android/app/src/main/res/raw/licenses.html @@ -1,948 +1,1299 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> -<head> - <link rel="stylesheet" type="text/css" href="style.css"> - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> -</head> -<body> - -<h1>Licenses</h1> - -<p> - Binaries of this product are made available to you by Mozilla under the Mozilla Public License 2.0 (MPL). -</p> - -<p> - More specifically, most of the source code for this product is available under the Mozilla Public License 2.0 (MPL) - and Apache License 2.0. Additional software components for this product are available under one of a variety of - other free and open source licenses. Those that require reproduction of the license text in the distribution are - given below. (Note: your copy of this product may not contain code covered by one or more of the licenses listed - here, depending on the exact product and version you choose.) -</p> - - -<ul> - <li><a href="#mpl2">Mozilla Public License 2.0</a></li> - <li><a href="#apache2">Apache License 2.0</a></li> - <li><a href="#lgpl21">GNU Lesser General Public License 2.1</a></li> - <li><a href="#adjust">adjust-android License</a></li> -</ul> - -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> - -<h2><a name="mpl2">Mozilla Public License 2.0</a></h2> - -<ul> - <li>Focus - https://github.com/mozilla-mobile/focus-android</li> - <li>Telemetry - https://github.com/mozilla-mobile/telemetry-android</li> -</ul> - - <h4>1. Definitions</h4> - <dl> - <dt>1.1. “Contributor”</dt> - <dd><p>means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software.</p> - </dd> - <dt>1.2. “Contributor Version”</dt> - <dd><p>means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor’s Contribution.</p> - </dd> - <dt>1.3. “Contribution”</dt> - <dd><p>means Covered Software of a particular Contributor.</p> - </dd> - <dt>1.4. “Covered Software”</dt> - <dd><p>means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof.</p> - </dd> - <dt>1.5. “Incompatible With Secondary Licenses”</dt> - <dd><p>means</p> - <ol type="a"> - <li><p>that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or</p></li> - <li><p>that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License.</p></li> - </ol> - </dd> - <dt>1.6. “Executable Form”</dt> - <dd><p>means any form of the work other than Source Code Form.</p> - </dd> - <dt>1.7. “Larger Work”</dt> - <dd><p>means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software.</p> - </dd> - <dt>1.8. “License”</dt> - <dd><p>means this document.</p> - </dd> - <dt>1.9. “Licensable”</dt> - <dd><p>means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License.</p> - </dd> - <dt>1.10. “Modifications”</dt> - <dd><p>means any of the following:</p> - <ol type="a"> - <li><p>any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or</p></li> - <li><p>any new file in Source Code Form that contains any Covered Software.</p></li> - </ol> - </dd> - <dt>1.11. “Patent Claims” of a Contributor</dt> - <dd><p>means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version.</p> - </dd> - <dt>1.12. “Secondary License”</dt> - <dd><p>means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses.</p> - </dd> - <dt>1.13. “Source Code Form”</dt> - <dd><p>means the form of the work preferred for making modifications.</p> - </dd> - <dt>1.14. “You” (or “Your”)</dt> - <dd><p>means an individual or a legal entity exercising rights under this License. For legal entities, “You” includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.</p> - </dd> - </dl> - <h4>2. License Grants and Conditions</h4> - <h3>2.1. Grants</h3> - <p>Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:</p> - <ol type="a"> - <li><p>under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and</p></li> - <li><p>under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version.</p></li> - </ol> - <h3>2.2. Effective Date</h3> - <p>The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution.</p> - <h3>2.3. Limitations on Grant Scope</h3> - <p>The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor:</p> - <ol type="a"> - <li><p>for any code that a Contributor has removed from Covered Software; or</p></li> - <li><p>for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or</p></li> - <li><p>under Patent Claims infringed by Covered Software in the absence of its Contributions.</p></li> - </ol> - <p>This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4).</p> - <h3>2.4. Subsequent Licenses</h3> - <p>No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3).</p> - <h3>2.5. Representation</h3> - <p>Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License.</p> - <h3>2.6. Fair Use</h3> - <p>This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents.</p> - <h3>2.7. Conditions</h3> - <p>Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1.</p> - <h4>3. Responsibilities</h4> - <h3>3.1. Distribution of Source Form</h3> - <p>All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients’ rights in the Source Code Form.</p> - <h3>3.2. Distribution of Executable Form</h3> - <p>If You distribute Covered Software in Executable Form then:</p> - <ol type="a"> - <li><p>such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and</p></li> - <li><p>You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients’ rights in the Source Code Form under this License.</p></li> - </ol> - <h3>3.3. Distribution of a Larger Work</h3> - <p>You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s).</p> - <h3>3.4. Notices</h3> - <p>You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies.</p> - <h3>3.5. Application of Additional Terms</h3> - <p>You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction.</p> - <h4>4. Inability to Comply Due to Statute or Regulation</h4> - <p>If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.</p> - <h4>5. Termination</h4> - <p>5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice.</p> - <p>5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate.</p> - <p>5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination.</p> - <h4>6. Disclaimer of Warranty</h4> - <p><em>Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer.</em></p> - <h4>7. Limitation of Liability</h4> - <p><em>Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You.</em></p> - <h4>8. Litigation</h4> - <p>Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims.</p> - <h4>9. Miscellaneous</h4> - <p>This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor.</p> - <h4>10. Versions of the License</h4> - <h3>10.1. New Versions</h3> - <p>Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number.</p> - <h3>10.2. Effect of New Versions</h3> - <p>You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward.</p> - <h3>10.3. Modified Versions</h3> - <p>If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License).</p> - <h3>10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses</h3> - <p>If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached.</p> - <h4>Exhibit A - Source Code Form License Notice</h4> - <blockquote> - <p>This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at <a href="http://mozilla.org/MPL/2.0/" target="_blank">http://mozilla.org/MPL/2.0/</a>.</p> - </blockquote> - <p>If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.</p> - <p>You may add additional accurate notices of copyright ownership.</p> - <h4>Exhibit B - “Incompatible With Secondary Licenses” Notice</h4> - <blockquote> - <p>This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.</p> - </blockquote> - -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> - -<h2><a name="apache2">Apache License 2.0</a></h2> - -<ul> - <li>com.android.support : animated-vector-drawable</li> - <li>org.jetbrains : annotations</li> - <li>com.android.support : appcompat-v7</li> - <li>com.android.support : cardview-v7</li> - <li>android.arch.lifecycle : common</li> - <li>android.arch.core : common</li> - <li>com.android.support : customtabs</li> - <li>com.android.support : design</li> - <li>android.arch.lifecycle : extensions</li> - <li>org.jetbrains.kotlin : kotlin-stdlib-jre7</li> - <li>org.jetbrains.kotlin : kotlin-stdlib</li> - <li>com.android.support : recyclerview-v7</li> - <li>android.arch.core : runtime</li> - <li>android.arch.lifecycle : runtime</li> - <li>com.android.support : support-annotations</li> - <li>com.android.support : support-compat</li> - <li>com.android.support : support-core-ui</li> - <li>com.android.support : support-core-utils</li> - <li>com.android.support : support-fragment</li> - <li>com.android.support : support-media-compat</li> - <li>com.android.support : support-v4</li> - <li>com.android.support :support-vector-drawable</li> - <li>com.android.support :transition</li> -</ul> - - <p><strong><a name="definitions">1. Definitions</a></strong>.</p> - <p>"License" shall mean the terms and conditions for use, reproduction, and - distribution as defined by Sections 1 through 9 of this document.</p> - <p>"Licensor" shall mean the copyright owner or entity authorized by the - copyright owner that is granting the License.</p> - <p>"Legal Entity" shall mean the union of the acting entity and all other - entities that control, are controlled by, or are under common control with - that entity. For the purposes of this definition, "control" means (i) the - power, direct or indirect, to cause the direction or management of such - entity, whether by contract or otherwise, or (ii) ownership of fifty - percent (50%) or more of the outstanding shares, or (iii) beneficial - ownership of such entity.</p> - <p>"You" (or "Your") shall mean an individual or Legal Entity exercising - permissions granted by this License.</p> - <p>"Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation source, - and configuration files.</p> - <p>"Object" form shall mean any form resulting from mechanical transformation - or translation of a Source form, including but not limited to compiled - object code, generated documentation, and conversions to other media types.</p> - <p>"Work" shall mean the work of authorship, whether in Source or Object form, - made available under the License, as indicated by a copyright notice that - is included in or attached to the work (an example is provided in the - Appendix below).</p> - <p>"Derivative Works" shall mean any work, whether in Source or Object form, - that is based on (or derived from) the Work and for which the editorial - revisions, annotations, elaborations, or other modifications represent, as - a whole, an original work of authorship. For the purposes of this License, - Derivative Works shall not include works that remain separable from, or - merely link (or bind by name) to the interfaces of, the Work and Derivative - Works thereof.</p> - <p>"Contribution" shall mean any work of authorship, including the original - version of the Work and any modifications or additions to that Work or - Derivative Works thereof, that is intentionally submitted to Licensor for - inclusion in the Work by the copyright owner or by an individual or Legal - Entity authorized to submit on behalf of the copyright owner. For the - purposes of this definition, "submitted" means any form of electronic, - verbal, or written communication sent to the Licensor or its - representatives, including but not limited to communication on electronic - mailing lists, source code control systems, and issue tracking systems that - are managed by, or on behalf of, the Licensor for the purpose of discussing - and improving the Work, but excluding communication that is conspicuously - marked or otherwise designated in writing by the copyright owner as "Not a - Contribution."</p> - <p>"Contributor" shall mean Licensor and any individual or Legal Entity on - behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work.</p> - <p><strong><a name="copyright">2. Grant of Copyright License</a></strong>. Subject to the - terms and conditions of this License, each Contributor hereby grants to You - a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, publicly - display, publicly perform, sublicense, and distribute the Work and such - Derivative Works in Source or Object form.</p> - <p><strong><a name="patent">3. Grant of Patent License</a></strong>. Subject to the terms - and conditions of this License, each Contributor hereby grants to You a - perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, use, - offer to sell, sell, import, and otherwise transfer the Work, where such - license applies only to those patent claims licensable by such Contributor - that are necessarily infringed by their Contribution(s) alone or by - combination of their Contribution(s) with the Work to which such - Contribution(s) was submitted. If You institute patent litigation against - any entity (including a cross-claim or counterclaim in a lawsuit) alleging - that the Work or a Contribution incorporated within the Work constitutes - direct or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate as of the - date such litigation is filed.</p> - <p><strong><a name="redistribution">4. Redistribution</a></strong>. You may reproduce and - distribute copies of the Work or Derivative Works thereof in any medium, - with or without modifications, and in Source or Object form, provided that - You meet the following conditions:</p> - <ol style="list-style: lower-latin;"> - <li>You must give any other recipients of the Work or Derivative Works a - copy of this License; and</li> - - <li>You must cause any modified files to carry prominent notices stating - that You changed the files; and</li> - - <li>You must retain, in the Source form of any Derivative Works that You - distribute, all copyright, patent, trademark, and attribution notices from - the Source form of the Work, excluding those notices that do not pertain to - any part of the Derivative Works; and</li> - - <li>If the Work includes a "NOTICE" text file as part of its distribution, - then any Derivative Works that You distribute must include a readable copy - of the attribution notices contained within such NOTICE file, excluding - those notices that do not pertain to any part of the Derivative Works, in - at least one of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or documentation, - if provided along with the Derivative Works; or, within a display generated - by the Derivative Works, if and wherever such third-party notices normally - appear. The contents of the NOTICE file are for informational purposes only - and do not modify the License. You may add Your own attribution notices - within Derivative Works that You distribute, alongside or as an addendum to - the NOTICE text from the Work, provided that such additional attribution - notices cannot be construed as modifying the License. - <br/> - <br/> - You may add Your own copyright statement to Your modifications and may - provide additional or different license terms and conditions for use, - reproduction, or distribution of Your modifications, or for any such - Derivative Works as a whole, provided Your use, reproduction, and - distribution of the Work otherwise complies with the conditions stated in - this License. - </li> - - </ol> - - <p><strong><a name="contributions">5. Submission of Contributions</a></strong>. Unless You - explicitly state otherwise, any Contribution intentionally submitted for - inclusion in the Work by You to the Licensor shall be under the terms and - conditions of this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify the - terms of any separate license agreement you may have executed with Licensor - regarding such Contributions.</p> - <p><strong><a name="trademarks">6. Trademarks</a></strong>. This License does not grant - permission to use the trade names, trademarks, service marks, or product - names of the Licensor, except as required for reasonable and customary use - in describing the origin of the Work and reproducing the content of the - NOTICE file.</p> - <p><strong><a name="no-warranty">7. Disclaimer of Warranty</a></strong>. Unless required by - applicable law or agreed to in writing, Licensor provides the Work (and - each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT - WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, - without limitation, any warranties or conditions of TITLE, - NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You - are solely responsible for determining the appropriateness of using or - redistributing the Work and assume any risks associated with Your exercise - of permissions under this License.</p> - <p><strong><a name="no-liability">8. Limitation of Liability</a></strong>. In no event and - under no legal theory, whether in tort (including negligence), contract, or - otherwise, unless required by applicable law (such as deliberate and - grossly negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a result - of this License or out of the use or inability to use the Work (including - but not limited to damages for loss of goodwill, work stoppage, computer - failure or malfunction, or any and all other commercial damages or losses), - even if such Contributor has been advised of the possibility of such - damages.</p> - <p><strong><a name="additional">9. Accepting Warranty or Additional Liability</a></strong>. - While redistributing the Work or Derivative Works thereof, You may choose - to offer, and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this License. - However, in accepting such obligations, You may act only on Your own behalf - and on Your sole responsibility, not on behalf of any other Contributor, - and only if You agree to indemnify, defend, and hold each Contributor - harmless for any liability incurred by, or claims asserted against, such - Contributor by reason of your accepting any such warranty or additional - liability.</p> - <p>END OF TERMS AND CONDITIONS</p> - -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> - -<h2><a name="lgpl21">GNU Lesser General Public License 2.1</a></h2> - -<ul> - <li>findbugs annotations (com.google.code.findbugs:annotations)</li> -</ul> - -<h3><a id="SEC1">GNU LESSER GENERAL PUBLIC LICENSE</a></h3> -<p> -Version 2.1, February 1999 -</p> - -<p> -Copyright (C) 1991, 1999 Free Software Foundation, Inc.<br /> -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA<br /> -Everyone is permitted to copy and distribute verbatim copies<br /> -of this license document, but changing it is not allowed. -</p> - -<p> -[This is the first released version of the Lesser GPL. It also counts<br /> - as the successor of the GNU Library Public License, version 2, hence<br /> - the version number 2.1.] -</p> - -<h3><a id="SEC2">Preamble</a></h3> - -<p> - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. -</p> -<p> - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. -</p> -<p> - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. -</p> -<p> - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. -</p> -<p> - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. -</p> -<p> - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. -</p> -<p> - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. -</p> -<p> - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. -</p> -<p> - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. -</p> -<p> - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. -</p> -<p> - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. -</p> -<p> - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. -</p> -<p> - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. -</p> -<p> - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. -</p> -<p> - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. -</p> - -<h3><a id="SEC3">TERMS AND CONDITIONS FOR COPYING, -DISTRIBUTION AND MODIFICATION</a></h3> - - -<p> -<strong>0.</strong> -This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". -</p> -<p> - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. -</p> -<p> - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) -</p> -<p> - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. -</p> -<p> - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. -</p> -<p> -<strong>1.</strong> -You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. -</p> -<p> - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. -</p> -<p> -<strong>2.</strong> -You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: -</p> - -<ul> - <li><strong>a)</strong> - The modified work must itself be a software library.</li> - <li><strong>b)</strong> - You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change.</li> - - <li><strong>c)</strong> - You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License.</li> - - <li><strong>d)</strong> - If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - <p> - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.)</p></li> -</ul> - -<p> -These requirements apply to the modified work as a whole. If identifiable -sections of that work are not derived from the Library, and can be -reasonably considered independent and separate works in themselves, then -this License, and its terms, do not apply to those sections when you -distribute them as separate works. But when you distribute the same -sections as part of a whole which is a work based on the Library, the -distribution of the whole must be on the terms of this License, whose -permissions for other licensees extend to the entire whole, and thus to -each and every part regardless of who wrote it. -</p> -<p> -Thus, it is not the intent of this section to claim rights or contest your -rights to work written entirely by you; rather, the intent is to exercise -the right to control the distribution of derivative or collective works -based on the Library. -</p> -<p> -In addition, mere aggregation of another work not based on the Library with -the Library (or with a work based on the Library) on a volume of a storage -or distribution medium does not bring the other work under the scope of -this License. -</p> -<p> -<strong>3.</strong> -You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. -</p> -<p> - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. -</p> -<p> - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. -</p> -<p> -<strong>4.</strong> -You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. -</p> -<p> - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. -</p> -<p> -<strong>5.</strong> -A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. -</p> -<p> - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. -</p> -<p> - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. -</p> -<p> - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) -</p> -<p> - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. -</p> -<p> -<strong>6.</strong> -As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. -</p> -<p> - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: -</p> - -<ul> - <li><strong>a)</strong> Accompany the work with the complete - corresponding machine-readable source code for the Library - including whatever changes were used in the work (which must be - distributed under Sections 1 and 2 above); and, if the work is an - executable linked with the Library, with the complete - machine-readable "work that uses the Library", as object code - and/or source code, so that the user can modify the Library and - then relink to produce a modified executable containing the - modified Library. (It is understood that the user who changes the - contents of definitions files in the Library will not necessarily - be able to recompile the application to use the modified - definitions.)</li> - - <li><strong>b)</strong> Use a suitable shared library mechanism - for linking with the Library. A suitable mechanism is one that - (1) uses at run time a copy of the library already present on the - user's computer system, rather than copying library functions into - the executable, and (2) will operate properly with a modified - version of the library, if the user installs one, as long as the - modified version is interface-compatible with the version that the - work was made with.</li> - - <li><strong>c)</strong> Accompany the work with a written offer, - valid for at least three years, to give the same user the - materials specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution.</li> - - <li><strong>d)</strong> If distribution of the work is made by - offering access to copy from a designated place, offer equivalent - access to copy the above specified materials from the same - place.</li> - - <li><strong>e)</strong> Verify that the user has already received - a copy of these materials or that you have already sent this user - a copy.</li> -</ul> - -<p> - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. -</p> -<p> - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. -</p> -<p> -<strong>7.</strong> You may place library facilities that are a work -based on the Library side-by-side in a single library together with -other library facilities not covered by this License, and distribute -such a combined library, provided that the separate distribution of -the work based on the Library and of the other library facilities is -otherwise permitted, and provided that you do these two things: -</p> - -<ul> - <li><strong>a)</strong> Accompany the combined library with a copy - of the same work based on the Library, uncombined with any other - library facilities. This must be distributed under the terms of - the Sections above.</li> - - <li><strong>b)</strong> Give prominent notice with the combined - library of the fact that part of it is a work based on the - Library, and explaining where to find the accompanying uncombined - form of the same work.</li> -</ul> - -<p> -<strong>8.</strong> You may not copy, modify, sublicense, link with, -or distribute the Library except as expressly provided under this -License. Any attempt otherwise to copy, modify, sublicense, link -with, or distribute the Library is void, and will automatically -terminate your rights under this License. However, parties who have -received copies, or rights, from you under this License will not have -their licenses terminated so long as such parties remain in full -compliance. -</p> -<p> -<strong>9.</strong> -You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. -</p> -<p> -<strong>10.</strong> -Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. -</p> -<p> -<strong>11.</strong> -If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. -</p> -<p> -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. -</p> -<p> -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. -</p> -<p> -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. -</p> -<p> -<strong>12.</strong> -If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. -</p> -<p> -<strong>13.</strong> -The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. -</p> -<p> -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. -</p> -<p> -<strong>14.</strong> -If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. -</p> -<p> -<strong>NO WARRANTY</strong> -</p> -<p> -<strong>15.</strong> -BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -</p> -<p> -<strong>16.</strong> -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. -</p> - -<h3>END OF TERMS AND CONDITIONS</h3> - -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> -<!-- ****************************************************************************************************************************** --> - -<h2><a name="adjust">adjust-android License</a></h2> - - <p>Copyright (c) 2012-2017 adjust GmbH,<br /> - http://www.adjust.com</p> - - <p>Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions:</p> - - <p>The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software.</p> - - <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p> - -</body> + <head> + <link rel="stylesheet" type="text/css" href="style.css" /> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + </head> + <body> + <h1>Licenses</h1> + + <p> + Binaries of this product are made available to you by Mozilla under the + Mozilla Public License 2.0 (MPL). + </p> + + <p> + More specifically, most of the source code for this product is available + under the Mozilla Public License 2.0 (MPL) and Apache License 2.0. + Additional software components for this product are available under one of + a variety of other free and open source licenses. Those that require + reproduction of the license text in the distribution are given below. + (Note: your copy of this product may not contain code covered by one or + more of the licenses listed here, depending on the exact product and + version you choose.) + </p> + + <ul> + <li><a href="#mpl2">Mozilla Public License 2.0</a></li> + <li><a href="#apache2">Apache License 2.0</a></li> + <li><a href="#lgpl21">GNU Lesser General Public License 2.1</a></li> + <li><a href="#adjust">adjust-android License</a></li> + </ul> + + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + + <h2><a name="mpl2">Mozilla Public License 2.0</a></h2> + + <ul> + <li>Focus - https://github.com/mozilla-mobile/focus-android</li> + <li>Telemetry - https://github.com/mozilla-mobile/telemetry-android</li> + </ul> + + <h4>1. Definitions</h4> + <dl> + <dt>1.1. “Contributor”</dt> + <dd> + <p> + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + </p> + </dd> + <dt>1.2. “Contributor Version”</dt> + <dd> + <p> + means the combination of the Contributions of others (if any) used by + a Contributor and that particular Contributor’s Contribution. + </p> + </dd> + <dt>1.3. “Contribution”</dt> + <dd><p>means Covered Software of a particular Contributor.</p></dd> + <dt>1.4. “Covered Software”</dt> + <dd> + <p> + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code Form, + and Modifications of such Source Code Form, in each case including + portions thereof. + </p> + </dd> + <dt>1.5. “Incompatible With Secondary Licenses”</dt> + <dd> + <p>means</p> + <ol type="a"> + <li> + <p> + that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + </p> + </li> + <li> + <p> + that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + </p> + </li> + </ol> + </dd> + <dt>1.6. “Executable Form”</dt> + <dd><p>means any form of the work other than Source Code Form.</p></dd> + <dt>1.7. “Larger Work”</dt> + <dd> + <p> + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + </p> + </dd> + <dt>1.8. “License”</dt> + <dd><p>means this document.</p></dd> + <dt>1.9. “Licensable”</dt> + <dd> + <p> + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and all + of the rights conveyed by this License. + </p> + </dd> + <dt>1.10. “Modifications”</dt> + <dd> + <p>means any of the following:</p> + <ol type="a"> + <li> + <p> + any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + </p> + </li> + <li> + <p> + any new file in Source Code Form that contains any Covered + Software. + </p> + </li> + </ol> + </dd> + <dt>1.11. “Patent Claims” of a Contributor</dt> + <dd> + <p> + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + </p> + </dd> + <dt>1.12. “Secondary License”</dt> + <dd> + <p> + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those licenses. + </p> + </dd> + <dt>1.13. “Source Code Form”</dt> + <dd> + <p>means the form of the work preferred for making modifications.</p> + </dd> + <dt>1.14. “You” (or “Your”)</dt> + <dd> + <p> + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, + is controlled by, or is under common control with You. For purposes of + this definition, “control” means (a) the power, direct or indirect, to + cause the direction or management of such entity, whether by contract + or otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + </p> + </dd> + </dl> + <h4>2. License Grants and Conditions</h4> + <h3>2.1. Grants</h3> + <p> + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + </p> + <ol type="a"> + <li> + <p> + under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + </p> + </li> + <li> + <p> + under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + </p> + </li> + </ol> + <h3>2.2. Effective Date</h3> + <p> + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + </p> + <h3>2.3. Limitations on Grant Scope</h3> + <p> + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + </p> + <ol type="a"> + <li> + <p> + for any code that a Contributor has removed from Covered Software; or + </p> + </li> + <li> + <p> + for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + </p> + </li> + <li> + <p> + under Patent Claims infringed by Covered Software in the absence of + its Contributions. + </p> + </li> + </ol> + <p> + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + </p> + <h3>2.4. Subsequent Licenses</h3> + <p> + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + </p> + <h3>2.5. Representation</h3> + <p> + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + </p> + <h3>2.6. Fair Use</h3> + <p> + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + </p> + <h3>2.7. Conditions</h3> + <p> + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + </p> + <h4>3. Responsibilities</h4> + <h3>3.1. Distribution of Source Form</h3> + <p> + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source Code + Form of the Covered Software is governed by the terms of this License, and + how they can obtain a copy of this License. You may not attempt to alter + or restrict the recipients’ rights in the Source Code Form. + </p> + <h3>3.2. Distribution of Executable Form</h3> + <p>If You distribute Covered Software in Executable Form then:</p> + <ol type="a"> + <li> + <p> + such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + </p> + </li> + <li> + <p> + You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients’ rights in the Source Code Form under this License. + </p> + </li> + </ol> + <h3>3.3. Distribution of a Larger Work</h3> + <p> + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this License + permits You to additionally distribute such Covered Software under the + terms of such Secondary License(s), so that the recipient of the Larger + Work may, at their option, further distribute the Covered Software under + the terms of either this License or such Secondary License(s). + </p> + <h3>3.4. Notices</h3> + <p> + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + </p> + <h3>3.5. Application of Additional Terms</h3> + <p> + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + </p> + <h4>4. Inability to Comply Due to Statute or Regulation</h4> + <p> + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Software due to + statute, judicial order, or regulation then You must: (a) comply with the + terms of this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + </p> + <h4>5. Termination</h4> + <p> + 5.1. The rights granted under this License will terminate automatically if + You fail to comply with any of its terms. However, if You become + compliant, then the rights granted under this License from a particular + Contributor are reinstated (a) provisionally, unless and until such + Contributor explicitly and finally terminates Your grants, and (b) on an + ongoing basis, if such Contributor fails to notify You of the + non-compliance by some reasonable means prior to 60 days after You have + come back into compliance. Moreover, Your grants from a particular + Contributor are reinstated on an ongoing basis if such Contributor + notifies You of the non-compliance by some reasonable means, this is the + first time You have received notice of non-compliance with this License + from such Contributor, and You become compliant prior to 30 days after + Your receipt of the notice. + </p> + <p> + 5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section 2.1 + of this License shall terminate. + </p> + <p> + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end + user license agreements (excluding distributors and resellers) which have + been validly granted by You or Your distributors under this License prior + to termination shall survive termination. + </p> + <h4>6. Disclaimer of Warranty</h4> + <p> + <em + >Covered Software is provided under this License on an “as is” basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is + free of defects, merchantable, fit for a particular purpose or + non-infringing. The entire risk as to the quality and performance of the + Covered Software is with You. Should any Covered Software prove + defective in any respect, You (not any Contributor) assume the cost of + any necessary servicing, repair, or correction. This disclaimer of + warranty constitutes an essential part of this License. No use of any + Covered Software is authorized under this License except under this + disclaimer.</em + > + </p> + <h4>7. Limitation of Liability</h4> + <p> + <em + >Under no circumstances and under no legal theory, whether tort + (including negligence), contract, or otherwise, shall any Contributor, + or anyone who distributes Covered Software as permitted above, be liable + to You for any direct, indirect, special, incidental, or consequential + damages of any character including, without limitation, damages for lost + profits, loss of goodwill, work stoppage, computer failure or + malfunction, or any and all other commercial damages or losses, even if + such party shall have been informed of the possibility of such damages. + This limitation of liability shall not apply to liability for death or + personal injury resulting from such party’s negligence to the extent + applicable law prohibits such limitation. Some jurisdictions do not + allow the exclusion or limitation of incidental or consequential + damages, so this exclusion and limitation may not apply to You.</em + > + </p> + <h4>8. Litigation</h4> + <p> + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party’s ability to bring cross-claims or + counter-claims. + </p> + <h4>9. Miscellaneous</h4> + <p> + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides + that the language of a contract shall be construed against the drafter + shall not be used to construe this License against a Contributor. + </p> + <h4>10. Versions of the License</h4> + <h3>10.1. New Versions</h3> + <p> + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + </p> + <h3>10.2. Effect of New Versions</h3> + <p> + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + </p> + <h3>10.3. Modified Versions</h3> + <p> + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + </p> + <h3> + 10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses + </h3> + <p> + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + </p> + <h4>Exhibit A - Source Code Form License Notice</h4> + <blockquote> + <p> + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at + <a href="http://mozilla.org/MPL/2.0/" target="_blank" + >http://mozilla.org/MPL/2.0/</a + >. + </p> + </blockquote> + <p> + If it is not possible or desirable to put the notice in a particular file, + then You may include the notice in a location (such as a LICENSE file in a + relevant directory) where a recipient would be likely to look for such a + notice. + </p> + <p>You may add additional accurate notices of copyright ownership.</p> + <h4>Exhibit B - “Incompatible With Secondary Licenses” Notice</h4> + <blockquote> + <p> + This Source Code Form is “Incompatible With Secondary Licenses”, as + defined by the Mozilla Public License, v. 2.0. + </p> + </blockquote> + + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + + <h2><a name="apache2">Apache License 2.0</a></h2> + + <ul> + <li>com.android.support : animated-vector-drawable</li> + <li>org.jetbrains : annotations</li> + <li>com.android.support : appcompat-v7</li> + <li>com.android.support : cardview-v7</li> + <li>android.arch.lifecycle : common</li> + <li>android.arch.core : common</li> + <li>com.android.support : customtabs</li> + <li>com.android.support : design</li> + <li>android.arch.lifecycle : extensions</li> + <li>org.jetbrains.kotlin : kotlin-stdlib-jre7</li> + <li>org.jetbrains.kotlin : kotlin-stdlib</li> + <li>com.android.support : recyclerview-v7</li> + <li>android.arch.core : runtime</li> + <li>android.arch.lifecycle : runtime</li> + <li>com.android.support : support-annotations</li> + <li>com.android.support : support-compat</li> + <li>com.android.support : support-core-ui</li> + <li>com.android.support : support-core-utils</li> + <li>com.android.support : support-fragment</li> + <li>com.android.support : support-media-compat</li> + <li>com.android.support : support-v4</li> + <li>com.android.support :support-vector-drawable</li> + <li>com.android.support :transition</li> + </ul> + + <p> + <strong><a name="definitions">1. Definitions</a></strong + >. + </p> + <p> + "License" shall mean the terms and conditions for use, reproduction, and + distribution as defined by Sections 1 through 9 of this document. + </p> + <p> + "Licensor" shall mean the copyright owner or entity authorized by the + copyright owner that is granting the License. + </p> + <p> + "Legal Entity" shall mean the union of the acting entity and all other + entities that control, are controlled by, or are under common control with + that entity. For the purposes of this definition, "control" means (i) the + power, direct or indirect, to cause the direction or management of such + entity, whether by contract or otherwise, or (ii) ownership of fifty + percent (50%) or more of the outstanding shares, or (iii) beneficial + ownership of such entity. + </p> + <p> + "You" (or "Your") shall mean an individual or Legal Entity exercising + permissions granted by this License. + </p> + <p> + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation source, + and configuration files. + </p> + <p> + "Object" form shall mean any form resulting from mechanical transformation + or translation of a Source form, including but not limited to compiled + object code, generated documentation, and conversions to other media + types. + </p> + <p> + "Work" shall mean the work of authorship, whether in Source or Object + form, made available under the License, as indicated by a copyright notice + that is included in or attached to the work (an example is provided in the + Appendix below). + </p> + <p> + "Derivative Works" shall mean any work, whether in Source or Object form, + that is based on (or derived from) the Work and for which the editorial + revisions, annotations, elaborations, or other modifications represent, as + a whole, an original work of authorship. For the purposes of this License, + Derivative Works shall not include works that remain separable from, or + merely link (or bind by name) to the interfaces of, the Work and + Derivative Works thereof. + </p> + <p> + "Contribution" shall mean any work of authorship, including the original + version of the Work and any modifications or additions to that Work or + Derivative Works thereof, that is intentionally submitted to Licensor for + inclusion in the Work by the copyright owner or by an individual or Legal + Entity authorized to submit on behalf of the copyright owner. For the + purposes of this definition, "submitted" means any form of electronic, + verbal, or written communication sent to the Licensor or its + representatives, including but not limited to communication on electronic + mailing lists, source code control systems, and issue tracking systems + that are managed by, or on behalf of, the Licensor for the purpose of + discussing and improving the Work, but excluding communication that is + conspicuously marked or otherwise designated in writing by the copyright + owner as "Not a Contribution." + </p> + <p> + "Contributor" shall mean Licensor and any individual or Legal Entity on + behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + </p> + <p> + <strong><a name="copyright">2. Grant of Copyright License</a></strong + >. Subject to the terms and conditions of this License, each Contributor + hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable copyright license to reproduce, prepare + Derivative Works of, publicly display, publicly perform, sublicense, and + distribute the Work and such Derivative Works in Source or Object form. + </p> + <p> + <strong><a name="patent">3. Grant of Patent License</a></strong + >. Subject to the terms and conditions of this License, each Contributor + hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, + royalty-free, irrevocable (except as stated in this section) patent + license to make, have made, use, offer to sell, sell, import, and + otherwise transfer the Work, where such license applies only to those + patent claims licensable by such Contributor that are necessarily + infringed by their Contribution(s) alone or by combination of their + Contribution(s) with the Work to which such Contribution(s) was submitted. + If You institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work or a + Contribution incorporated within the Work constitutes direct or + contributory patent infringement, then any patent licenses granted to You + under this License for that Work shall terminate as of the date such + litigation is filed. + </p> + <p> + <strong><a name="redistribution">4. Redistribution</a></strong + >. You may reproduce and distribute copies of the Work or Derivative Works + thereof in any medium, with or without modifications, and in Source or + Object form, provided that You meet the following conditions: + </p> + <ol style="list-style: lower-latin"> + <li> + You must give any other recipients of the Work or Derivative Works a + copy of this License; and + </li> + + <li> + You must cause any modified files to carry prominent notices stating + that You changed the files; and + </li> + + <li> + You must retain, in the Source form of any Derivative Works that You + distribute, all copyright, patent, trademark, and attribution notices + from the Source form of the Work, excluding those notices that do not + pertain to any part of the Derivative Works; and + </li> + + <li> + If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of the + Derivative Works, in at least one of the following places: within a + NOTICE text file distributed as part of the Derivative Works; within the + Source form or documentation, if provided along with the Derivative + Works; or, within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents of the + NOTICE file are for informational purposes only and do not modify the + License. You may add Your own attribution notices within Derivative + Works that You distribute, alongside or as an addendum to the NOTICE + text from the Work, provided that such additional attribution notices + cannot be construed as modifying the License. + <br /> + <br /> + You may add Your own copyright statement to Your modifications and may + provide additional or different license terms and conditions for use, + reproduction, or distribution of Your modifications, or for any such + Derivative Works as a whole, provided Your use, reproduction, and + distribution of the Work otherwise complies with the conditions stated + in this License. + </li> + </ol> + + <p> + <strong><a name="contributions">5. Submission of Contributions</a></strong + >. Unless You explicitly state otherwise, any Contribution intentionally + submitted for inclusion in the Work by You to the Licensor shall be under + the terms and conditions of this License, without any additional terms or + conditions. Notwithstanding the above, nothing herein shall supersede or + modify the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + </p> + <p> + <strong><a name="trademarks">6. Trademarks</a></strong + >. This License does not grant permission to use the trade names, + trademarks, service marks, or product names of the Licensor, except as + required for reasonable and customary use in describing the origin of the + Work and reproducing the content of the NOTICE file. + </p> + <p> + <strong><a name="no-warranty">7. Disclaimer of Warranty</a></strong + >. Unless required by applicable law or agreed to in writing, Licensor + provides the Work (and each Contributor provides its Contributions) on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + express or implied, including, without limitation, any warranties or + conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any risks + associated with Your exercise of permissions under this License. + </p> + <p> + <strong><a name="no-liability">8. Limitation of Liability</a></strong + >. In no event and under no legal theory, whether in tort (including + negligence), contract, or otherwise, unless required by applicable law + (such as deliberate and grossly negligent acts) or agreed to in writing, + shall any Contributor be liable to You for damages, including any direct, + indirect, special, incidental, or consequential damages of any character + arising as a result of this License or out of the use or inability to use + the Work (including but not limited to damages for loss of goodwill, work + stoppage, computer failure or malfunction, or any and all other commercial + damages or losses), even if such Contributor has been advised of the + possibility of such damages. + </p> + <p> + <strong + ><a name="additional" + >9. Accepting Warranty or Additional Liability</a + ></strong + >. While redistributing the Work or Derivative Works thereof, You may + choose to offer, and charge a fee for, acceptance of support, warranty, + indemnity, or other liability obligations and/or rights consistent with + this License. However, in accepting such obligations, You may act only on + Your own behalf and on Your sole responsibility, not on behalf of any + other Contributor, and only if You agree to indemnify, defend, and hold + each Contributor harmless for any liability incurred by, or claims + asserted against, such Contributor by reason of your accepting any such + warranty or additional liability. + </p> + <p>END OF TERMS AND CONDITIONS</p> + + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + + <h2><a name="lgpl21">GNU Lesser General Public License 2.1</a></h2> + + <ul> + <li>findbugs annotations (com.google.code.findbugs:annotations)</li> + </ul> + + <h3><a id="SEC1">GNU LESSER GENERAL PUBLIC LICENSE</a></h3> + <p>Version 2.1, February 1999</p> + + <p> + Copyright (C) 1991, 1999 Free Software Foundation, Inc.<br /> + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA<br /> + Everyone is permitted to copy and distribute verbatim copies<br /> + of this license document, but changing it is not allowed. + </p> + + <p> + [This is the first released version of the Lesser GPL. It also counts<br /> + as the successor of the GNU Library Public License, version 2, hence<br /> + the version number 2.1.] + </p> + + <h3><a id="SEC2">Preamble</a></h3> + + <p> + The licenses for most software are designed to take away your freedom to + share and change it. By contrast, the GNU General Public Licenses are + intended to guarantee your freedom to share and change free software--to + make sure the software is free for all its users. + </p> + <p> + This license, the Lesser General Public License, applies to some specially + designated software packages--typically libraries--of the Free Software + Foundation and other authors who decide to use it. You can use it too, but + we suggest you first think carefully about whether this license or the + ordinary General Public License is the better strategy to use in any + particular case, based on the explanations below. + </p> + <p> + When we speak of free software, we are referring to freedom of use, not + price. Our General Public Licenses are designed to make sure that you have + the freedom to distribute copies of free software (and charge for this + service if you wish); that you receive source code or can get it if you + want it; that you can change the software and use pieces of it in new free + programs; and that you are informed that you can do these things. + </p> + <p> + To protect your rights, we need to make restrictions that forbid + distributors to deny you these rights or to ask you to surrender these + rights. These restrictions translate to certain responsibilities for you + if you distribute copies of the library or if you modify it. + </p> + <p> + For example, if you distribute copies of the library, whether gratis or + for a fee, you must give the recipients all the rights that we gave you. + You must make sure that they, too, receive or can get the source code. If + you link other code with the library, you must provide complete object + files to the recipients, so that they can relink them with the library + after making changes to the library and recompiling it. And you must show + them these terms so they know their rights. + </p> + <p> + We protect your rights with a two-step method: (1) we copyright the + library, and (2) we offer you this license, which gives you legal + permission to copy, distribute and/or modify the library. + </p> + <p> + To protect each distributor, we want to make it very clear that there is + no warranty for the free library. Also, if the library is modified by + someone else and passed on, the recipients should know that what they have + is not the original version, so that the original author's reputation will + not be affected by problems that might be introduced by others. + </p> + <p> + Finally, software patents pose a constant threat to the existence of any + free program. We wish to make sure that a company cannot effectively + restrict the users of a free program by obtaining a restrictive license + from a patent holder. Therefore, we insist that any patent license + obtained for a version of the library must be consistent with the full + freedom of use specified in this license. + </p> + <p> + Most GNU software, including some libraries, is covered by the ordinary + GNU General Public License. This license, the GNU Lesser General Public + License, applies to certain designated libraries, and is quite different + from the ordinary General Public License. We use this license for certain + libraries in order to permit linking those libraries into non-free + programs. + </p> + <p> + When a program is linked with a library, whether statically or using a + shared library, the combination of the two is legally speaking a combined + work, a derivative of the original library. The ordinary General Public + License therefore permits such linking only if the entire combination fits + its criteria of freedom. The Lesser General Public License permits more + lax criteria for linking other code with the library. + </p> + <p> + We call this license the "Lesser" General Public License because it does + Less to protect the user's freedom than the ordinary General Public + License. It also provides other free software developers Less of an + advantage over competing non-free programs. These disadvantages are the + reason we use the ordinary General Public License for many libraries. + However, the Lesser license provides advantages in certain special + circumstances. + </p> + <p> + For example, on rare occasions, there may be a special need to encourage + the widest possible use of a certain library, so that it becomes a + de-facto standard. To achieve this, non-free programs must be allowed to + use the library. A more frequent case is that a free library does the same + job as widely used non-free libraries. In this case, there is little to + gain by limiting the free library to free software only, so we use the + Lesser General Public License. + </p> + <p> + In other cases, permission to use a particular library in non-free + programs enables a greater number of people to use a large body of free + software. For example, permission to use the GNU C Library in non-free + programs enables many more people to use the whole GNU operating system, + as well as its variant, the GNU/Linux operating system. + </p> + <p> + Although the Lesser General Public License is Less protective of the + users' freedom, it does ensure that the user of a program that is linked + with the Library has the freedom and the wherewithal to run that program + using a modified version of the Library. + </p> + <p> + The precise terms and conditions for copying, distribution and + modification follow. Pay close attention to the difference between a "work + based on the library" and a "work that uses the library". The former + contains code derived from the library, whereas the latter must be + combined with the library in order to run. + </p> + + <h3> + <a id="SEC3" + >TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</a + > + </h3> + + <p> + <strong>0.</strong> + This License Agreement applies to any software library or other program + which contains a notice placed by the copyright holder or other authorized + party saying it may be distributed under the terms of this Lesser General + Public License (also called "this License"). Each licensee is addressed as + "you". + </p> + <p> + A "library" means a collection of software functions and/or data prepared + so as to be conveniently linked with application programs (which use some + of those functions and data) to form executables. + </p> + <p> + The "Library", below, refers to any such software library or work which + has been distributed under these terms. A "work based on the Library" + means either the Library or any derivative work under copyright law: that + is to say, a work containing the Library or a portion of it, either + verbatim or with modifications and/or translated straightforwardly into + another language. (Hereinafter, translation is included without limitation + in the term "modification".) + </p> + <p> + "Source code" for a work means the preferred form of the work for making + modifications to it. For a library, complete source code means all the + source code for all modules it contains, plus any associated interface + definition files, plus the scripts used to control compilation and + installation of the library. + </p> + <p> + Activities other than copying, distribution and modification are not + covered by this License; they are outside its scope. The act of running a + program using the Library is not restricted, and output from such a + program is covered only if its contents constitute a work based on the + Library (independent of the use of the Library in a tool for writing it). + Whether that is true depends on what the Library does and what the program + that uses the Library does. + </p> + <p> + <strong>1.</strong> + You may copy and distribute verbatim copies of the Library's complete + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the notices + that refer to this License and to the absence of any warranty; and + distribute a copy of this License along with the Library. + </p> + <p> + You may charge a fee for the physical act of transferring a copy, and you + may at your option offer warranty protection in exchange for a fee. + </p> + <p> + <strong>2.</strong> + You may modify your copy or copies of the Library or any portion of it, + thus forming a work based on the Library, and copy and distribute such + modifications or work under the terms of Section 1 above, provided that + you also meet all of these conditions: + </p> + + <ul> + <li> + <strong>a)</strong> The modified work must itself be a software library. + </li> + <li> + <strong>b)</strong> You must cause the files modified to carry prominent + notices stating that you changed the files and the date of any change. + </li> + + <li> + <strong>c)</strong> You must cause the whole of the work to be licensed + at no charge to all third parties under the terms of this License. + </li> + + <li> + <strong>d)</strong> + If a facility in the modified Library refers to a function or a table of + data to be supplied by an application program that uses the facility, + other than as an argument passed when the facility is invoked, then you + must make a good faith effort to ensure that, in the event an + application does not supply such function or table, the facility still + operates, and performs whatever part of its purpose remains meaningful. + <p> + (For example, a function in a library to compute square roots has a + purpose that is entirely well-defined independent of the application. + Therefore, Subsection 2d requires that any application-supplied + function or table used by this function must be optional: if the + application does not supply it, the square root function must still + compute square roots.) + </p> + </li> + </ul> + + <p> + These requirements apply to the modified work as a whole. If identifiable + sections of that work are not derived from the Library, and can be + reasonably considered independent and separate works in themselves, then + this License, and its terms, do not apply to those sections when you + distribute them as separate works. But when you distribute the same + sections as part of a whole which is a work based on the Library, the + distribution of the whole must be on the terms of this License, whose + permissions for other licensees extend to the entire whole, and thus to + each and every part regardless of who wrote it. + </p> + <p> + Thus, it is not the intent of this section to claim rights or contest your + rights to work written entirely by you; rather, the intent is to exercise + the right to control the distribution of derivative or collective works + based on the Library. + </p> + <p> + In addition, mere aggregation of another work not based on the Library + with the Library (or with a work based on the Library) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. + </p> + <p> + <strong>3.</strong> + You may opt to apply the terms of the ordinary GNU General Public License + instead of this License to a given copy of the Library. To do this, you + must alter all the notices that refer to this License, so that they refer + to the ordinary GNU General Public License, version 2, instead of to this + License. (If a newer version than version 2 of the ordinary GNU General + Public License has appeared, then you can specify that version instead if + you wish.) Do not make any other change in these notices. + </p> + <p> + Once this change is made in a given copy, it is irreversible for that + copy, so the ordinary GNU General Public License applies to all subsequent + copies and derivative works made from that copy. + </p> + <p> + This option is useful when you wish to copy part of the code of the + Library into a program that is not a library. + </p> + <p> + <strong>4.</strong> + You may copy and distribute the Library (or a portion or derivative of it, + under Section 2) in object code or executable form under the terms of + Sections 1 and 2 above provided that you accompany it with the complete + corresponding machine-readable source code, which must be distributed + under the terms of Sections 1 and 2 above on a medium customarily used for + software interchange. + </p> + <p> + If distribution of object code is made by offering access to copy from a + designated place, then offering equivalent access to copy the source code + from the same place satisfies the requirement to distribute the source + code, even though third parties are not compelled to copy the source along + with the object code. + </p> + <p> + <strong>5.</strong> + A program that contains no derivative of any portion of the Library, but + is designed to work with the Library by being compiled or linked with it, + is called a "work that uses the Library". Such a work, in isolation, is + not a derivative work of the Library, and therefore falls outside the + scope of this License. + </p> + <p> + However, linking a "work that uses the Library" with the Library creates + an executable that is a derivative of the Library (because it contains + portions of the Library), rather than a "work that uses the library". The + executable is therefore covered by this License. Section 6 states terms + for distribution of such executables. + </p> + <p> + When a "work that uses the Library" uses material from a header file that + is part of the Library, the object code for the work may be a derivative + work of the Library even though the source code is not. Whether this is + true is especially significant if the work can be linked without the + Library, or if the work is itself a library. The threshold for this to be + true is not precisely defined by law. + </p> + <p> + If such an object file uses only numerical parameters, data structure + layouts and accessors, and small macros and small inline functions (ten + lines or less in length), then the use of the object file is unrestricted, + regardless of whether it is legally a derivative work. (Executables + containing this object code plus portions of the Library will still fall + under Section 6.) + </p> + <p> + Otherwise, if the work is a derivative of the Library, you may distribute + the object code for the work under the terms of Section 6. Any executables + containing that work also fall under Section 6, whether or not they are + linked directly with the Library itself. + </p> + <p> + <strong>6.</strong> + As an exception to the Sections above, you may also combine or link a + "work that uses the Library" with the Library to produce a work containing + portions of the Library, and distribute that work under terms of your + choice, provided that the terms permit modification of the work for the + customer's own use and reverse engineering for debugging such + modifications. + </p> + <p> + You must give prominent notice with each copy of the work that the Library + is used in it and that the Library and its use are covered by this + License. You must supply a copy of this License. If the work during + execution displays copyright notices, you must include the copyright + notice for the Library among them, as well as a reference directing the + user to the copy of this License. Also, you must do one of these things: + </p> + + <ul> + <li> + <strong>a)</strong> Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever changes + were used in the work (which must be distributed under Sections 1 and 2 + above); and, if the work is an executable linked with the Library, with + the complete machine-readable "work that uses the Library", as object + code and/or source code, so that the user can modify the Library and + then relink to produce a modified executable containing the modified + Library. (It is understood that the user who changes the contents of + definitions files in the Library will not necessarily be able to + recompile the application to use the modified definitions.) + </li> + + <li> + <strong>b)</strong> Use a suitable shared library mechanism for linking + with the Library. A suitable mechanism is one that (1) uses at run time + a copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) will + operate properly with a modified version of the library, if the user + installs one, as long as the modified version is interface-compatible + with the version that the work was made with. + </li> + + <li> + <strong>c)</strong> Accompany the work with a written offer, valid for + at least three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of performing + this distribution. + </li> + + <li> + <strong>d)</strong> If distribution of the work is made by offering + access to copy from a designated place, offer equivalent access to copy + the above specified materials from the same place. + </li> + + <li> + <strong>e)</strong> Verify that the user has already received a copy of + these materials or that you have already sent this user a copy. + </li> + </ul> + + <p> + For an executable, the required form of the "work that uses the Library" + must include any data and utility programs needed for reproducing the + executable from it. However, as a special exception, the materials to be + distributed need not include anything that is normally distributed (in + either source or binary form) with the major components (compiler, kernel, + and so on) of the operating system on which the executable runs, unless + that component itself accompanies the executable. + </p> + <p> + It may happen that this requirement contradicts the license restrictions + of other proprietary libraries that do not normally accompany the + operating system. Such a contradiction means you cannot use both them and + the Library together in an executable that you distribute. + </p> + <p> + <strong>7.</strong> You may place library facilities that are a work based + on the Library side-by-side in a single library together with other + library facilities not covered by this License, and distribute such a + combined library, provided that the separate distribution of the work + based on the Library and of the other library facilities is otherwise + permitted, and provided that you do these two things: + </p> + + <ul> + <li> + <strong>a)</strong> Accompany the combined library with a copy of the + same work based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the Sections + above. + </li> + + <li> + <strong>b)</strong> Give prominent notice with the combined library of + the fact that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + </li> + </ul> + + <p> + <strong>8.</strong> You may not copy, modify, sublicense, link with, or + distribute the Library except as expressly provided under this License. + Any attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate your + rights under this License. However, parties who have received copies, or + rights, from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + </p> + <p> + <strong>9.</strong> + You are not required to accept this License, since you have not signed it. + However, nothing else grants you permission to modify or distribute the + Library or its derivative works. These actions are prohibited by law if + you do not accept this License. Therefore, by modifying or distributing + the Library (or any work based on the Library), you indicate your + acceptance of this License to do so, and all its terms and conditions for + copying, distributing or modifying the Library or works based on it. + </p> + <p> + <strong>10.</strong> + Each time you redistribute the Library (or any work based on the Library), + the recipient automatically receives a license from the original licensor + to copy, distribute, link with or modify the Library subject to these + terms and conditions. You may not impose any further restrictions on the + recipients' exercise of the rights granted herein. You are not responsible + for enforcing compliance by third parties with this License. + </p> + <p> + <strong>11.</strong> + If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent issues), + conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot distribute + so as to satisfy simultaneously your obligations under this License and + any other pertinent obligations, then as a consequence you may not + distribute the Library at all. For example, if a patent license would not + permit royalty-free redistribution of the Library by all those who receive + copies directly or indirectly through you, then the only way you could + satisfy both it and this License would be to refrain entirely from + distribution of the Library. + </p> + <p> + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply, + and the section as a whole is intended to apply in other circumstances. + </p> + <p> + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of any such + claims; this section has the sole purpose of protecting the integrity of + the free software distribution system which is implemented by public + license practices. Many people have made generous contributions to the + wide range of software distributed through that system in reliance on + consistent application of that system; it is up to the author/donor to + decide if he or she is willing to distribute software through any other + system and a licensee cannot impose that choice. + </p> + <p> + This section is intended to make thoroughly clear what is believed to be a + consequence of the rest of this License. + </p> + <p> + <strong>12.</strong> + If the distribution and/or use of the Library is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Library under this License may add an + explicit geographical distribution limitation excluding those countries, + so that distribution is permitted only in or among countries not thus + excluded. In such case, this License incorporates the limitation as if + written in the body of this License. + </p> + <p> + <strong>13.</strong> + The Free Software Foundation may publish revised and/or new versions of + the Lesser General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in detail + to address new problems or concerns. + </p> + <p> + Each version is given a distinguishing version number. If the Library + specifies a version number of this License which applies to it and "any + later version", you have the option of following the terms and conditions + either of that version or of any later version published by the Free + Software Foundation. If the Library does not specify a license version + number, you may choose any version ever published by the Free Software + Foundation. + </p> + <p> + <strong>14.</strong> + If you wish to incorporate parts of the Library into other free programs + whose distribution conditions are incompatible with these, write to the + author to ask for permission. For software which is copyrighted by the + Free Software Foundation, write to the Free Software Foundation; we + sometimes make exceptions for this. Our decision will be guided by the two + goals of preserving the free status of all derivatives of our free + software and of promoting the sharing and reuse of software generally. + </p> + <p> + <strong>NO WARRANTY</strong> + </p> + <p> + <strong>15.</strong> + BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR + THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN + OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES + PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED + OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS + TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE + LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, + REPAIR OR CORRECTION. + </p> + <p> + <strong>16.</strong> + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL + ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR + REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, + INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT + LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES + SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE + WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + </p> + + <h3>END OF TERMS AND CONDITIONS</h3> + + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + <!-- ****************************************************************************************************************************** --> + + <h2><a name="adjust">adjust-android License</a></h2> + + <p> + Copyright (c) 2012-2017 adjust GmbH,<br /> + http://www.adjust.com + </p> + + <p> + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + </p> + + <p> + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + </p> + + <p> + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + </p> + </body> </html> diff --git a/mobile/android/focus-android/app/src/main/res/raw/rights.html b/mobile/android/focus-android/app/src/main/res/raw/rights.html index c34c1c5d11..73028929ea 100644 --- a/mobile/android/focus-android/app/src/main/res/raw/rights.html +++ b/mobile/android/focus-android/app/src/main/res/raw/rights.html @@ -1,56 +1,62 @@ -<!doctype html> +<!DOCTYPE html> <!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this file, - You can obtain one at http://mozilla.org/MPL/2.0/. --> <head> -<meta name="viewport" charset="utf-8" content="width=device-width, initial-scale=1"><style> - body, html { - background: #221F1F; - color: #FFFFFF; - font-family: sans-serif; - line-height: 24px; - font-size: 14px; + <meta + name="viewport" + charset="utf-8" + content="width=device-width, initial-scale=1" + /> + <style> + body, + html { + background: #221f1f; + color: #ffffff; + font-family: sans-serif; + line-height: 24px; + font-size: 14px; } - body{ - padding-left: 24px; - padding-right: 24px; - margin-left: 0px; - margin-right: 0px; + body { + padding-left: 24px; + padding-right: 24px; + margin-left: 0px; + margin-right: 0px; } a { - color: #0A9AF4; + color: #0a9af4; } /* Make only about page links ("learn more") white */ .about a { - color: #FFFFFF; + color: #ffffff; } p.subtitle { - text-align: center; - opacity: .7; - margin: 0; + text-align: center; + opacity: 0.7; + margin: 0; } img#wordmark { - /* We need to set the dp size here, because by default webview assumes the image is not + /* We need to set the dp size here, because by default webview assumes the image is not density specific (but since it's an android resource, we get a density specific version). */ - width: 180px; - display: block; - margin-left: auto; - margin-right: auto; - padding-top: 24px; + width: 180px; + display: block; + margin-left: auto; + margin-right: auto; + padding-top: 24px; } -</style> + </style> </head> <html> -<body dir="%dir%"> + <body dir="%dir%"> <p id="first">%your-rights-content1%</p> <p>%your-rights-content2%</p> <p>%your-rights-content3%</p> <p>%your-rights-content4%</p> <p>%your-rights-content5%</p> -</body> + </body> </html> diff --git a/mobile/android/focus-android/app/src/main/res/values-quc/strings.xml b/mobile/android/focus-android/app/src/main/res/values-quc/strings.xml index 9d72cf1542..b9f2b886ac 100644 --- a/mobile/android/focus-android/app/src/main/res/values-quc/strings.xml +++ b/mobile/android/focus-android/app/src/main/res/values-quc/strings.xml @@ -84,10 +84,13 @@ sharing an URL. --> <string name="share_dialog_title">Ukomone\'xik pa</string> - <!-- While a browsing session is active (in the foreground or background) we will show a notification - so that the user doesn't forget about the website still being open. This text is shown in - the notification. Clicking the notification will have the same effect as clicking the "erase" - button in the application. --> + <string name="notification_erase_title_android_14">Kayuj ucholajil b\'anoj rech nik\'onel?</string> + <string name="notification_erase_text_android_14" moz:RemovedIn="124" tools:ignore="UnusedResources">Chachapa\' on chachupu\' we ub\'ixikil are chi man k\'o ta uk\'axk\'olil chi rij uyujik ucholajil b\'anoj.</string> + + <!-- Text shown in the notification description that pops up to remind the user that a browsing session is active + for Android 14+. --> + <string name="notification_erase_text_android_14_1">Chachapa\' on chajililej we ub\'ixikil are chi man k\'o ta uk\'axk\'olil chi rij uyujik ucholajil b\'anoj.</string> + <string name="notification_erase_text">Uchupik nik\'ob\'al rech b\'antal kanoq</string> <!-- Notification action to open Focus and resume the current browsing session. --> @@ -365,6 +368,9 @@ <!-- Header for the list of installed search engines --> <string name="preference_search_installed_search_engines">Jeqeb\'am taq ch\'ich\' rech tzukunem</string> + <!-- Header for the list of installed search engines --> + <string name="preference_choose_search_engine">Chacha\' ch\'ich\' rech tzukub\'al</string> + <!-- Action for restoring the default list of search engines --> <string name="preference_search_restore">Utzalijisaxik taq ch\'ich\' rech tzukunem ya\'om chi uloq\n</string> @@ -691,6 +697,48 @@ <!-- Preference for site permissions --> <string name="preference_site_permissions">Taq ya‘b‘al b‘e rech k‘olib‘al</string> + <!-- Preference for cookie banner. The name of the item from settings screen and the title of the cookie banner screen. --> + <string name="preferences_cookie_banner">Unitz\'arisaxik ub\'ixikil rech kuki</string> + + <!-- Preference summary for the cookie banner. If the cookie banner option is not disabled. --> + <string name="preferences_cookie_banner_summary_on">Utzijik</string> + + <!-- Preference summary for the cookie banner. If the cookie banner option is disabled. --> + <string name="preferences_cookie_banner_summary_off">Uchupik</string> + + <!-- Title preference inside Cookie banner reduction screen. Here you can set the cookie banner option to disabled or reject_all. --> + <string name="cookie_banner_reject_all_option_title">Unitz\'arisaxik ub\'ixikil rech kuki</string> + + <!-- Preference summary inside Cookie banner reduction screen. Here you can set the cookie banner option to disabled or reject_all. --> + <string name="cookie_banner_reject_all_option_summary">Are chi man k\'i ta ub\'ixikil kawilo ruk\' retzelaxik le taq tz\'onoj rech taq kuki.</string> + + <!-- Preference for removing cookie/consent banners from sites automatically, this is shown as part of the protections panel with the tracking protection toggle. -->--> + <string name="cookie_banner_exception_item_title">Unitz\'arisaxik ub\'ixikil rech kuki</string> + + <!-- Text for indicating cookie banner handling is on this site, this is shown as part of the protections panel with the tracking protection toggle. --> + <string name="cookie_banner_exception_item_description_state_on">ON pa we uk\'olib\'al web\'</string> + + <!-- Text for indicating cookie reducer is not supported on the current site, this is shown as part of the protections panel with the tracking protection toggle. --> + <string name="cookie_banner_exception_site_not_supported">Man toq\'am ta chi le uk\'olib\'al web\' </string> + + <!-- Text for indicating cookie banner handling is off this site, this is shown as part of the protections panel with the tracking protection toggle. --> + <string name="cookie_banner_exception_item_description_state_off">CHUPUM chech we uk\'olib\'al web\'</string> + + <!-- Preference for removing cookie/consent banners from sites automatically, this is shown when the user enters in details after he clicks on the item from protection panel. --> + <string name="cookie_banner_exception_panel_switch_title">Unitz\'arisaxik ub\'ixikil rech kuki</string> + + <!-- Text for indicating cookie banner handling is off this site, this is shown when the user enters in details after he clicks on the item from protection panel. --> + <string name="cookie_banner_exception_panel_switch_state_off">CHUPUM chech we uk\'olib\'al web\'</string> + + <!-- Text for indicating cookie banner handling is on this site, this is shown when the user enters in details after he clicks on the item from protection panel. --> + <string name="cookie_banner_exception_panel_switch_state_on">TZIJOM pa we uk\'olib\'al web\'</string> + + <!-- Title text for a detail explanation indicating cookie banner handling is on this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site. --> + <string name="cookie_banner_exception_panel_title_state_on_for_site">Utzijik unitz\'arisaxik ub\'ixikil rech taq kuki chech %1$s?</string> + + <!-- Title text for a detail explanation indicating cookie banner handling is off this site, this is shown as part of the cookie banner panel in the toolbar. The first parameter is a shortened URL of the current site. --> + <string name="cookie_banner_exception_panel_title_state_off_for_site">Uchupik unitz\'arisaxik ub\'ixikil rech taq kuki chech %1$s?</string> + <!-- Label used for the "NO button" for the prompt to enable search suggestions --> <string name="enable_search_suggestions_no">Ja\'i\'</string> diff --git a/mobile/android/focus-android/app/src/main/res/values-su/strings.xml b/mobile/android/focus-android/app/src/main/res/values-su/strings.xml index dad5f7fdd4..3a5d546d6d 100644 --- a/mobile/android/focus-android/app/src/main/res/values-su/strings.xml +++ b/mobile/android/focus-android/app/src/main/res/values-su/strings.xml @@ -713,7 +713,7 @@ <string name="cookie_banner_reject_all_option_summary">Kurangan spanduk ku otomatis nolak rekés réréméh, lamun bisa.</string> <!-- Preference for removing cookie/consent banners from sites automatically, this is shown as part of the protections panel with the tracking protection toggle. -->--> - <string name="cookie_banner_exception_item_title">Kurangan Spanduk Réréméh</string> + <string name="cookie_banner_exception_item_title">Reduksi Spanduk Réréméh</string> <!-- Text for indicating cookie banner handling is on this site, this is shown as part of the protections panel with the tracking protection toggle. --> <string name="cookie_banner_exception_item_description_state_on">Hurungkeun jang ieu loka</string> @@ -725,7 +725,7 @@ <string name="cookie_banner_exception_item_description_state_off">Pareum jang ieu loka</string> <!-- Preference for removing cookie/consent banners from sites automatically, this is shown when the user enters in details after he clicks on the item from protection panel. --> - <string name="cookie_banner_exception_panel_switch_title">Kurangan Spanduk Réréméh</string> + <string name="cookie_banner_exception_panel_switch_title">Reduksi Spanduk Réréméh</string> <!-- Text for indicating cookie banner handling is off this site, this is shown when the user enters in details after he clicks on the item from protection panel. --> <string name="cookie_banner_exception_panel_switch_state_off">Pareum jang ieu loka</string> diff --git a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/TestFocusApplication.kt b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/TestFocusApplication.kt index 7892c347b6..94f2410913 100644 --- a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/TestFocusApplication.kt +++ b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/TestFocusApplication.kt @@ -32,6 +32,10 @@ class TestFocusApplication : FocusApplication() { } override fun initializeNimbus() = Unit + override fun initializeTelemetry() = Unit + override fun finishSetupMegazord() = Unit + + override fun initializeWebExtensionSupport() = Unit } /** @@ -50,6 +54,13 @@ class FakeEngine : Engine { override val version: EngineVersion get() = throw NotImplementedError("Not needed for test") + override fun isTranslationsEngineSupported( + onSuccess: (Boolean) -> Unit, + onError: (Throwable) -> Unit, + ) { + // do nothing + } + override fun createView(context: Context, attrs: AttributeSet?): EngineView = throw UnsupportedOperationException() diff --git a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/browser/integration/FullScreenIntegrationTest.kt b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/browser/integration/FullScreenIntegrationTest.kt index 3f9d9270c4..69b7a031b4 100644 --- a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/browser/integration/FullScreenIntegrationTest.kt +++ b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/browser/integration/FullScreenIntegrationTest.kt @@ -8,7 +8,9 @@ import android.app.Activity import android.content.res.Resources import android.view.View import android.view.Window +import android.view.WindowInsetsController import android.view.WindowManager +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import mozilla.components.browser.engine.gecko.GeckoEngineView import mozilla.components.browser.toolbar.BrowserToolbar @@ -33,6 +35,7 @@ import org.mozilla.focus.ext.showAsFixed import org.mozilla.focus.utils.Settings import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) internal class FullScreenIntegrationTest { @@ -128,7 +131,8 @@ internal class FullScreenIntegrationTest { @Test @Suppress("DEPRECATION") - fun `WHEN entering immersive mode THEN hide all system bars`() { + @Config(sdk = [28]) + fun `WHEN entering immersive mode THEN hide all system bars in SDK 28`() { val decorView: View = mock() val activityWindow: Window = mock() val activity: Activity = mock() @@ -159,8 +163,50 @@ internal class FullScreenIntegrationTest { } @Test + fun `WHEN entering immersive mode THEN hide all system bars`() { + val decorView: View = mock() + val activityWindow: Window = mock() + val activity: Activity = mock() + val layoutParams = WindowManager.LayoutParams() + val insetsController: WindowInsetsController = mock() + + doReturn(activityWindow).`when`(activity).window + doReturn(decorView).`when`(activityWindow).decorView + doReturn(layoutParams).`when`(activityWindow).attributes + doReturn(insetsController).`when`(activityWindow).insetsController + + val integration = FullScreenIntegration( + activity, + mock(), + null, + mock(), + mock(), + mock(), + mock(), + mock(), + mock(), + ) + + integration.switchToImmersiveMode() + + // verify hiding system bars + verify(insetsController).hide(WindowInsetsCompat.Type.systemBars()) + + verify(activityWindow).setFlags( + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, + ) + + assertEquals( + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, + layoutParams.layoutInDisplayCutoutMode, + ) + } + + @Test @Suppress("DEPRECATION") - fun `GIVEN immersive mode WHEN exitImmersiveModeIfNeeded is called THEN show the system bars`() { + @Config(sdk = [28]) + fun `GIVEN immersive mode WHEN exitImmersiveModeIfNeeded is called THEN show the system bars on SDK 28`() { val decorView: View = mock() val activityWindow: Window = mock() val activity: Activity = mock() @@ -189,6 +235,43 @@ internal class FullScreenIntegrationTest { } @Test + fun `GIVEN immersive mode WHEN exitImmersiveModeIfNeeded is called THEN show the system bars`() { + val decorView: View = mock() + val activityWindow: Window = mock() + val activity: Activity = mock() + val layoutParams = WindowManager.LayoutParams() + val insetsController: WindowInsetsController = mock() + + doReturn(activityWindow).`when`(activity).window + doReturn(decorView).`when`(activityWindow).decorView + doReturn(layoutParams).`when`(activityWindow).attributes + doReturn(insetsController).`when`(activityWindow).insetsController + + val integration = FullScreenIntegration( + activity, + mock(), + null, + mock(), + mock(), + mock(), + mock(), + mock(), + mock(), + ) + + integration.exitImmersiveMode() + + verify(insetsController).show(WindowInsetsCompat.Type.systemBars()) + verify(decorView).setOnApplyWindowInsetsListener(null) + verify(activityWindow).clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) + + assertEquals( + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT, + layoutParams.layoutInDisplayCutoutMode, + ) + } + + @Test fun `GIVEN a11y is enabled WHEN enterBrowserFullscreen THEN hide the toolbar`() { val toolbar: BrowserToolbar = mock() val engineView: GeckoEngineView = mock() @@ -335,7 +418,8 @@ internal class FullScreenIntegrationTest { } @Test - fun `WHEN exiting fullscreen THEN put browser in fullscreen, hide system bars and enter immersive mode`() { + @Config(sdk = [28]) + fun `WHEN exiting fullscreen THEN put browser in fullscreen, hide system bars and enter immersive mode in SDK 28`() { val toolbar: BrowserToolbar = mock() val engineView: GeckoEngineView = mock() doReturn(mock<View>()).`when`(engineView).asView() @@ -371,4 +455,48 @@ internal class FullScreenIntegrationTest { verify(integration).exitImmersiveMode() verify(statusBar).isVisible = true } + + @Test + fun `WHEN exiting fullscreen THEN put browser in fullscreen, hide system bars and enter immersive mode in`() { + val toolbar: BrowserToolbar = mock() + val engineView: GeckoEngineView = mock() + doReturn(mock<View>()).`when`(engineView).asView() + + val settings: Settings = mock() + doReturn(false).`when`(settings).isAccessibilityEnabled() + + val resources: Resources = mock() + val activityWindow: Window = mock() + val decorView: View = mock() + val windowAttributes = WindowManager.LayoutParams() + val activity: Activity = mock() + val insetsController: WindowInsetsController = mock() + + doReturn(activityWindow).`when`(activity).window + doReturn(decorView).`when`(activityWindow).decorView + doReturn(windowAttributes).`when`(activityWindow).attributes + doReturn(resources).`when`(activity).resources + doReturn(insetsController).`when`(activityWindow).insetsController + + val statusBar: View = mock() + val integration = spy( + FullScreenIntegration( + activity, + mock(), + null, + mock(), + settings, + toolbar, + statusBar, + engineView, + mock(), + ), + ) + + integration.fullScreenChanged(false) + + verify(integration).exitBrowserFullscreen() + verify(integration).exitImmersiveMode() + verify(statusBar).isVisible = true + } } diff --git a/mobile/android/focus-android/app/src/test/resources/robolectric.properties b/mobile/android/focus-android/app/src/test/resources/robolectric.properties index 4359826c57..05f43c0edf 100644 --- a/mobile/android/focus-android/app/src/test/resources/robolectric.properties +++ b/mobile/android/focus-android/app/src/test/resources/robolectric.properties @@ -1,3 +1 @@ -# Needed until Robolectric supports SDK 29+ -sdk=28 application=org.mozilla.focus.EmptyFocusApplication diff --git a/mobile/android/focus-android/gradle/wrapper/gradle-wrapper.properties b/mobile/android/focus-android/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f..23e87f9b0b 100644 --- a/mobile/android/focus-android/gradle/wrapper/gradle-wrapper.properties +++ b/mobile/android/focus-android/gradle/wrapper/gradle-wrapper.properties @@ -1,3 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip diff --git a/mobile/android/focus-android/plugins/focusdependencies/src/main/java/FocusDependenciesPlugin.kt b/mobile/android/focus-android/plugins/focusdependencies/src/main/java/FocusDependenciesPlugin.kt index ecc69fe4f1..4e7483969f 100644 --- a/mobile/android/focus-android/plugins/focusdependencies/src/main/java/FocusDependenciesPlugin.kt +++ b/mobile/android/focus-android/plugins/focusdependencies/src/main/java/FocusDependenciesPlugin.kt @@ -21,7 +21,7 @@ object FocusVersions { object AndroidX { const val constraint_layout_compose = "1.0.1" const val splashscreen = "1.0.1" - const val transition = "1.4.1" + const val transition = "1.5.0" } object Google { diff --git a/mobile/android/focus-android/settings.gradle b/mobile/android/focus-android/settings.gradle index 0f5151cfe6..9db906b61f 100644 --- a/mobile/android/focus-android/settings.gradle +++ b/mobile/android/focus-android/settings.gradle @@ -31,6 +31,7 @@ plugins { ext.topsrcdir = rootProject.projectDir.absolutePath.minus("mobile/android/focus-android") apply from: file('../shared-settings.gradle') +apply from: file('../autopublish-settings.gradle') include ':app' @@ -47,90 +48,16 @@ gradle.projectsLoaded { -> } } } - - def appServicesSrcDir = null - if (gradle.hasProperty('localProperties.autoPublish.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.autoPublish.application-services.dir') - } else if (gradle.hasProperty('localProperties.branchBuild.application-services.dir')) { - appServicesSrcDir = gradle.getProperty('localProperties.branchBuild.application-services.dir') - } - if (appServicesSrcDir) { - if (appServicesSrcDir.startsWith("/")) { - apply from: "${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } else { - apply from: "${rootProject.projectDir}/${appServicesSrcDir}/build-scripts/substitute-local-appservices.gradle" - } - } } } -def log(message) { - logger.lifecycle("[settings] ${message}") -} - -def runCmd(cmd, workingDir, successMessage, captureStdout=true) { - def proc = cmd.execute(null, new File(workingDir)) - def standardOutput = captureStdout ? new ByteArrayOutputStream() : System.out - proc.consumeProcessOutput(standardOutput, System.err) - proc.waitFor() - - if (proc.exitValue() != 0) { - throw new GradleException("Process '${cmd}' finished with non-zero exit value ${proc.exitValue()}"); - } else { - log(successMessage) +def projectLocalProperties = file("local.properties").with { localPropertiesFile -> + def localProperties = new Properties() + if (localPropertiesFile.canRead()) { + localPropertiesFile.withInputStream { localProperties.load(it) } } - return captureStdout ? standardOutput : null -} - -////////////////////////////////////////////////////////////////////////// -// Local development enhancements -////////////////////////////////////////////////////////////////////////// - -Properties localProperties = null -String settingAppServicesPath = "autoPublish.application-services.dir" -String settingGleanPath = "autoPublish.glean.dir" - -if (file('local.properties').canRead()) { - localProperties = new Properties() - localProperties.load(file('local.properties').newDataInputStream()) - log('Loaded local.properties') -} else { - log('Missing local.properties; see https://github.com/mozilla-mobile/focus-android#localproperties-helpers for instructions.') + localProperties } - -if (localProperties != null) { - localProperties.each { prop -> - gradle.ext.set("localProperties.${prop.key}", prop.value) - } - - String appServicesLocalPath = localProperties.getProperty(settingAppServicesPath) - - if (appServicesLocalPath != null) { - log("Enabling automatic publication of application-services from: $appServicesLocalPath") - // Windows can't execute .py files directly, so we assume a "manually installed" python, - // which comes with a "py" launcher and respects the shebang line to specify the version. - def publishAppServicesCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishAppServicesCmd << "py"; - } - publishAppServicesCmd << "./automation/publish_to_maven_local_if_modified.py"; - runCmd(publishAppServicesCmd, appServicesLocalPath, "Published application-services for local development.", false) - } else { - log("Disabled auto-publication of application-services. Enable it by settings '$settingAppServicesPath' in local.properties") - } - - String gleanLocalPath = localProperties.getProperty(settingGleanPath) - - if (gleanLocalPath != null) { - log("Enabling automatic publication of Glean from: $gleanLocalPath") - // As above, hacks to execute .py files on Windows. - def publishGleanCmd = []; - if (System.properties['os.name'].toLowerCase().contains('windows')) { - publishGleanCmd << "py"; - } - publishGleanCmd << "./build-scripts/publish_to_maven_local_if_modified.py"; - runCmd(publishGleanCmd, gleanLocalPath, "Published Glean for local development.", false) - } else { - log("Disabled auto-publication of Glean. Enable it by settings '$settingGleanPath' in local.properties") - } +projectLocalProperties.each { prop -> + gradle.ext."localProperties.${prop.key}" = prop.value } diff --git a/mobile/android/geckoview/api.txt b/mobile/android/geckoview/api.txt index 658677a509..57c4d18d56 100644 --- a/mobile/android/geckoview/api.txt +++ b/mobile/android/geckoview/api.txt @@ -102,7 +102,6 @@ import org.mozilla.geckoview.OverscrollEdgeEffect; import org.mozilla.geckoview.PanZoomController; import org.mozilla.geckoview.ProfilerController; import org.mozilla.geckoview.RuntimeSettings; -import org.mozilla.geckoview.RuntimeTelemetry; import org.mozilla.geckoview.ScreenLength; import org.mozilla.geckoview.SessionAccessibility; import org.mozilla.geckoview.SessionFinder; @@ -886,7 +885,6 @@ package org.mozilla.geckoview { method public boolean getRemoteDebuggingEnabled(); method @Nullable public GeckoRuntime getRuntime(); method @Nullable public Rect getScreenSizeOverride(); - method @Nullable public RuntimeTelemetry.Delegate getTelemetryDelegate(); method public boolean getTranslationsOfferPopup(); method @NonNull public String getTrustedRecursiveResolverUri(); method public int getTrustedRecusiveResolverMode(); @@ -969,7 +967,6 @@ package org.mozilla.geckoview { method @NonNull public GeckoRuntimeSettings.Builder preferredColorScheme(int); method @NonNull public GeckoRuntimeSettings.Builder remoteDebuggingEnabled(boolean); method @NonNull public GeckoRuntimeSettings.Builder screenSizeOverride(int, int); - method @Deprecated @DeprecationSchedule(id="geckoview-gvst",version=127) @NonNull public GeckoRuntimeSettings.Builder telemetryDelegate(@NonNull RuntimeTelemetry.Delegate); method @NonNull public GeckoRuntimeSettings.Builder translationsOfferPopup(boolean); method @NonNull public GeckoRuntimeSettings.Builder trustedRecursiveResolverMode(int); method @NonNull public GeckoRuntimeSettings.Builder trustedRecursiveResolverUri(@NonNull String); @@ -1081,6 +1078,7 @@ package org.mozilla.geckoview { field public static final int FINDER_DISPLAY_DRAW_LINK_OUTLINE = 4; field public static final int FINDER_DISPLAY_HIGHLIGHT_ALL = 1; field public static final int FINDER_FIND_BACKWARDS = 1; + field public static final int FINDER_FIND_FORWARD = 0; field public static final int FINDER_FIND_LINKS_ONLY = 8; field public static final int FINDER_FIND_MATCH_CASE = 2; field public static final int FINDER_FIND_WHOLE_WORD = 4; @@ -2168,28 +2166,6 @@ package org.mozilla.geckoview { method @AnyThread @NonNull protected abstract Settings newSettings(@Nullable Settings); } - public final class RuntimeTelemetry { - ctor protected RuntimeTelemetry(); - } - - public static interface RuntimeTelemetry.Delegate { - method @AnyThread default public void onBooleanScalar(@NonNull RuntimeTelemetry.Metric<Boolean>); - method @AnyThread default public void onHistogram(@NonNull RuntimeTelemetry.Histogram); - method @AnyThread default public void onLongScalar(@NonNull RuntimeTelemetry.Metric<Long>); - method @AnyThread default public void onStringScalar(@NonNull RuntimeTelemetry.Metric<String>); - } - - public static class RuntimeTelemetry.Histogram extends RuntimeTelemetry.Metric<long[]> { - ctor protected Histogram(); - field public final boolean isCategorical; - } - - public static class RuntimeTelemetry.Metric<T> { - ctor protected Metric(); - field @NonNull public final String name; - field @NonNull public final T value; - } - public class ScreenLength { method @AnyThread @NonNull public static ScreenLength bottom(); method @AnyThread @NonNull public static ScreenLength fromPixels(double); @@ -2396,9 +2372,11 @@ package org.mozilla.geckoview { } public static class TranslationsController.SessionTranslation.TranslationState { - ctor public TranslationState(@Nullable TranslationsController.SessionTranslation.TranslationPair, @Nullable String, @Nullable TranslationsController.SessionTranslation.DetectedLanguages, @NonNull Boolean); + ctor @Deprecated @DeprecationSchedule(version=130,id="translation-state-deprecated-constructor") public TranslationState(@Nullable TranslationsController.SessionTranslation.TranslationPair, @Nullable String, @Nullable TranslationsController.SessionTranslation.DetectedLanguages, @NonNull Boolean); + ctor public TranslationState(@Nullable TranslationsController.SessionTranslation.TranslationPair, @Nullable String, @Nullable TranslationsController.SessionTranslation.DetectedLanguages, @NonNull Boolean, @NonNull Boolean); field @Nullable public final TranslationsController.SessionTranslation.DetectedLanguages detectedLanguages; field @Nullable public final String error; + field @NonNull public final Boolean hasVisibleChange; field @NonNull public final Boolean isEngineReady; field @Nullable public final TranslationsController.SessionTranslation.TranslationPair requestedTranslationPair; } @@ -2792,6 +2770,7 @@ package org.mozilla.geckoview { method @UiThread default public void onInstallationFailed(@Nullable WebExtension, @NonNull WebExtension.InstallException); method @UiThread default public void onInstalled(@NonNull WebExtension); method @UiThread default public void onInstalling(@NonNull WebExtension); + method @UiThread default public void onOptionalPermissionsChanged(@NonNull WebExtension); method @UiThread default public void onReady(@NonNull WebExtension); method @UiThread default public void onUninstalled(@NonNull WebExtension); method @UiThread default public void onUninstalling(@NonNull WebExtension); diff --git a/mobile/android/geckoview/build.gradle b/mobile/android/geckoview/build.gradle index 040cd2fea8..8a8ba698ec 100644 --- a/mobile/android/geckoview/build.gradle +++ b/mobile/android/geckoview/build.gradle @@ -229,6 +229,8 @@ configurations { dependencies { implementation ComponentsDependencies.androidx_annotation + implementation ComponentsDependencies.androidx_collection + implementation ComponentsDependencies.androidx_core implementation "com.google.android.gms:play-services-fido:20.0.1" implementation "org.yaml:snakeyaml:2.2" @@ -384,20 +386,6 @@ android.libraryVariants.all { variant -> } } -android.libraryVariants.all { variant -> - // At this point, the Android-Gradle plugin has created all the Android - // tasks and configurations. This is the time for us to declare additional - // Glean files to package into AAR files. This packs `metrics.yaml` in the - // root of the AAR, sibling to `AndroidManifest.xml` and `classes.jar`. By - // default, consumers of the AAR will ignore this file, but consumers that - // look for it can find it (provided GeckoView is a `module()` dependency - // and not a `project()` dependency.) Under the hood this uses that the - // task provided by `packageLibraryProvider` task is a Maven `Zip` task, - // and we can simply extend its inputs. See - // https://android.googlesource.com/platform/tools/base/+/0cbe8846f7d02c0bb6f07156b9f4fde16d96d329/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/BundleAar.kt#94. - variant.packageLibraryProvider.get().from("${topsrcdir}/toolkit/components/telemetry/geckoview/streaming/metrics.yaml") -} - apply plugin: 'maven-publish' version = getVersionNumber() diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-all-urls/manifest.json b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-all-urls/manifest.json new file mode 100644 index 0000000000..c1c8fd9caa --- /dev/null +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/optional-permission-all-urls/manifest.json @@ -0,0 +1,13 @@ +{ + "manifest_version": 3, + "name": "optional-permission-all-urls", + "browser_specific_settings": { + "gecko": { + "id": "optional-permission-all-urls@example.com" + } + }, + "version": "1.0", + "description": "Request optional extension origins for all urls.", + "optional_permissions": ["geolocation", "activeTab"], + "host_permissions": ["http://*/", "https://*/", "file://*/*"] +} diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt index 2ec305f913..06b946ba3d 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoSessionTestRuleTest.kt @@ -2029,9 +2029,6 @@ class GeckoSessionTestRuleTest : BaseSessionTest(noErrorCollector = true) { @IgnoreCrash @Test fun contentCrashIgnored() { - // TODO: Bug 1673953 - assumeThat(sessionRule.env.isFission, equalTo(false)) - // TODO: bug 1710940 assumeThat(sessionRule.env.isIsolatedProcess, equalTo(false)) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoViewTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoViewTest.kt index 82af2c6475..c2ecb652a2 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoViewTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/GeckoViewTest.kt @@ -11,7 +11,6 @@ import android.view.View import android.view.ViewStructure import android.view.autofill.AutofillId import android.view.autofill.AutofillValue -import androidx.core.view.ViewCompat import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest @@ -79,7 +78,7 @@ class GeckoViewTest : BaseSessionTest() { activityRule.scenario.onActivity { assertThat( "View should be attached", - ViewCompat.isAttachedToWindow(it.view), + it.view.isAttachedToWindow(), equalTo(true), ) it.view.session!!.acquireDisplay() diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt index f3141c661c..301995c95c 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ScreenshotTest.kt @@ -12,7 +12,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import androidx.test.platform.app.InstrumentationRegistry import org.hamcrest.Matchers.* // ktlint-disable no-wildcard-imports -import org.junit.Assert +import org.junit.Assert.* import org.junit.Assume.assumeThat import org.junit.Test import org.junit.runner.RunWith @@ -25,6 +25,7 @@ import org.mozilla.geckoview.GeckoSession.ContentDelegate import org.mozilla.geckoview.GeckoSession.ProgressDelegate import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.WithDisplay +import org.mozilla.geckoview.test.util.UiThreadUtils import java.lang.IllegalStateException import kotlin.math.absoluteValue import kotlin.math.max @@ -142,6 +143,27 @@ class ScreenshotTest : BaseSessionTest() { } } + @WithDisplay(height = SCREEN_HEIGHT, width = SCREEN_WIDTH) + @Test + fun capturePixelsFailsWhenCompositorNotReady() { + sessionRule.display?.let { display -> + mainSession.close() + var exceptionListenerCalled = false + val result = display.capturePixels() + result.exceptionally { error: Throwable -> + assertTrue(error is IllegalStateException) + exceptionListenerCalled = true + result + }.accept { + fail("screenshot shouldn't complete successfully after session is closed") + } + UiThreadUtils.waitForCondition( + { exceptionListenerCalled }, + sessionRule.env.defaultTimeoutMillis, + ) + } ?: run { fail("no display found") } + } + // This tests tries to catch problems like Bug 1644561. @WithDisplay(height = SCREEN_HEIGHT, width = SCREEN_WIDTH) @Test @@ -430,7 +452,7 @@ class ScreenshotTest : BaseSessionTest() { .capture() .exceptionally( OnExceptionListener<Throwable> { error: Throwable -> - Assert.assertTrue(error is OutOfMemoryError) + assertTrue(error is OutOfMemoryError) fromException(error) }, ) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TelemetryTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TelemetryTest.kt deleted file mode 100644 index 42286c47a7..0000000000 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TelemetryTest.kt +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- - * Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -package org.mozilla.geckoview.test - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.MediumTest -import org.hamcrest.CoreMatchers.equalTo -import org.hamcrest.Matchers.* // ktlint-disable no-wildcard-imports -import org.junit.Test -import org.junit.runner.RunWith -import org.mozilla.geckoview.GeckoResult -import org.mozilla.geckoview.RuntimeTelemetry -import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled - -@RunWith(AndroidJUnit4::class) -@MediumTest -class TelemetryTest : BaseSessionTest() { - @Test - fun testOnTelemetryReceived() { - // Let's make sure we batch the telemetry calls. - sessionRule.setPrefsUntilTestEnd( - mapOf("toolkit.telemetry.geckoview.batchDurationMS" to 100000), - ) - - val expectedHistograms = listOf<Long>(401, 12, 1, 109, 2000) - val receivedHistograms = mutableListOf<Long>() - val histogram = GeckoResult<Void>() - val stringScalar = GeckoResult<Void>() - val booleanScalar = GeckoResult<Void>() - val longScalar = GeckoResult<Void>() - - sessionRule.addExternalDelegateUntilTestEnd( - RuntimeTelemetry.Delegate::class, - sessionRule::setTelemetryDelegate, - { sessionRule.setTelemetryDelegate(null) }, - object : RuntimeTelemetry.Delegate { - @AssertCalled - override fun onHistogram(metric: RuntimeTelemetry.Histogram) { - if (metric.name != "TELEMETRY_TEST_STREAMING") { - return - } - - assertThat( - "The histogram should not be categorical", - metric.isCategorical, - equalTo(false), - ) - - receivedHistograms.addAll(metric.value.toList()) - - if (receivedHistograms.size == expectedHistograms.size) { - histogram.complete(null) - } - } - - @AssertCalled - override fun onStringScalar(metric: RuntimeTelemetry.Metric<String>) { - if (metric.name != "telemetry.test.string_kind") { - return - } - - assertThat( - "Metric value should match", - metric.value, - equalTo("test scalar"), - ) - - stringScalar.complete(null) - } - - @AssertCalled - override fun onBooleanScalar(metric: RuntimeTelemetry.Metric<Boolean>) { - if (metric.name != "telemetry.test.boolean_kind") { - return - } - - assertThat( - "Metric value should match", - metric.value, - equalTo(true), - ) - - booleanScalar.complete(null) - } - - @AssertCalled - override fun onLongScalar(metric: RuntimeTelemetry.Metric<Long>) { - if (metric.name != "telemetry.test.unsigned_int_kind") { - return - } - - assertThat( - "Metric value should match", - metric.value, - equalTo(1234L), - ) - - longScalar.complete(null) - } - }, - ) - - sessionRule.addHistogram("TELEMETRY_TEST_STREAMING", expectedHistograms[0]) - sessionRule.addHistogram("TELEMETRY_TEST_STREAMING", expectedHistograms[1]) - sessionRule.addHistogram("TELEMETRY_TEST_STREAMING", expectedHistograms[2]) - sessionRule.addHistogram("TELEMETRY_TEST_STREAMING", expectedHistograms[3]) - - sessionRule.setScalar("telemetry.test.boolean_kind", true) - sessionRule.setScalar("telemetry.test.unsigned_int_kind", 1234) - sessionRule.setScalar("telemetry.test.string_kind", "test scalar") - - // Forces flushing telemetry data at next histogram. - sessionRule.setPrefsUntilTestEnd( - mapOf("toolkit.telemetry.geckoview.batchDurationMS" to 0), - ) - sessionRule.addHistogram("TELEMETRY_TEST_STREAMING", expectedHistograms[4]) - - sessionRule.waitForResult(histogram) - sessionRule.waitForResult(stringScalar) - sessionRule.waitForResult(booleanScalar) - sessionRule.waitForResult(longScalar) - - assertThat( - "Metric values should match", - receivedHistograms, - equalTo(expectedHistograms), - ) - } -} diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TranslationsTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TranslationsTest.kt index a2c4eede62..966eba73b6 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TranslationsTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TranslationsTest.kt @@ -6,6 +6,7 @@ package org.mozilla.geckoview.test import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest +import junit.framework.TestCase.assertFalse import junit.framework.TestCase.assertTrue import org.json.JSONObject import org.junit.After @@ -78,7 +79,7 @@ class TranslationsTest : BaseSessionTest() { handled.complete(null) } }) - var expectedTranslateEvent = JSONObject( + val expectedTranslateEvent = JSONObject( """ { "actor":{ @@ -89,6 +90,7 @@ class TranslationsTest : BaseSessionTest() { "docLangTag": "es" }, "requestedTranslationPair": null, + "hasVisibleChange": false, "error": null, "isEngineReady": false } @@ -153,28 +155,43 @@ class TranslationsTest : BaseSessionTest() { val translate = sessionRule.session.sessionTranslation!!.translate("en", "es", null) try { sessionRule.waitForResult(translate) - assertTrue("Translate should complete.", true) + // When testing from AS, this path is possible. + if (!sessionRule.env.isAutomation) { + assertTrue("Translate should complete.", true) + } } catch (e: Exception) { - assertTrue("Should not have an exception while translating.", false) + if (sessionRule.env.isAutomation) { + assertTrue("Expect an exception while translating in automation.", true) + } } // Options should work as expected - var options = TranslationOptions.Builder().downloadModel(true).build() + val options = TranslationOptions.Builder().downloadModel(true).build() val translateOptions = sessionRule.session.sessionTranslation!!.translate("en", "es", options) try { sessionRule.waitForResult(translateOptions) - assertTrue("Translate should complete with options.", true) + // When testing from AS, this path is possible. + if (!sessionRule.env.isAutomation) { + assertTrue("Translate should complete with options.", true) + } } catch (e: Exception) { - assertTrue("Should not have an exception while translating with options.", false) + if (sessionRule.env.isAutomation) { + assertTrue("Expect an exception while translating in automation.", true) + } } // Language tags should be fault tolerant of minor variations val longLanguageTag = sessionRule.session.sessionTranslation!!.translate("EN", "ES", null) try { sessionRule.waitForResult(longLanguageTag) - assertTrue("Translate should complete with longer language tag.", true) + // When testing from AS, this path is possible. + if (!sessionRule.env.isAutomation) { + assertTrue("Translate should complete with longer language tag.", true) + } } catch (e: Exception) { - assertTrue("Should not have an exception while translating with a longer language tag.", false) + if (sessionRule.env.isAutomation) { + assertTrue("Expect an exception while translating in automation.", true) + } } } @@ -244,9 +261,14 @@ class TranslationsTest : BaseSessionTest() { val translate = sessionRule.session.sessionTranslation!!.translate("es", "en", null) try { sessionRule.waitForResult(translate) - assertTrue("Should be able to translate.", true) + // When testing from AS, this path is possible. + if (!sessionRule.env.isAutomation) { + assertTrue("Should be able to translate.", true) + } } catch (e: Exception) { - assertTrue("Should not have an exception.", false) + if (sessionRule.env.isAutomation) { + assertTrue("Expect an exception while translating in automation.", true) + } } } @@ -443,10 +465,10 @@ class TranslationsTest : BaseSessionTest() { @Test fun testGetLanguageSettings() { // Note: Test endpoint is using a mocked response and doesn't reflect actual prefs - var languageSettings: Map<String, String> = + val languageSettings: Map<String, String> = sessionRule.waitForResult(TranslationsController.RuntimeTranslation.getLanguageSettings()) - var frLanguageSetting = sessionRule.waitForResult(TranslationsController.RuntimeTranslation.getLanguageSetting("fr")) + val frLanguageSetting = sessionRule.waitForResult(TranslationsController.RuntimeTranslation.getLanguageSetting("fr")) if (sessionRule.env.isAutomation) { assertTrue("FR was correctly set to ALWAYS via full query.", languageSettings["fr"] == ALWAYS) @@ -621,4 +643,73 @@ class TranslationsTest : BaseSessionTest() { } } } + + @Test + fun hasVisibleChangeTest() { + mainSession.loadTestPath(TRANSLATIONS_ES) + mainSession.waitForPageStop() + + val handled = GeckoResult<Void>() + var delegateCalled = 0 + sessionRule.delegateUntilTestEnd(object : Delegate { + @AssertCalled(count = 2) + override fun onTranslationStateChange( + session: GeckoSession, + translationState: TranslationState?, + ) { + delegateCalled++ + + if (delegateCalled == 1) { + assertFalse("Initially not visibly changed.", translationState!!.hasVisibleChange) + } + + if (delegateCalled == 2) { + assertTrue("After a translation, the DOM should be visibly changed.", translationState!!.hasVisibleChange) + handled.complete(null) + } + } + }) + val notTranslated = JSONObject( + """ + { + "actor":{ + "languageState":{ + "detectedLanguages": { + "userLangTag": "en", + "isDocLangTagSupported": true, + "docLangTag": "es" + }, + "requestedTranslationPair": null, + "hasVisibleChange": false, + "error": null, + "isEngineReady": false + } + } + } + """.trimIndent(), + ) + mainSession.triggerLanguageStateChange(notTranslated) + + val translated = JSONObject( + """ + { + "actor":{ + "languageState":{ + "detectedLanguages": { + "userLangTag": "en", + "isDocLangTagSupported": true, + "docLangTag": "es" + }, + "requestedTranslationPair": {"fromLanguage" : "es" , "toLanguage" : "en"}, + "hasVisibleChange": true, + "error": null, + "isEngineReady": true + } + } + } + """.trimIndent(), + ) + mainSession.triggerLanguageStateChange(translated) + sessionRule.waitForResult(handled) + } } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt index fa5caa8693..413ca7e2f6 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/WebExtensionTest.kt @@ -482,6 +482,101 @@ class WebExtensionTest : BaseSessionTest() { sessionRule.waitForResult(controller.uninstall(extension)) } + @Test + fun optionalOriginsNormalized() { + // For mv3 extensions the host_permissions are being granted automatically at install time + // but this test needs them to not be granted yet and so we explicitly opt-out in this test. + sessionRule.setPrefsUntilTestEnd( + mapOf( + "extensions.originControls.grantByDefault" to false, + ), + ) + + var extension = sessionRule.waitForResult( + controller.ensureBuiltIn( + "resource://android/assets/web_extensions/optional-permission-all-urls/", + "optional-permission-all-urls@example.com", + ), + ) + + assertEquals("optional-permission-all-urls@example.com", extension.id) + + var grantedOptionalOrigins = extension.metaData.grantedOptionalOrigins + assertArrayEquals( + "grantedOptionalPermissions must be initially empty", + arrayOf(), + grantedOptionalOrigins, + ) + + extension = sessionRule.waitForResult( + controller.addOptionalPermissions( + extension.id, + arrayOf(), + arrayOf("http://*/", "https://*/", "file://*/*"), + ), + ) + + grantedOptionalOrigins = extension.metaData.grantedOptionalOrigins + + assertArrayEquals( + "grantedOptionalPermissions must be [http://*/*, https://*/*, file://*/*]", + arrayOf("http://*/*", "https://*/*", "file://*/*"), + grantedOptionalOrigins, + ) + + sessionRule.waitForResult(controller.uninstall(extension)) + } + + @Test + fun onOptionalPermissionsChanged() { + var extension = sessionRule.waitForResult( + controller.ensureBuiltIn( + "resource://android/assets/web_extensions/optional-permission-request/", + "optional-permission-request@example.com", + ), + ) + + assertEquals("optional-permission-request@example.com", extension.id) + + var grantedOptionalPermissions = extension.metaData.grantedOptionalPermissions + var grantedOptionalOrigins = extension.metaData.grantedOptionalOrigins + + assertThat( + "grantedOptionalPermissions must be 0.", + grantedOptionalPermissions.size, + equalTo(0), + ) + assertThat("grantedOptionalOrigins must be 0.", grantedOptionalOrigins.size, equalTo(0)) + + sessionRule.delegateDuringNextWait(object : WebExtensionController.AddonManagerDelegate { + @AssertCalled(count = 1) + override fun onOptionalPermissionsChanged(updatedExtension: WebExtension) { + grantedOptionalPermissions = updatedExtension.metaData.grantedOptionalPermissions + grantedOptionalOrigins = updatedExtension.metaData.grantedOptionalOrigins + assertNull(updatedExtension) + assertArrayEquals( + "grantedOptionalPermissions must be [activeTab, geolocation].", + arrayOf("activeTab", "geolocation"), + grantedOptionalPermissions, + ) + assertArrayEquals( + "grantedOptionalPermissions must be [*://example.com/*].", + arrayOf("*://example.com/*"), + grantedOptionalOrigins, + ) + } + }) + + extension = sessionRule.waitForResult( + controller.addOptionalPermissions( + extension.id, + arrayOf("activeTab", "geolocation"), + arrayOf("*://example.com/*"), + ), + ) + sessionRule.waitForResult(controller.uninstall(extension)) + } + private fun assertBodyBorderEqualTo(expected: String) { val color = mainSession.evaluateJS("document.body.style.borderColor") assertThat( @@ -2763,7 +2858,7 @@ class WebExtensionTest : BaseSessionTest() { "extensions.install.requireBuiltInCerts" to false, "extensions.update.requireBuiltInCerts" to false, "extensions.getAddons.cache.enabled" to true, - "extensions.getAddons.cache.lastUpdate" to 0, + "extensions.getAddons.cache.lastUpdate" to 1, ), ) mainSession.loadUri("https://example.com") @@ -3721,11 +3816,6 @@ class WebExtensionTest : BaseSessionTest() { mainSession.evaluateJS("typeof navigator.mozAddonManager") as String, equalTo("object"), ) - assertThat( - "mozAddonManager.abuseReportPanelEnabled should be false", - mainSession.evaluateJS("navigator.mozAddonManager.abuseReportPanelEnabled") as Boolean, - equalTo(false), - ) // Install an add-on, then assert results got from `mozAddonManager.getAddonByID()`. var addonId = "" diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java index 727f403931..7c95233552 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java @@ -89,7 +89,6 @@ import org.mozilla.geckoview.GeckoSession.TextInputDelegate; import org.mozilla.geckoview.GeckoSessionSettings; import org.mozilla.geckoview.MediaSession; import org.mozilla.geckoview.OrientationController; -import org.mozilla.geckoview.RuntimeTelemetry; import org.mozilla.geckoview.SessionTextInput; import org.mozilla.geckoview.TranslationsController; import org.mozilla.geckoview.WebExtension; @@ -988,10 +987,6 @@ public class GeckoSessionTestRule implements TestRule { return RuntimeCreator.getRuntime(); } - public void setTelemetryDelegate(final RuntimeTelemetry.Delegate delegate) { - RuntimeCreator.setTelemetryDelegate(delegate); - } - /** Sets an experiment delegate on the runtime creator. */ public void setExperimentDelegate(final ExperimentDelegate delegate) { RuntimeCreator.setExperimentDelegate(delegate); @@ -1463,7 +1458,6 @@ public class GeckoSessionTestRule implements TestRule { mLastWaitStart = 0; mLastWaitEnd = 0; mTimeoutMillis = 0; - RuntimeCreator.setTelemetryDelegate(null); RuntimeCreator.setExperimentDelegate(null); } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java index 7eda360459..db18c06a9d 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java @@ -18,7 +18,6 @@ import org.mozilla.geckoview.ExperimentDelegate; import org.mozilla.geckoview.GeckoResult; import org.mozilla.geckoview.GeckoRuntime; import org.mozilla.geckoview.GeckoRuntimeSettings; -import org.mozilla.geckoview.RuntimeTelemetry; import org.mozilla.geckoview.WebExtension; import org.mozilla.geckoview.test.TestCrashHandler; @@ -34,40 +33,6 @@ public class RuntimeCreator { public static AtomicInteger sTestSupport = new AtomicInteger(0); public static WebExtension sTestSupportExtension; - // The RuntimeTelemetry.Delegate can only be set when creating the RuntimeCreator, to - // let tests set their own Delegate we need to create a proxy here. - public static class RuntimeTelemetryDelegate implements RuntimeTelemetry.Delegate { - public RuntimeTelemetry.Delegate delegate = null; - - @Override - public void onHistogram(@NonNull final RuntimeTelemetry.Histogram metric) { - if (delegate != null) { - delegate.onHistogram(metric); - } - } - - @Override - public void onBooleanScalar(@NonNull final RuntimeTelemetry.Metric<Boolean> metric) { - if (delegate != null) { - delegate.onBooleanScalar(metric); - } - } - - @Override - public void onStringScalar(@NonNull final RuntimeTelemetry.Metric<String> metric) { - if (delegate != null) { - delegate.onStringScalar(metric); - } - } - - @Override - public void onLongScalar(@NonNull final RuntimeTelemetry.Metric<Long> metric) { - if (delegate != null) { - delegate.onLongScalar(metric); - } - } - } - /** * The ExperimentDelegate can only be set when starting the RuntimeCreator, so for testing we are * setting up a proxy here @@ -110,9 +75,6 @@ public class RuntimeCreator { } } - public static final RuntimeTelemetryDelegate sRuntimeTelemetryProxy = - new RuntimeTelemetryDelegate(); - public static RuntimeExperimentDelegate sRuntimeExperimentDelegateProxy = new RuntimeExperimentDelegate(); private static WebExtension.Port sBackgroundPort; @@ -163,17 +125,6 @@ public class RuntimeCreator { } /** - * Set the {@link RuntimeTelemetry.Delegate} instance for this test. Application code can only - * register this delegate when the {@link GeckoRuntime} is created, so we need to proxy it for - * test code. - * - * @param delegate the {@link RuntimeTelemetry.Delegate} for this test run. - */ - public static void setTelemetryDelegate(final RuntimeTelemetry.Delegate delegate) { - sRuntimeTelemetryProxy.delegate = delegate; - } - - /** * Set the {@link ExperimentDelegate} instance for this test. Application code can only register * this delegate when the {@link GeckoRuntime} is created, so we need to proxy it for test code. * @@ -216,7 +167,6 @@ public class RuntimeCreator { .remoteDebuggingEnabled(true) .consoleOutput(true) .crashHandler(TestCrashHandler.class) - .telemetryDelegate(sRuntimeTelemetryProxy) .experimentDelegate(sRuntimeExperimentDelegateProxy) .build(); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java index 1fc34cb8bb..e0c16d66cc 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoDisplay.java @@ -453,13 +453,15 @@ public class GeckoDisplay { * <p>This function must be called on the UI thread. * * @return A {@link GeckoResult} that completes with a {@link Bitmap} containing the pixels and - * size information of the requested portion of the visible web page. + * size information of the requested portion of the visible web page, or returns a failure + * {@link GeckoResult} including the reason why in an {@link Exception} */ @UiThread public @NonNull GeckoResult<Bitmap> capture() { ThreadUtils.assertOnUiThread(); if (!mSession.isCompositorReady()) { - throw new IllegalStateException("Compositor must be ready before pixels can be captured"); + return GeckoResult.fromException( + new IllegalStateException("Compositor must be ready before pixels can be captured")); } final GeckoResult<Bitmap> result = new GeckoResult<>(); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoEditable.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoEditable.java index 8750f344a8..ccd513f6bd 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoEditable.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoEditable.java @@ -1893,7 +1893,7 @@ import org.mozilla.geckoview.SessionTextInput.EditableListener.IMEState; outAttrs.imeOptions = EditorInfo.IME_ACTION_GO; } else if (actionHint.equals("done")) { outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE; - } else if (actionHint.equals("next") || actionHint.equals("maybenext")) { + } else if (actionHint.equals("next")) { outAttrs.imeOptions = EditorInfo.IME_ACTION_NEXT; } else if (actionHint.equals("previous")) { outAttrs.imeOptions = EditorInfo.IME_ACTION_PREVIOUS; @@ -1901,6 +1901,9 @@ import org.mozilla.geckoview.SessionTextInput.EditableListener.IMEState; outAttrs.imeOptions = EditorInfo.IME_ACTION_SEARCH; } else if (actionHint.equals("send")) { outAttrs.imeOptions = EditorInfo.IME_ACTION_SEND; + } else if (actionHint.equals("maybenext")) { + // this should be low priority as "maybenext" is internal type + outAttrs.imeOptions = EditorInfo.IME_ACTION_NEXT; } else if (actionHint.length() > 0) { if (DEBUG) Log.w(LOGTAG, "Unexpected actionHint=\"" + actionHint + "\""); outAttrs.actionLabel = actionHint; @@ -2568,6 +2571,7 @@ import org.mozilla.geckoview.SessionTextInput.EditableListener.IMEState; switch (keyCode) { case KeyEvent.KEYCODE_MENU: case KeyEvent.KEYCODE_BACK: + case KeyEvent.KEYCODE_FORWARD: case KeyEvent.KEYCODE_VOLUME_UP: case KeyEvent.KEYCODE_VOLUME_DOWN: case KeyEvent.KEYCODE_SEARCH: diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java index 0a80b02b04..482fa32f39 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java @@ -457,21 +457,6 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { } /** - * Add a {@link RuntimeTelemetry.Delegate} instance to this GeckoRuntime. This delegate can be - * used by the app to receive streaming telemetry data from GeckoView. - * - * @param delegate the delegate that will handle telemetry - * @return The builder instance. - */ - @Deprecated - @DeprecationSchedule(id = "geckoview-gvst", version = 127) - public @NonNull Builder telemetryDelegate(final @NonNull RuntimeTelemetry.Delegate delegate) { - getSettings().mTelemetryProxy = new RuntimeTelemetry.Proxy(delegate); - getSettings().mTelemetryEnabled.set(true); - return this; - } - - /** * Set the {@link ExperimentDelegate} instance on this runtime, if any. This delegate is used to * send and receive experiment information from Nimbus. * @@ -663,7 +648,6 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ int mScreenHeightOverride; /* package */ Class<? extends Service> mCrashHandler; /* package */ String[] mRequestedLocales; - /* package */ RuntimeTelemetry.Proxy mTelemetryProxy; /* package */ ExperimentDelegate mExperimentDelegate; /** @@ -674,10 +658,6 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { /* package */ void attachTo(final @NonNull GeckoRuntime runtime) { mRuntime = runtime; commit(); - - if (mTelemetryProxy != null) { - mTelemetryProxy.attach(); - } } @Override // RuntimeSettings @@ -719,7 +699,6 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { mCrashHandler = settings.mCrashHandler; mRequestedLocales = settings.mRequestedLocales; mConfigFilePath = settings.mConfigFilePath; - mTelemetryProxy = settings.mTelemetryProxy; mExperimentDelegate = settings.mExperimentDelegate; } @@ -1368,11 +1347,6 @@ public final class GeckoRuntimeSettings extends RuntimeSettings { return this; } - @SuppressWarnings("checkstyle:javadocmethod") - public @Nullable RuntimeTelemetry.Delegate getTelemetryDelegate() { - return mTelemetryProxy.getDelegate(); - } - /** * Get the {@link ExperimentDelegate} instance set on this runtime, if any, * diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java index 85b3abf9a9..ccf1e8520e 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java @@ -2448,6 +2448,7 @@ public class GeckoSession { @IntDef( flag = true, value = { + FINDER_FIND_FORWARD, FINDER_FIND_BACKWARDS, FINDER_FIND_LINKS_ONLY, FINDER_FIND_MATCH_CASE, @@ -2455,6 +2456,9 @@ public class GeckoSession { }) public @interface FinderFindFlags {} + /** Go forward when finding the next match. */ + public static final int FINDER_FIND_FORWARD = 0; + /** Go backwards when finding the next match. */ public static final int FINDER_FIND_BACKWARDS = 1; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionSettings.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionSettings.java index 14f6b14c47..4dc23bc519 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionSettings.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSessionSettings.java @@ -331,11 +331,11 @@ public final class GeckoSessionSettings implements Parcelable { new Key<Boolean>("fullAccessibilityTree", /* initOnly */ false, /* values */ null); /** - * Key to specify if this GeckoSession is a Popup or not. Popup sessions can paint over other - * sessions and are not exposed to the tabs WebExtension API. + * Key to specify if this GeckoSession is a Extension Popup or not. Popup sessions can paint over + * other sessions and are not exposed to the tabs WebExtension API. */ - private static final Key<Boolean> IS_POPUP = - new Key<Boolean>("isPopup", /* initOnly */ false, /* values */ null); + private static final Key<Boolean> IS_EXTENSION_POPUP = + new Key<Boolean>("isExtensionPopup", /* initOnly */ false, /* values */ null); /** Internal Gecko key to specify the session context ID. Derived from `UNSAFE_CONTEXT_ID`. */ private static final Key<String> CONTEXT_ID = @@ -375,7 +375,7 @@ public final class GeckoSessionSettings implements Parcelable { mBundle.putBoolean(SUSPEND_MEDIA_WHEN_INACTIVE.name, false); mBundle.putBoolean(ALLOW_JAVASCRIPT.name, true); mBundle.putBoolean(FULL_ACCESSIBILITY_TREE.name, false); - mBundle.putBoolean(IS_POPUP.name, false); + mBundle.putBoolean(IS_EXTENSION_POPUP.name, false); mBundle.putInt(USER_AGENT_MODE.name, USER_AGENT_MODE_MOBILE); mBundle.putString(USER_AGENT_OVERRIDE.name, null); mBundle.putInt(VIEWPORT_MODE.name, VIEWPORT_MODE_MOBILE); @@ -430,8 +430,8 @@ public final class GeckoSessionSettings implements Parcelable { setBoolean(FULL_ACCESSIBILITY_TREE, value); } - /* package */ void setIsPopup(final boolean value) { - setBoolean(IS_POPUP, value); + /* package */ void setIsExtensionPopup(final boolean value) { + setBoolean(IS_EXTENSION_POPUP, value); } private void setBoolean(final Key<Boolean> key, final boolean value) { @@ -498,8 +498,8 @@ public final class GeckoSessionSettings implements Parcelable { return getBoolean(FULL_ACCESSIBILITY_TREE); } - /* package */ boolean getIsPopup() { - return getBoolean(IS_POPUP); + /* package */ boolean getIsExtensionPopup() { + return getBoolean(IS_EXTENSION_POPUP); } private boolean getBoolean(final Key<Boolean> key) { diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java index 2271ff71f7..8b31862524 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java @@ -22,6 +22,8 @@ import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.StateListDrawable; import android.os.Build; import android.os.Handler; import android.print.PrintDocumentAdapter; @@ -269,6 +271,14 @@ public class GeckoView extends FrameLayout implements GeckoDisplay.NewSurfacePro // descendants to affect the way LayerView retains its focus. setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS); + // When GeckoView.requestFocus() is called with hardware keyboard, the focused state color + // might be applied on this view. But we don't want to apply it as default. + final StateListDrawable drawable = new StateListDrawable(); + drawable.addState( + new int[] {android.R.attr.state_focused, -android.R.attr.state_focused}, + new ColorDrawable(Color.WHITE)); + setBackground(drawable); + // This will stop PropertyAnimator from creating a drawing cache (i.e. a // bitmap) from a SurfaceView, which is just not possible (the bitmap will be // transparent). diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/RuntimeTelemetry.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/RuntimeTelemetry.java deleted file mode 100644 index 1fad0cb17e..0000000000 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/RuntimeTelemetry.java +++ /dev/null @@ -1,171 +0,0 @@ -/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- - * vim: ts=4 sw=4 expandtab: - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -package org.mozilla.geckoview; - -import androidx.annotation.AnyThread; -import androidx.annotation.NonNull; -import org.mozilla.gecko.GeckoThread; -import org.mozilla.gecko.annotation.WrapForJNI; -import org.mozilla.gecko.mozglue.JNIObject; - -/** The telemetry API gives access to telemetry data of the Gecko runtime. */ -public final class RuntimeTelemetry { - protected RuntimeTelemetry() {} - - /** - * The runtime telemetry metric object. - * - * @param <T> type of the underlying metric sample - */ - public static class Metric<T> { - /** The runtime metric name. */ - public final @NonNull String name; - - /** The metric values. */ - public final @NonNull T value; - - /* package */ Metric(final String name, final T value) { - this.name = name; - this.value = value; - } - - @Override - public String toString() { - return "name: " + name + ", value: " + value; - } - - // For testing - protected Metric() { - name = null; - value = null; - } - } - - /** The Histogram telemetry metric object. */ - public static class Histogram extends Metric<long[]> { - /** Whether or not this is a Categorical Histogram. */ - public final boolean isCategorical; - - /* package */ Histogram(final boolean isCategorical, final String name, final long[] value) { - super(name, value); - this.isCategorical = isCategorical; - } - - // For testing - protected Histogram() { - super(null, null); - isCategorical = false; - } - } - - /** - * The runtime telemetry delegate. Implement this if you want to receive runtime (Gecko) telemetry - * and attach it via {@link GeckoRuntimeSettings.Builder#telemetryDelegate}. - */ - public interface Delegate { - /** - * A runtime telemetry histogram metric has been received. - * - * @param metric The runtime metric details. - */ - @AnyThread - default void onHistogram(final @NonNull Histogram metric) {} - - /** - * A runtime telemetry boolean scalar has been received. - * - * @param metric The runtime metric details. - */ - @AnyThread - default void onBooleanScalar(final @NonNull Metric<Boolean> metric) {} - - /** - * A runtime telemetry long scalar has been received. - * - * @param metric The runtime metric details. - */ - @AnyThread - default void onLongScalar(final @NonNull Metric<Long> metric) {} - - /** - * A runtime telemetry string scalar has been received. - * - * @param metric The runtime metric details. - */ - @AnyThread - default void onStringScalar(final @NonNull Metric<String> metric) {} - } - - // The proxy connects to telemetry core and forwards telemetry events - // to the attached delegate. - /* package */ static final class Proxy extends JNIObject { - private final Delegate mDelegate; - - public Proxy(final @NonNull Delegate delegate) { - mDelegate = delegate; - } - - // Attach to current runtime. - // We might have different mechanics of attaching to specific runtimes - // in future, for which case we should split the delegate assignment in - // the setup phase from the attaching. - public void attach() { - if (GeckoThread.isRunning()) { - registerDelegateProxy(this); - } else { - GeckoThread.queueNativeCall(Proxy.class, "registerDelegateProxy", Proxy.class, this); - } - } - - public @NonNull Delegate getDelegate() { - return mDelegate; - } - - @WrapForJNI(dispatchTo = "gecko") - private static native void registerDelegateProxy(Proxy proxy); - - @WrapForJNI(calledFrom = "gecko") - /* package */ void dispatchHistogram( - final boolean isCategorical, final String name, final long[] values) { - if (mDelegate == null) { - // TODO throw? - return; - } - mDelegate.onHistogram(new Histogram(isCategorical, name, values)); - } - - @WrapForJNI(calledFrom = "gecko") - /* package */ void dispatchStringScalar(final String name, final String value) { - if (mDelegate == null) { - return; - } - mDelegate.onStringScalar(new Metric<>(name, value)); - } - - @WrapForJNI(calledFrom = "gecko") - /* package */ void dispatchBooleanScalar(final String name, final boolean value) { - if (mDelegate == null) { - return; - } - mDelegate.onBooleanScalar(new Metric<>(name, value)); - } - - @WrapForJNI(calledFrom = "gecko") - /* package */ void dispatchLongScalar(final String name, final long value) { - if (mDelegate == null) { - return; - } - mDelegate.onLongScalar(new Metric<>(name, value)); - } - - @Override // JNIObject - protected void disposeNative() { - // We don't hold native references. - throw new UnsupportedOperationException(); - } - } -} diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ScreenLength.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ScreenLength.java index 1ce4b41659..e88976a447 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ScreenLength.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ScreenLength.java @@ -1,4 +1,6 @@ -/* License, v. 2.0. If a copy of the MPL was not distributed with this +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.mozilla.geckoview; diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionFinder.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionFinder.java index 2ed0b1a6c3..b245a39f1e 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionFinder.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/SessionFinder.java @@ -27,6 +27,7 @@ public final class SessionFinder { private static final List<Pair<Integer, String>> sFlagNames = Arrays.asList( + new Pair<>(GeckoSession.FINDER_FIND_FORWARD, "forward"), new Pair<>(GeckoSession.FINDER_FIND_BACKWARDS, "backwards"), new Pair<>(GeckoSession.FINDER_FIND_LINKS_ONLY, "linksOnly"), new Pair<>(GeckoSession.FINDER_FIND_MATCH_CASE, "matchCase"), @@ -70,7 +71,8 @@ public final class SessionFinder { * previous search string. * * @param searchString String to search, or null to find again using the previous string. - * @param flags Flags for performing the search; either 0 or a combination of {@link + * @param flags Flags for performing the search; either FINDER_FIND_FORWARD {@link + * GeckoSession#FINDER_FIND_FORWARD} or a combination of {@link * GeckoSession#FINDER_FIND_BACKWARDS FINDER_FIND_*} constants. * @return Result of the search operation as a {@link GeckoResult} object. * @see #clear diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TranslationsController.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TranslationsController.java index 37e5e7139a..256877532b 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TranslationsController.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TranslationsController.java @@ -1081,14 +1081,20 @@ public class TranslationsController { /** If the translation engine is ready for use or will need to be loaded. */ public final @NonNull Boolean isEngineReady; + /** If the DOM has began visibly changing to the translated text. */ + public final @NonNull Boolean hasVisibleChange; + /** - * Translation State constructor. + * This constructor is deprecated, please use the [TranslationState] with [hasVisibleChange] + * parameter. This constructor will be removed in bug 1895275. Translation State constructor. * * @param requestedTranslationPair the language pair to translate * @param error if an error occurred * @param detectedLanguages detected language * @param isEngineReady if the engine is ready for translations */ + @Deprecated + @DeprecationSchedule(version = 130, id = "translation-state-deprecated-constructor") public TranslationState( final @Nullable TranslationPair requestedTranslationPair, final @Nullable String error, @@ -1098,6 +1104,29 @@ public class TranslationsController { this.error = error; this.detectedLanguages = detectedLanguages; this.isEngineReady = isEngineReady; + this.hasVisibleChange = false; + } + + /** + * Translation State constructor. + * + * @param requestedTranslationPair the language pair to translate + * @param error if an error occurred + * @param detectedLanguages detected language + * @param isEngineReady if the engine is ready for translations + * @param hasVisibleChange if the DOM has began to visibly change to translated text + */ + public TranslationState( + final @Nullable TranslationPair requestedTranslationPair, + final @Nullable String error, + final @Nullable DetectedLanguages detectedLanguages, + final @NonNull Boolean isEngineReady, + final @NonNull Boolean hasVisibleChange) { + this.requestedTranslationPair = requestedTranslationPair; + this.error = error; + this.detectedLanguages = detectedLanguages; + this.isEngineReady = isEngineReady; + this.hasVisibleChange = hasVisibleChange; } @Override @@ -1112,6 +1141,8 @@ public class TranslationsController { + detectedLanguages + ", isEngineReady=" + isEngineReady + + ", hasVisibleChange=" + + hasVisibleChange + '}'; } @@ -1130,7 +1161,8 @@ public class TranslationsController { TranslationPair.fromBundle(bundle.getBundle("requestedTranslationPair")), bundle.getString("error"), DetectedLanguages.fromBundle(bundle.getBundle("detectedLanguages")), - bundle.getBoolean("isEngineReady", false)); + bundle.getBoolean("isEngineReady", false), + bundle.getBoolean("hasVisibleChange", false)); } } @@ -1168,7 +1200,7 @@ public class TranslationsController { final GeckoBundle data = message.getBundle("data"); final TranslationState translationState = TranslationState.fromBundle(data); if (DEBUG) { - Log.d(LOGTAG, "received translation state: " + translationState); + Log.d(LOGTAG, "Received translation state: " + translationState); } delegate.onTranslationStateChange(mSession, translationState); if (translationState != null diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtension.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtension.java index bf5d431cf1..53d57b126a 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtension.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtension.java @@ -1442,7 +1442,7 @@ public class WebExtension { return; } - session.getSettings().setIsPopup(true); + session.getSettings().setIsExtensionPopup(true); session.loadUri(popupUri); }); } diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java index 07e848b079..889cd91895 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java @@ -336,6 +336,14 @@ public class WebExtensionController { default void onDisabling(@NonNull WebExtension extension) {} /** + * Called whenever optional permissions of an extension have changed. + * + * @param extension The {@link WebExtension} that has optional permissions changed. + */ + @UiThread + default void onOptionalPermissionsChanged(@NonNull WebExtension extension) {} + + /** * Called whenever an extension has been disabled. * * @param extension The {@link WebExtension} that is being disabled. @@ -489,6 +497,7 @@ public class WebExtensionController { EventDispatcher.getInstance() .unregisterUiThreadListener( mInternals, + "GeckoView:WebExtension:OnOptionalPermissionsChanged", "GeckoView:WebExtension:OnDisabling", "GeckoView:WebExtension:OnDisabled", "GeckoView:WebExtension:OnEnabling", @@ -503,6 +512,7 @@ public class WebExtensionController { EventDispatcher.getInstance() .registerUiThreadListener( mInternals, + "GeckoView:WebExtension:OnOptionalPermissionsChanged", "GeckoView:WebExtension:OnDisabling", "GeckoView:WebExtension:OnDisabled", "GeckoView:WebExtension:OnEnabling", @@ -1021,6 +1031,9 @@ public class WebExtensionController { } else if ("GeckoView:WebExtension:OnDisabling".equals(event)) { onDisabling(bundle); return; + } else if ("GeckoView:WebExtension:OnOptionalPermissionsChanged".equals(event)) { + onOptionalPermissionsChanged(bundle); + return; } else if ("GeckoView:WebExtension:OnDisabled".equals(event)) { onDisabled(bundle); return; @@ -1265,6 +1278,17 @@ public class WebExtensionController { mAddonManagerDelegate.onDisabling(extension); } + private void onOptionalPermissionsChanged(final GeckoBundle bundle) { + if (mAddonManagerDelegate == null) { + Log.e(LOGTAG, "no AddonManager delegate registered"); + return; + } + + final GeckoBundle extensionBundle = bundle.getBundle("extension"); + final WebExtension extension = new WebExtension(mDelegateControllerProvider, extensionBundle); + mAddonManagerDelegate.onOptionalPermissionsChanged(extension); + } + private void onDisabled(final GeckoBundle bundle) { if (mAddonManagerDelegate == null) { Log.e(LOGTAG, "no AddonManager delegate registered"); @@ -1525,7 +1549,7 @@ public class WebExtensionController { if (delegate != null) { result = delegate.onCloseTab(extension, message.session); } else { - result = GeckoResult.fromValue(AllowOrDeny.DENY); + result = GeckoResult.deny(); } message.callback.resolveTo( diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md index e2df6df21b..a2d30d25ef 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md +++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md @@ -13,6 +13,17 @@ exclude: true ⚠️ breaking change and deprecation notices +## v127 +- ⚠️ Removed deprecated [`RuntimeTelemetry`][125.5], [`GeckoRuntimeSettings.getTelemetryDelegate`][125.6] and [`GeckoRuntimeSettings.telemetryDelegate`][125.7]. +- Added [FINDER_FIND_FORWARD][127.1] +- Added [`WebExtensionController.AddonManagerDelegate.onOptionalPermissionsChanged`][127.2] ([bug 1892302]({{bugzilla}}1892302). +- Added a new [`TranslationState`][127.3] constructor to add `hasVisibleChange` and deprecated the prior [`TranslationsState`][127.4] constructor to be removed in v130. + +[127.1]: {{javadoc_uri}}/GeckoSession.html#FINDER_FIND_FORWARD +[127.2]: {{javadoc_uri}}/WebExtensionController.AddonManagerDelegate.html#onOptionalPermissionsChanged +[127.3]: {{javadoc_uri}}/TranslationsController.SessionTranslation.TranslationState.html#%3Cinit%3E(org.mozilla.geckoview.TranslationsController.SessionTranslation.TranslationPair,java.lang.String,org.mozilla.geckoview.TranslationsController.SessionTranslation.DetectedLanguages,java.lang.Boolean,java.lang.Boolean) +[127.4]: {{javadoc_uri}}/TranslationsController.SessionTranslation.TranslationState.html#<init>(org.mozilla.geckoview.TranslationsController.SessionTranslation.TranslationPair,java.lang.String,org.mozilla.geckoview.TranslationsController.SessionTranslation.DetectedLanguages,java.lang.Boolean) + ## v125 - ⚠️ Deprecated [`GeckoSession.NavigationDelegate.onLocationChange`][125.1], to be removed in v127. ([bug 1837601]({{bugzilla}}1837601)) @@ -1547,4 +1558,4 @@ to allow adding gecko profiler markers. [65.24]: {{javadoc_uri}}/CrashReporter.html#sendCrashReport(android.content.Context,android.os.Bundle,java.lang.String) [65.25]: {{javadoc_uri}}/GeckoResult.html -[api-version]: 2c319e9f18adb4178ce09d71088a173b56d1a694 +[api-version]: 0b9d0f241805fab7e71d3d745170a237f6ac113d diff --git a/mobile/android/geckoview_example/build.gradle b/mobile/android/geckoview_example/build.gradle index 4c8473c047..56363cecfc 100644 --- a/mobile/android/geckoview_example/build.gradle +++ b/mobile/android/geckoview_example/build.gradle @@ -53,6 +53,7 @@ android { dependencies { implementation ComponentsDependencies.androidx_annotation implementation ComponentsDependencies.androidx_appcompat + implementation ComponentsDependencies.androidx_core implementation ComponentsDependencies.androidx_preferences implementation project(path: ':geckoview') diff --git a/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java index 30ae778b8b..48036f7bf5 100644 --- a/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java +++ b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java @@ -91,7 +91,6 @@ import org.mozilla.geckoview.GeckoWebExecutor; import org.mozilla.geckoview.Image; import org.mozilla.geckoview.MediaSession; import org.mozilla.geckoview.OrientationController; -import org.mozilla.geckoview.RuntimeTelemetry; import org.mozilla.geckoview.SlowScriptResponse; import org.mozilla.geckoview.TranslationsController; import org.mozilla.geckoview.WebExtension; @@ -874,7 +873,6 @@ public class GeckoViewActivity extends AppCompatActivity .build()) .crashHandler(ExampleCrashHandler.class) .preferredColorScheme(mPreferredColorScheme.value()) - .telemetryDelegate(new ExampleTelemetryDelegate()) .javaScriptEnabled(mJavascriptEnabled.value()) .extensionsProcessEnabled(mExtensionsProcessEnabled.value()) .globalPrivacyControlEnabled(mGlobalPrivacyControlEnabled.value()) @@ -3039,28 +3037,6 @@ public class GeckoViewActivity extends AppCompatActivity } } - private final class ExampleTelemetryDelegate implements RuntimeTelemetry.Delegate { - @Override - public void onHistogram(final @NonNull RuntimeTelemetry.Histogram histogram) { - Log.d(LOGTAG, "onHistogram " + histogram); - } - - @Override - public void onBooleanScalar(final @NonNull RuntimeTelemetry.Metric<Boolean> scalar) { - Log.d(LOGTAG, "onBooleanScalar " + scalar); - } - - @Override - public void onLongScalar(final @NonNull RuntimeTelemetry.Metric<Long> scalar) { - Log.d(LOGTAG, "onLongScalar " + scalar); - } - - @Override - public void onStringScalar(final @NonNull RuntimeTelemetry.Metric<String> scalar) { - Log.d(LOGTAG, "onStringScalar " + scalar); - } - } - private class ExampleActivityDelegate implements GeckoView.ActivityContextDelegate { public Context getActivityContext() { return GeckoViewActivity.this; diff --git a/mobile/android/gradle.py b/mobile/android/gradle.py index 9f310ddb7b..51b9313940 100644 --- a/mobile/android/gradle.py +++ b/mobile/android/gradle.py @@ -5,10 +5,12 @@ import os import subprocess import sys +import time from contextlib import contextmanager import mozpack.path as mozpath -from mozbuild.util import ensureParentDir, lock_file +from mozbuild.dirutils import ensureParentDir +from mozbuild.lock import lock_file @contextmanager @@ -27,6 +29,10 @@ def gradle_lock(topobjdir, max_wait_seconds=600): def android(verb, *args): + env = dict(os.environ) + should_print_status = env.get("MACH") and not env.get("NO_BUILDSTATUS_MESSAGES") + if should_print_status: + print("BUILDSTATUS " + str(time.time()) + " START_Gradle " + verb) import buildconfig with gradle_lock(buildconfig.topobjdir): @@ -37,7 +43,6 @@ def android(verb, *args): verb, ] cmd.extend(args) - env = dict(os.environ) # Confusingly, `MACH` is set only within `mach build`. if env.get("MACH"): env["GRADLE_INVOKED_WITHIN_MACH_BUILD"] = "1" @@ -45,7 +50,9 @@ def android(verb, *args): del env["LD_LIBRARY_PATH"] subprocess.check_call(cmd, env=env) - return 0 + if should_print_status: + print("BUILDSTATUS " + str(time.time()) + " END_Gradle " + verb) + return 0 def assemble_app(dummy_output_file, *inputs): diff --git a/mobile/android/gradle/dotgradle-offline/gradle.properties b/mobile/android/gradle/dotgradle-offline/gradle.properties index 3f77ec9a2f..bc2b01e1e5 100644 --- a/mobile/android/gradle/dotgradle-offline/gradle.properties +++ b/mobile/android/gradle/dotgradle-offline/gradle.properties @@ -1,3 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + // Per https://docs.gradle.org/current/userguide/build_environment.html, this // overrides the gradle.properties in topsrcdir. org.gradle.daemon=false diff --git a/mobile/android/gradle/dotgradle-online/gradle.properties b/mobile/android/gradle/dotgradle-online/gradle.properties index 3f77ec9a2f..bc2b01e1e5 100644 --- a/mobile/android/gradle/dotgradle-online/gradle.properties +++ b/mobile/android/gradle/dotgradle-online/gradle.properties @@ -1,3 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + // Per https://docs.gradle.org/current/userguide/build_environment.html, this // overrides the gradle.properties in topsrcdir. org.gradle.daemon=false diff --git a/mobile/android/mach_commands.py b/mobile/android/mach_commands.py index fac483902c..9674650be4 100644 --- a/mobile/android/mach_commands.py +++ b/mobile/android/mach_commands.py @@ -9,6 +9,7 @@ import re import subprocess import sys import tarfile +import time import mozpack.path as mozpath from mach.decorators import Command, CommandArgument, SubCommand @@ -551,13 +552,19 @@ def gradle(command_context, args, verbose=False): if android_sdk_root: env["ANDROID_SDK_ROOT"] = android_sdk_root - return command_context.run_process( + should_print_status = env.get("MACH") and not env.get("NO_BUILDSTATUS_MESSAGES") + if should_print_status: + print("BUILDSTATUS " + str(time.time()) + " START_Gradle " + args[0]) + rv = command_context.run_process( [command_context.substs["GRADLE"]] + gradle_flags + args, explicit_env=env, pass_thru=True, # Allow user to run gradle interactively. ensure_exit_code=False, # Don't throw on non-zero exit code. cwd=mozpath.join(command_context.topsrcdir), ) + if should_print_status: + print("BUILDSTATUS " + str(time.time()) + " END_Gradle " + args[0]) + return rv @Command("gradle-install", category="devenv", conditions=[REMOVED]) diff --git a/mobile/android/modules/geckoview/GeckoViewNavigation.sys.mjs b/mobile/android/modules/geckoview/GeckoViewNavigation.sys.mjs index 483f0b01f2..911b08a70e 100644 --- a/mobile/android/modules/geckoview/GeckoViewNavigation.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewNavigation.sys.mjs @@ -291,10 +291,10 @@ export class GeckoViewNavigation extends GeckoViewModule { waitAndSetupWindow(aSessionId, aOpenWindowInfo, aName) { if (!aSessionId) { - return Promise.resolve(null); + return Promise.reject(); } - return new Promise(resolve => { + return new Promise((resolve, reject) => { const handler = { observe(aSubject, aTopic) { if ( @@ -318,6 +318,10 @@ export class GeckoViewNavigation extends GeckoViewModule { aSubject.browser.removeAttribute("remoteType"); } Services.obs.removeObserver(handler, "geckoview-window-created"); + if (!aSubject) { + reject(); + return; + } resolve(aSubject); } }, @@ -332,8 +336,45 @@ export class GeckoViewNavigation extends GeckoViewModule { debug`handleNewSession: uri=${aUri && aUri.spec} where=${aWhere} flags=${aFlags}`; + const setupPromise = this.#handleNewSessionAsync( + aUri, + aOpenWindowInfo, + aFlags, + aName + ); + + let browser = undefined; + setupPromise.then( + window => { + browser = window.browser; + }, + () => { + browser = null; + } + ); + + // Wait indefinitely for app to respond with a browser or null + Services.tm.spinEventLoopUntil( + "GeckoViewNavigation.jsm:handleNewSession", + () => this.window.closed || browser !== undefined + ); + return browser || null; + } + + #isNewTab(aWhere) { + return [ + Ci.nsIBrowserDOMWindow.OPEN_NEWTAB, + Ci.nsIBrowserDOMWindow.OPEN_NEWTAB_BACKGROUND, + ].includes(aWhere); + } + + /** + * Similar to handleNewSession. But this returns a promise to wait for new + * browser. + */ + #handleNewSessionAsync(aUri, aOpenWindowInfo, aFlags, aName) { if (!this.enabled) { - return null; + return Promise.reject(); } const newSessionId = Services.uuid @@ -356,30 +397,15 @@ export class GeckoViewNavigation extends GeckoViewModule { aName ); - let browser = undefined; - this.eventDispatcher + return this.eventDispatcher .sendRequestForResult(message) .then(didOpenSession => { if (!didOpenSession) { + // New session cannot be opened, so we should throw NS_ERROR_ABORT. return Promise.reject(); } return setupPromise; - }) - .then( - window => { - browser = window.browser; - }, - () => { - browser = null; - } - ); - - // Wait indefinitely for app to respond with a browser or null - Services.tm.spinEventLoopUntil( - "GeckoViewNavigation.sys.mjs:handleNewSession", - () => this.window.closed || browser !== undefined - ); - return browser || null; + }); } // nsIBrowserDOMWindow. @@ -393,6 +419,11 @@ export class GeckoViewNavigation extends GeckoViewModule { debug`createContentWindow: uri=${aUri && aUri.spec} where=${aWhere} flags=${aFlags}`; + if (!this.enabled) { + Components.returnCode = Cr.NS_ERROR_ABORT; + return null; + } + if ( lazy.LoadURIDelegate.load( this.window, @@ -408,13 +439,45 @@ export class GeckoViewNavigation extends GeckoViewModule { return null; } - const browser = this.handleNewSession( + const newTab = this.#isNewTab(aWhere); + const promise = this.#handleNewSessionAsync( aUri, aOpenWindowInfo, aWhere, aFlags, null ); + + // Actually, GeckoView's createContentWindow always creates new window even + // if OPEN_NEWTAB. So the browsing context will be observed via + // nsFrameLoader. + if (aOpenWindowInfo && !newTab) { + promise.catch(() => { + aOpenWindowInfo.cancel(); + }); + // If nsIOpenWindowInfo isn't null, caller should use the callback. + // Also, nsIWindowProvider.provideWindow doesn't use callback, if new + // tab option, we have to return browsing context instead of async. + return null; + } + + let browser = undefined; + promise.then( + window => { + browser = window.browser; + }, + () => { + browser = null; + } + ); + + // Wait indefinitely for app to respond with a browser or null. + // if browser is null, return error. + Services.tm.spinEventLoopUntil( + "GeckoViewNavigation.sys.mjs:createContentWindow", + () => this.window.closed || browser !== undefined + ); + if (!browser) { Components.returnCode = Cr.NS_ERROR_ABORT; return null; diff --git a/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs b/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs index faa5c5f280..5c176a17f1 100644 --- a/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs @@ -117,19 +117,11 @@ export var GeckoViewSessionStore = { switch (aTopic) { case "browsing-context-did-set-embedder": { - if ( - aSubject && - aSubject === aSubject.top && - aSubject.isContent && - aSubject.embedderElement && - aSubject.embedderElement.permanentKey - ) { - const permanentKey = aSubject.embedderElement.permanentKey; - this._browserSHistoryListener - .get(permanentKey) - ?.unregister(permanentKey); - - this.getOrCreateSHistoryListener(permanentKey, aSubject, true); + if (aSubject === aSubject.top && aSubject.isContent) { + const permanentKey = aSubject.embedderElement?.permanentKey; + if (permanentKey) { + this.maybeRecreateSHistoryListener(permanentKey, aSubject); + } } break; } @@ -151,26 +143,34 @@ export var GeckoViewSessionStore = { }); }, - getOrCreateSHistoryListener( - permanentKey, - browsingContext, - collectImmediately = false - ) { + getOrCreateSHistoryListener(permanentKey, browsingContext) { if (!permanentKey || browsingContext !== browsingContext.top) { return null; } + const listener = this._browserSHistoryListener.get(permanentKey); + if (listener) { + return listener; + } + + return this.createSHistoryListener(permanentKey, browsingContext, false); + }, + + maybeRecreateSHistoryListener(permanentKey, browsingContext) { + const listener = this._browserSHistoryListener.get(permanentKey); + if (!listener || listener._browserId != browsingContext.browserId) { + listener?.unregister(permanentKey); + this.createSHistoryListener(permanentKey, browsingContext, true); + } + }, + + createSHistoryListener(permanentKey, browsingContext, collectImmediately) { const sessionHistory = browsingContext.sessionHistory; if (!sessionHistory) { return null; } - let listener = this._browserSHistoryListener.get(permanentKey); - if (listener) { - return listener; - } - - listener = new SHistoryListener(browsingContext); + const listener = new SHistoryListener(browsingContext); sessionHistory.addSHistoryListener(listener); this._browserSHistoryListener.set(permanentKey, listener); @@ -184,4 +184,51 @@ export var GeckoViewSessionStore = { return listener; }, + + updateSessionStoreFromTabListener( + browser, + browsingContext, + permanentKey, + update, + forStorage = false + ) { + permanentKey = browser?.permanentKey ?? permanentKey; + if (!permanentKey) { + return; + } + + if (browsingContext.isReplaced) { + return; + } + + const listener = this.getOrCreateSHistoryListener( + permanentKey, + browsingContext + ); + + if (listener) { + const historychange = + // If it is not the scheduled update (tab closed, window closed etc), + // try to store the loading non-web-controlled page opened in _blank + // first. + (forStorage && + lazy.SessionHistory.collectNonWebControlledBlankLoadingSession( + browsingContext + )) || + listener.collect(permanentKey, browsingContext, { + collectFull: !!update.sHistoryNeeded, + writeToCache: false, + }); + + if (historychange) { + update.data.historychange = historychange; + } + } + + const win = + browsingContext.embedderElement?.ownerGlobal || + browsingContext.currentWindowGlobal?.browsingContext?.window; + + this.onTabStateUpdate(permanentKey, win, update); + }, }; diff --git a/mobile/android/modules/geckoview/GeckoViewSettings.sys.mjs b/mobile/android/modules/geckoview/GeckoViewSettings.sys.mjs index ec927b0af6..f2dd7590ab 100644 --- a/mobile/android/modules/geckoview/GeckoViewSettings.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewSettings.sys.mjs @@ -6,6 +6,10 @@ import { GeckoViewModule } from "resource://gre/modules/GeckoViewModule.sys.mjs" const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + ExtensionParent: "resource://gre/modules/ExtensionParent.sys.mjs", +}); + ChromeUtils.defineLazyGetter(lazy, "MOBILE_USER_AGENT", function () { return Cc["@mozilla.org/network/protocol;1?name=http"].getService( Ci.nsIHttpProtocolHandler @@ -74,6 +78,18 @@ export class GeckoViewSettings extends GeckoViewModule { this.viewportMode = settings.viewportMode; this.useTrackingProtection = !!settings.useTrackingProtection; + if (settings.isExtensionPopup) { + // NOTE: Only add the webextension-view-type and emit extension-browser-inserted + // once, an extension popup should never change webextension-view-type once set. + if (!this.browser.hasAttribute("webextension-view-type")) { + this.browser.setAttribute("webextension-view-type", "popup"); + lazy.ExtensionParent.apiManager.emit( + "extension-browser-inserted", + this.browser + ); + } + } + // When the page is loading from the main process (e.g. from an extension // page) we won't be able to query the actor here. this.getActor("GeckoViewSettings")?.sendAsyncMessage( diff --git a/mobile/android/modules/geckoview/GeckoViewTestUtils.sys.mjs b/mobile/android/modules/geckoview/GeckoViewTestUtils.sys.mjs index a2ca252cdd..f0fdee5d81 100644 --- a/mobile/android/modules/geckoview/GeckoViewTestUtils.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewTestUtils.sys.mjs @@ -24,12 +24,15 @@ export const GeckoViewTabUtil = { if (subject.name === sessionId) { Services.obs.removeObserver( openingObserver, - "geckoview-window-created" + "browser-delayed-startup-finished" ); resolve(subject); } }; - Services.obs.addObserver(openingObserver, "geckoview-window-created"); + Services.obs.addObserver( + openingObserver, + "browser-delayed-startup-finished" + ); }); try { diff --git a/mobile/android/modules/geckoview/GeckoViewTranslations.sys.mjs b/mobile/android/modules/geckoview/GeckoViewTranslations.sys.mjs index 7e74e7bf30..45b43ac9f9 100644 --- a/mobile/android/modules/geckoview/GeckoViewTranslations.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewTranslations.sys.mjs @@ -50,8 +50,11 @@ export class GeckoViewTranslations extends GeckoViewModule { aData.toLanguage ); try { - this.getActor("Translations").translate(fromLanguage, toLanguage); - aCallback.onSuccess(); + this.getActor("Translations") + .translate(fromLanguage, toLanguage) + .then(() => { + aCallback.onSuccess(); + }); } catch (error) { aCallback.onError(`Could not translate: ${error}`); } @@ -101,10 +104,11 @@ export class GeckoViewTranslations extends GeckoViewModule { type: "GeckoView:Translations:Offer", }); break; - case "TranslationsParent:LanguageState": + case "TranslationsParent:LanguageState": { const { detectedLanguages, requestedTranslationPair, + hasVisibleChange, error, isEngineReady, } = aEvent.detail.actor.languageState; @@ -112,6 +116,7 @@ export class GeckoViewTranslations extends GeckoViewModule { const data = { detectedLanguages, requestedTranslationPair, + hasVisibleChange, error, isEngineReady, }; @@ -120,7 +125,9 @@ export class GeckoViewTranslations extends GeckoViewModule { type: "GeckoView:Translations:StateChange", data, }); + break; + } } } } diff --git a/mobile/android/modules/geckoview/GeckoViewWebExtension.sys.mjs b/mobile/android/modules/geckoview/GeckoViewWebExtension.sys.mjs index 749f753626..421839264a 100644 --- a/mobile/android/modules/geckoview/GeckoViewWebExtension.sys.mjs +++ b/mobile/android/modules/geckoview/GeckoViewWebExtension.sys.mjs @@ -283,6 +283,16 @@ function exportFlags(aPolicy) { return flags; } +function normalizePermissions(perms) { + if (perms?.permissions) { + perms = { ...perms }; + perms.permissions = perms.permissions.filter( + perm => !perm.startsWith("internal:") + ); + } + return perms; +} + async function exportExtension(aAddon, aPermissions, aSourceURI) { // First, let's make sure the policy is ready if present let policy = WebExtensionPolicy.getByID(aAddon.id); @@ -360,22 +370,12 @@ async function exportExtension(aAddon, aPermissions, aSourceURI) { updateDate = null; } - const normalizePermissions = perms => { - if (perms?.permissions) { - perms = { ...perms }; - perms.permissions = perms.permissions.filter( - perm => !perm.startsWith("internal:") - ); - } - return perms; - }; - const optionalPermissions = aAddon.optionalPermissions?.permissions ?? []; - const optionalOrigins = aAddon.optionalPermissions?.origins ?? []; + const optionalOrigins = aAddon.optionalOriginsNormalized; const grantedPermissions = - normalizePermissions(await lazy.ExtensionPermissions.get(id)) ?? []; - const grantedOptionalPermissions = grantedPermissions?.permissions ?? []; - const grantedOptionalOrigins = grantedPermissions?.origins ?? []; + normalizePermissions(await lazy.ExtensionPermissions.get(id)) ?? {}; + const grantedOptionalPermissions = grantedPermissions.permissions ?? []; + const grantedOptionalOrigins = grantedPermissions.origins ?? []; return { webExtensionId: id, @@ -623,6 +623,32 @@ class AddonManagerListener { // the GeckoView side when it is actually going to be available. this.onExtensionReady = this.onExtensionReady.bind(this); lazy.Management.on("ready", this.onExtensionReady); + lazy.Management.on("change-permissions", this.onOptionalPermissionsChanged); + } + + async onOptionalPermissionsChanged(type, { extensionId }) { + // In xpcshell tests there wil be test extensions that trigger this event while the + // AddonManager has not been started at all, on the contrary on a regular browser + // instance the AddonManager is expected to be already fully started for an extension + // for the extension to be able to reach the "ready" state, and so we just silently + // early exit here if the AddonManager is not ready. + if (!lazy.AddonManager.isReady) { + return; + } + + const addon = await lazy.AddonManager.getAddonByID(extensionId); + if (!addon) { + return; + } + const extension = await exportExtension( + addon, + addon.userPermissions, + /* aSourceURI */ null + ); + lazy.EventDispatcher.instance.sendRequest({ + type: "GeckoView:WebExtension:OnOptionalPermissionsChanged", + extension, + }); } async onExtensionReady(name, extInstance) { diff --git a/mobile/android/test_runner/src/main/java/org/mozilla/geckoview/test_runner/TestRunnerActivity.java b/mobile/android/test_runner/src/main/java/org/mozilla/geckoview/test_runner/TestRunnerActivity.java index 399f9417c2..0017298b86 100644 --- a/mobile/android/test_runner/src/main/java/org/mozilla/geckoview/test_runner/TestRunnerActivity.java +++ b/mobile/android/test_runner/src/main/java/org/mozilla/geckoview/test_runner/TestRunnerActivity.java @@ -174,7 +174,7 @@ public class TestRunnerActivity extends Activity { public GeckoResult<AllowOrDeny> onLoadRequest( final GeckoSession session, final LoadRequest request) { // Allow Gecko to load all URIs - return GeckoResult.fromValue(AllowOrDeny.ALLOW); + return GeckoResult.allow(); } @Override @@ -296,7 +296,7 @@ public class TestRunnerActivity extends Activity { public GeckoResult<AllowOrDeny> onCloseTab( @Nullable final WebExtension source, @NonNull final GeckoSession session) { closeSession(session); - return GeckoResult.fromValue(AllowOrDeny.ALLOW); + return GeckoResult.allow(); } @Override @@ -310,7 +310,7 @@ public class TestRunnerActivity extends Activity { mOwnedSessions.addFirst(session); } - return GeckoResult.fromValue(AllowOrDeny.ALLOW); + return GeckoResult.allow(); } }; diff --git a/mobile/android/version.txt b/mobile/android/version.txt index 9931f67c71..4aea959bf8 100644 --- a/mobile/android/version.txt +++ b/mobile/android/version.txt @@ -1 +1 @@ -126.0.1 +127.0 |