1
0
Fork 0

Copione merged onto master
continuous-integration/drone/push Build is passing Details

master
blallo 2020-03-29 00:00:52 +00:00
commit 20de2044c1
51 changed files with 865 additions and 205 deletions

View File

@ -0,0 +1,59 @@
/* 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.ui
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import okhttp3.mockwebserver.MockWebServer
import org.junit.Rule
import org.junit.Before
import org.junit.After
import org.junit.Test
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityIntentTestRule
import org.mozilla.fenix.ui.robots.homeScreen
/**
* Tests for verifying the advanced section in Settings
*
*/
class SettingsAdvancedTest {
/* ktlint-disable no-blank-line-before-rbrace */ // This imposes unreadable grouping.
private val mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
private lateinit var mockWebServer: MockWebServer
@get:Rule
val activityIntentTestRule = HomeActivityIntentTestRule()
@Before
fun setUp() {
mockWebServer = MockWebServer().apply {
setDispatcher(AndroidAssetDispatcher())
start()
}
}
@After
fun tearDown() {
mockWebServer.shutdown()
}
@Test
// Walks through settings menu and sub-menus to ensure all items are present
fun settingsAboutItemsTest() {
// ADVANCED
homeScreen {
}.openThreeDotMenu {
}.openSettings {
// ADVANCED
verifyAdvancedHeading()
verifyAddons()
verifyRemoteDebug()
verifyLeakCanaryButton()
}
}
}

View File

@ -49,7 +49,6 @@ class SettingsDeveloperToolsTest {
homeScreen {
}.openThreeDotMenu {
}.openSettings {
verifyDeveloperToolsHeading()
verifyRemoteDebug()
}
}

View File

@ -111,7 +111,6 @@ class SettingsPrivacyTest {
verifyDeleteBrowsingDataButton()
verifyDeleteBrowsingDataOnQuitButton()
verifyDataCollectionButton()
verifyLeakCanaryButton()
}
}

View File

@ -64,9 +64,9 @@ class SettingsRobot {
fun verifyLeakCanaryButton() = assertLeakCanaryButton()
fun verifySettingsView() = assertSettingsView()
// DEVELOPER TOOLS SECTION
fun verifyDeveloperToolsHeading() = assertDeveloperToolsHeading()
// ADVANCED SECTION
fun verifyAdvancedHeading() = assertAdvancedHeading()
fun verifyAddons() = assertAddons()
fun verifyRemoteDebug() = assertRemoteDebug()
// ABOUT SECTION
@ -174,7 +174,7 @@ private fun assertSettingsView() {
// verify that we are in the correct library view
assertGeneralHeading()
assertPrivacyHeading()
assertDeveloperToolsHeading()
assertAdvancedHeading()
assertAboutHeading()
}
@ -255,13 +255,22 @@ private fun assertDeleteBrowsingDataOnQuitButton() {
private fun assertDataCollectionButton() = onView(withText("Data collection"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertLeakCanaryButton() = onView(withText("LeakCanary"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
private fun assertLeakCanaryButton() {
scrollToElementByText("LeakCanary")
onView(withText("LeakCanary"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
// DEVELOPER TOOLS SECTION
private fun assertDeveloperToolsHeading() {
scrollToElementByText("Developer tools")
onView(withText("Developer tools"))
// ADVANCED SECTION
private fun assertAdvancedHeading() {
scrollToElementByText("Advanced")
onView(withText("Advanced"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}
private fun assertAddons() {
scrollToElementByText("Add-ons")
onView(withText("Add-ons"))
.check(matches(withEffectiveVisibility(Visibility.VISIBLE)))
}

View File

@ -86,6 +86,7 @@ import org.mozilla.fenix.ext.sessionsOfType
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.theme.ThemeManager
import org.mozilla.fenix.wifi.SitePermissionsWifiIntegration
import java.lang.ref.WeakReference
/**
@ -119,6 +120,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
private val fullScreenFeature = ViewBoundFeatureWrapper<FullScreenFeature>()
private val swipeRefreshFeature = ViewBoundFeatureWrapper<SwipeRefreshFeature>()
private val webchannelIntegration = ViewBoundFeatureWrapper<FxaWebChannelFeature>()
private val sitePermissionWifiIntegration = ViewBoundFeatureWrapper<SitePermissionsWifiIntegration>()
var customTabSessionId: String? = null
@ -392,6 +394,15 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
view = view
)
sitePermissionWifiIntegration.set(
feature = SitePermissionsWifiIntegration(
settings = context.settings(),
wifiConnectionMonitor = context.components.wifiConnectionMonitor
),
owner = this,
view = view
)
context.settings().setSitePermissionSettingListener(viewLifecycleOwner) {
// If the user connects to WIFI while on the BrowserFragment, this will update the
// SitePermissionsRules (specifically autoplay) accordingly
@ -536,6 +547,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session
override fun onStart() {
super.onStart()
requireComponents.core.sessionManager.register(this, this, autoPause = true)
sitePermissionWifiIntegration.get()?.maybeAddWifiConnectedListener()
}
@CallSuper

View File

@ -19,11 +19,9 @@ import mozilla.components.lib.publicsuffixlist.PublicSuffixList
import mozilla.components.support.migration.state.MigrationStore
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.test.Mockable
import org.mozilla.fenix.utils.ClipboardHandler
import org.mozilla.fenix.wifi.WifiConnectionMonitor
import org.mozilla.fenix.wifi.WifiIntegration
import java.util.concurrent.TimeUnit
private const val DAY_IN_MINUTES = 24 * 60L
@ -110,12 +108,5 @@ class Components(private val context: Context) {
val migrationStore by lazy { MigrationStore() }
val performance by lazy { PerformanceComponent() }
val push by lazy { Push(context, analytics.crashReporter) }
val wifiIntegration by lazy {
WifiIntegration(
settings = context.settings(),
wifiConnectionMonitor = WifiConnectionMonitor(
context as Application
)
)
}
val wifiConnectionMonitor by lazy { WifiConnectionMonitor(context as Application) }
}

View File

@ -7,6 +7,7 @@ import android.content.Context
import mozilla.components.service.fxa.ServerConfig
import mozilla.components.service.fxa.ServerConfig.Server
import org.mozilla.fenix.FeatureFlags
import org.mozilla.fenix.ext.settings
/**
* Utility to configure Firefox Account servers.
@ -24,6 +25,11 @@ object FxaServer {
}
fun config(context: Context): ServerConfig {
return ServerConfig(Server.RELEASE, CLIENT_ID, redirectUrl(context))
val serverOverride = context.settings().overrideFxAServer
val tokenServerOverride = context.settings().overrideSyncTokenServer.ifEmpty { null }
if (serverOverride.isEmpty()) {
return ServerConfig(Server.RELEASE, CLIENT_ID, redirectUrl(context), tokenServerOverride)
}
return ServerConfig(serverOverride, CLIENT_ID, redirectUrl(context), tokenServerOverride)
}
}

View File

@ -22,12 +22,12 @@ import org.mozilla.fenix.home.OnboardingState
import org.mozilla.fenix.home.Tab
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionHeaderViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.NoContentMessageWithActionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.PrivateBrowsingDescriptionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.SaveTabGroupViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabHeaderViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabInCollectionViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TabViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder
import org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding.OnboardingAutomaticSignInViewHolder
@ -172,7 +172,7 @@ class SessionControlAdapter(
NoContentMessageWithActionViewHolder.LAYOUT_ID -> NoContentMessageWithActionViewHolder(view)
CollectionHeaderViewHolder.LAYOUT_ID -> CollectionHeaderViewHolder(view)
CollectionViewHolder.LAYOUT_ID -> CollectionViewHolder(view, interactor)
TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, interactor)
TabInCollectionViewHolder.LAYOUT_ID -> TabInCollectionViewHolder(view, interactor, differentLastItem = true)
OnboardingHeaderViewHolder.LAYOUT_ID -> OnboardingHeaderViewHolder(view)
OnboardingSectionHeaderViewHolder.LAYOUT_ID -> OnboardingSectionHeaderViewHolder(view)
OnboardingAutomaticSignInViewHolder.LAYOUT_ID -> OnboardingAutomaticSignInViewHolder(view)

View File

@ -50,7 +50,7 @@ class SwipeToDeleteCallback(
icon?.setTint(recyclerView.context.getColorFromAttr(R.attr.destructive))
val backgroundDrawable = when {
viewHolder is TabInCollectionViewHolder && viewHolder.isLastTab -> {
viewHolder is TabInCollectionViewHolder && viewHolder.isLastItem -> {
R.drawable.tab_in_collection_last_swipe_background
}
viewHolder is TabInCollectionViewHolder -> {

View File

@ -17,7 +17,6 @@ import mozilla.components.browser.menu.BrowserMenuBuilder
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
import mozilla.components.feature.tab.collections.TabCollection
import org.mozilla.fenix.R
import org.mozilla.fenix.components.description
import org.mozilla.fenix.ext.getIconColor
import org.mozilla.fenix.ext.increaseTapArea
import org.mozilla.fenix.home.sessioncontrol.CollectionInteractor
@ -77,17 +76,18 @@ class CollectionViewHolder(
private fun updateCollectionUI() {
view.collection_title.text = collection.title
view.collection_description.text = collection.description(view.context)
val layoutParams = view.layoutParams as ViewGroup.MarginLayoutParams
view.isActivated = expanded
if (expanded) {
layoutParams.bottomMargin = 0
collection_title.setPadding(0, 0, 0, EXPANDED_PADDING)
view.collection_description.visibility = View.GONE
view.collection_share_button.visibility = View.VISIBLE
view.collection_overflow_button.visibility = View.VISIBLE
} else {
layoutParams.bottomMargin = COLLAPSED_MARGIN
view.collection_description.visibility = View.VISIBLE
view.collection_share_button.visibility = View.GONE
view.collection_overflow_button.visibility = View.GONE
}
view.collection_icon.colorFilter = createBlendModeColorFilterCompat(

View File

@ -10,7 +10,10 @@ import android.view.ViewOutlineProvider
import androidx.appcompat.content.res.AppCompatResources
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.tab_in_collection.*
import kotlinx.android.synthetic.main.list_element.list_element_title
import kotlinx.android.synthetic.main.list_element.list_item_action_button
import kotlinx.android.synthetic.main.list_element.list_item_favicon
import kotlinx.android.synthetic.main.list_element.list_item_url
import mozilla.components.feature.tab.collections.TabCollection
import mozilla.components.support.ktx.android.content.getColorFromAttr
import mozilla.components.support.ktx.android.util.dpToFloat
@ -25,6 +28,7 @@ import mozilla.components.feature.tab.collections.Tab as ComponentTab
class TabInCollectionViewHolder(
val view: View,
val interactor: CollectionInteractor,
private val differentLastItem: Boolean = false,
override val containerView: View? = view
) : RecyclerView.ViewHolder(view), LayoutContainer {
@ -32,11 +36,11 @@ class TabInCollectionViewHolder(
private set
lateinit var tab: ComponentTab
private set
var isLastTab = false
var isLastItem = false
init {
collection_tab_icon.clipToOutline = true
collection_tab_icon.outlineProvider = object : ViewOutlineProvider() {
list_item_favicon.clipToOutline = true
list_item_favicon.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline?) {
outline?.setRoundRect(
0,
@ -52,8 +56,8 @@ class TabInCollectionViewHolder(
interactor.onCollectionOpenTabClicked(tab)
}
collection_tab_close_button.increaseTapArea(buttonIncreaseDps)
collection_tab_close_button.setOnClickListener {
list_item_action_button.increaseTapArea(buttonIncreaseDps)
list_item_action_button.setOnClickListener {
interactor.onCollectionRemoveTab(collection, tab)
}
}
@ -61,28 +65,26 @@ class TabInCollectionViewHolder(
fun bindSession(collection: TabCollection, tab: ComponentTab, isLastTab: Boolean) {
this.collection = collection
this.tab = tab
this.isLastTab = isLastTab
this.isLastItem = isLastTab
updateTabUI()
}
private fun updateTabUI() {
collection_tab_hostname.text = tab.url.toShortUrl(view.context.components.publicSuffixList)
list_item_url.text = tab.url.toShortUrl(view.context.components.publicSuffixList)
collection_tab_title.text = tab.title
collection_tab_icon.context.components.core.icons.loadIntoView(collection_tab_icon, tab.url)
list_element_title.text = tab.title
list_item_favicon.context.components.core.icons.loadIntoView(list_item_favicon, tab.url)
// If I'm the last one...
if (isLastTab) {
// If last item and we want to change UI for it
if (isLastItem && differentLastItem) {
view.background = AppCompatResources.getDrawable(view.context, R.drawable.rounded_bottom_corners)
divider_line.visibility = View.GONE
} else {
view.setBackgroundColor(view.context.getColorFromAttr(R.attr.above))
divider_line.visibility = View.VISIBLE
}
}
companion object {
const val buttonIncreaseDps = 12
const val LAYOUT_ID = R.layout.tab_in_collection
const val LAYOUT_ID = R.layout.list_element
}
}

View File

@ -27,6 +27,7 @@ import kotlinx.android.synthetic.main.search_suggestions_onboarding.view.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import mozilla.components.concept.storage.HistoryStorage
import mozilla.components.feature.qr.QrFeature
import mozilla.components.feature.qr.QrFragment
import mozilla.components.lib.state.ext.consumeFrom
import mozilla.components.support.base.feature.UserInteractionHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
@ -278,6 +279,31 @@ class SearchFragment : Fragment(), UserInteractionHandler {
permissionDidUpdate = false
hideToolbar()
if (!isQrFragmentVisible()) {
refocusUrlView()
}
}
/**
* Refocus URL editText. Needed after the user brings back the app
* into the foreground.
* See https://github.com/mozilla-mobile/fenix/issues/6290
**/
private fun refocusUrlView() {
val urlView = toolbarView.view
.findViewById<InlineAutocompleteEditText>(R.id.mozac_browser_toolbar_edit_url_view)
if (!urlView.hasFocus()) {
urlView.requestFocus()
}
}
/**
* Check to see if QrFragment exists & is visible.
* */
private fun isQrFragmentVisible(): Boolean {
val foundQrFragment = parentFragmentManager.fragments.firstOrNull { it is QrFragment }
return foundQrFragment != null && foundQrFragment.isVisible
}
override fun onPause() {

View File

@ -10,6 +10,8 @@ import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.content.res.AppCompatResources
import android.os.Handler
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavDirections
import androidx.navigation.findNavController
@ -45,6 +47,7 @@ import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.settings.account.AccountAuthErrorPreference
import org.mozilla.fenix.settings.account.AccountPreference
import kotlin.system.exitProcess
@Suppress("LargeClass", "TooManyFunctions")
class SettingsFragment : PreferenceFragmentCompat() {
@ -300,6 +303,29 @@ class SettingsFragment : PreferenceFragmentCompat() {
requireComponents.core.engine.settings.remoteDebuggingEnabled = newValue
true
}
val preferenceFxAOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_fxa_server))
val preferenceSyncOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_sync_tokenserver))
val syncFxAOverrideUpdater = object : StringSharedPreferenceUpdater() {
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
return super.onPreferenceChange(preference, newValue).also {
updateFxASyncOverrideMenu()
Toast.makeText(
context,
getString(R.string.toast_override_fxa_sync_server_done),
Toast.LENGTH_LONG
).show()
Handler().postDelayed({
exitProcess(0)
}, FXA_SYNC_OVERRIDE_EXIT_DELAY)
}
}
}
preferenceFxAOverride?.onPreferenceChangeListener = syncFxAOverrideUpdater
preferenceSyncOverride?.onPreferenceChangeListener = syncFxAOverrideUpdater
}
private fun navigateFromSettings(directions: NavDirections) {
@ -343,6 +369,8 @@ class SettingsFragment : PreferenceFragmentCompat() {
val accountManager = requireComponents.backgroundServices.accountManager
val account = accountManager.authenticatedAccount()
updateFxASyncOverrideMenu()
// Signed-in, no problems.
if (account != null && !accountManager.accountNeedsReauth()) {
preferenceSignIn?.isVisible = false
@ -388,7 +416,31 @@ class SettingsFragment : PreferenceFragmentCompat() {
}
}
private fun updateFxASyncOverrideMenu() {
val preferenceFxAOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_fxa_server))
val preferenceSyncOverride =
findPreference<Preference>(getPreferenceKey(R.string.pref_key_override_sync_tokenserver))
val settings = requireContext().settings()
val show = settings.overrideFxAServer.isNotEmpty() ||
settings.overrideSyncTokenServer.isNotEmpty() ||
settings.showSecretDebugMenuThisSession
// Only enable changes to these prefs when the user isn't connected to an account.
val enabled = requireComponents.backgroundServices.accountManager.authenticatedAccount() == null
preferenceFxAOverride?.apply {
isVisible = show
isEnabled = enabled
summary = settings.overrideFxAServer.ifEmpty { null }
}
preferenceSyncOverride?.apply {
isVisible = show
isEnabled = enabled
summary = settings.overrideSyncTokenServer.ifEmpty { null }
}
}
companion object {
private const val SCROLL_INDICATOR_DELAY = 10L
private const val FXA_SYNC_OVERRIDE_EXIT_DELAY = 2000L
}
}

View File

@ -10,6 +10,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.core.content.pm.PackageInfoCompat
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.DividerItemDecoration
@ -20,6 +21,7 @@ import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.R
import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.lib.Do
import org.mozilla.fenix.settings.SupportUtils
import org.mozilla.fenix.settings.about.AboutItemType.LICENSING_INFO
@ -36,6 +38,8 @@ import org.mozilla.geckoview.BuildConfig as GeckoViewBuildConfig
class AboutFragment : Fragment(), AboutPageListener {
private lateinit var appName: String
private val aboutPageAdapter: AboutPageAdapter = AboutPageAdapter(this)
private var secretDebugMenuClicks = 0
private var lastDebugMenuToast: Toast? = null
override fun onCreateView(
inflater: LayoutInflater,
@ -49,6 +53,11 @@ class AboutFragment : Fragment(), AboutPageListener {
return rootView
}
override fun onResume() {
super.onResume()
secretDebugMenuClicks = 0
}
@ExperimentalCoroutinesApi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@ -63,8 +72,36 @@ class AboutFragment : Fragment(), AboutPageListener {
)
}
// 5 taps on the logo activate the "secret" debug menu.
wordmark.setOnClickListener {
// Because the user will mostly likely tap the logo in rapid succession,
// we ensure only 1 toast is shown at any given time.
lastDebugMenuToast?.let { toast -> toast.cancel() }
secretDebugMenuClicks += 1
when (secretDebugMenuClicks) {
in 2 until SECRET_DEBUG_MENU_CLICKS -> {
val clicksLeft = SECRET_DEBUG_MENU_CLICKS - secretDebugMenuClicks
val toast = Toast.makeText(
context,
getString(R.string.about_debug_menu_toast_progress, clicksLeft),
Toast.LENGTH_SHORT
)
toast.show()
lastDebugMenuToast = toast
}
SECRET_DEBUG_MENU_CLICKS -> {
Toast.makeText(
context,
getString(R.string.about_debug_menu_toast_done),
Toast.LENGTH_LONG
).show()
requireContext().settings().showSecretDebugMenuThisSession = true
}
}
}
populateAboutHeader()
aboutPageAdapter.updateData(populateAboutList())
aboutPageAdapter.submitList(populateAboutList())
}
private fun populateAboutHeader() {
@ -183,5 +220,7 @@ class AboutFragment : Fragment(), AboutPageListener {
companion object {
private const val ABOUT_LICENSE_URL = "about:license"
// Number of clicks on the app logo to enable the "secret" debug menu.
private const val SECRET_DEBUG_MENU_CLICKS = 5
}
}

View File

@ -6,33 +6,33 @@ package org.mozilla.fenix.settings.about
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.VisibleForTesting
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import org.mozilla.fenix.settings.about.viewholders.AboutItemViewHolder
class AboutPageAdapter(private val listener: AboutPageListener) : RecyclerView.Adapter<AboutItemViewHolder>() {
@VisibleForTesting
var aboutList: List<AboutPageItem>? = null
fun updateData(items: List<AboutPageItem>) {
this.aboutList = items
notifyDataSetChanged()
}
class AboutPageAdapter(private val listener: AboutPageListener) :
ListAdapter<AboutPageItem, AboutItemViewHolder>(DiffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AboutItemViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(AboutItemViewHolder.LAYOUT_ID, parent, false)
return AboutItemViewHolder(view, listener)
}
override fun getItemCount(): Int = aboutList?.size ?: 0
override fun onBindViewHolder(holder: AboutItemViewHolder, position: Int) {
(aboutList?.get(position) as AboutPageItem.Item).also {
holder.bind(it)
}
holder.bind(getItem(position) as AboutPageItem.Item)
}
private object DiffCallback : DiffUtil.ItemCallback<AboutPageItem>() {
override fun areItemsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) =
oldItem === newItem
override fun areContentsTheSame(oldItem: AboutPageItem, newItem: AboutPageItem) =
when (oldItem) {
is AboutPageItem.Item ->
newItem is AboutPageItem.Item && oldItem.title == newItem.title
}
}
}

View File

@ -65,6 +65,7 @@ class SavedLoginsFragment : Fragment() {
savedLoginsStore = StoreProvider.get(this) {
SavedLoginsFragmentStore(
SavedLoginsFragmentState(
isLoading = true,
items = listOf(),
filteredItems = listOf()
)

View File

@ -48,6 +48,7 @@ sealed class SavedLoginsFragmentAction : Action {
* @property items Filtered (or not) list of logins to display
*/
data class SavedLoginsFragmentState(
val isLoading: Boolean = false,
val items: List<SavedLoginsItem>,
val filteredItems: List<SavedLoginsItem>
) : State
@ -61,14 +62,19 @@ private fun savedLoginsStateReducer(
): SavedLoginsFragmentState {
return when (action) {
is SavedLoginsFragmentAction.UpdateLogins -> state.copy(
isLoading = false,
items = action.list,
filteredItems = action.list
)
is SavedLoginsFragmentAction.FilterLogins -> {
if (action.newText.isNullOrBlank()) {
state.copy(filteredItems = state.items)
state.copy(
isLoading = false,
filteredItems = state.items)
} else {
state.copy(filteredItems = state.items.filter { it.url.contains(action.newText) })
state.copy(
isLoading = false,
filteredItems = state.items.filter { it.url.contains(action.newText) })
}
}
}

View File

@ -14,6 +14,7 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.component_saved_logins.view.*
import kotlinx.android.synthetic.main.component_saved_logins.view.progress_bar
import org.mozilla.fenix.R
/**
@ -69,8 +70,13 @@ class SavedLoginsView(
}
fun update(state: SavedLoginsFragmentState) {
view.saved_logins_list.isVisible = state.items.isNotEmpty()
view.saved_passwords_empty_view.isVisible = state.items.isEmpty()
if (state.isLoading) {
view.progress_bar.isVisible = true
} else {
view.progress_bar.isVisible = false
view.saved_logins_list.isVisible = state.items.isNotEmpty()
view.saved_passwords_empty_view.isVisible = state.items.isEmpty()
}
loginsAdapter.submitList(state.filteredItems)
}
}

View File

@ -4,7 +4,6 @@
package org.mozilla.fenix.settings.sitepermissions
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.net.Uri
@ -30,7 +29,6 @@ import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.AL
import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.ASK_TO_ALLOW
import mozilla.components.feature.sitepermissions.SitePermissionsRules.Action.BLOCKED
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.settings.PhoneFeature
@ -122,7 +120,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
// TODO replace with AUTOPLAY_ALLOW_ON_WIFI when
// https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug
// makes ALLOW_ALL behave as ALLOW_ON_WIFI
saveActionInSettings(it.context, AUTOPLAY_ALLOW_ALL)
saveActionInSettings(AUTOPLAY_ALLOW_ALL)
}
// TODO replace with AUTOPLAY_ALLOW_ON_WIFI when
// https://bugzilla.mozilla.org/show_bug.cgi?id=1621825 is fixed. This GV bug
@ -144,7 +142,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
visibility = View.VISIBLE
text = getString(R.string.preference_option_autoplay_block_audio2)
setOnClickListener {
saveActionInSettings(it.context, AUTOPLAY_BLOCK_AUDIBLE)
saveActionInSettings(AUTOPLAY_BLOCK_AUDIBLE)
}
restoreState(AUTOPLAY_BLOCK_AUDIBLE)
} else {
@ -162,7 +160,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
getString(R.string.phone_feature_recommended)
)
setOnClickListener {
saveActionInSettings(it.context, AUTOPLAY_BLOCK_ALL)
saveActionInSettings(AUTOPLAY_BLOCK_ALL)
}
restoreState(AUTOPLAY_BLOCK_ALL)
} else {
@ -195,19 +193,18 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() {
* See [Settings.setAutoplayUserSetting] kdoc for an explanation of why this cannot follow the
* same code path as other permissions.
*/
private fun saveActionInSettings(context: Context, autoplaySetting: Int) {
private fun saveActionInSettings(autoplaySetting: Int) {
settings.setAutoplayUserSetting(autoplaySetting)
val (audible, inaudible) = when (autoplaySetting) {
AUTOPLAY_ALLOW_ALL -> ALLOWED to ALLOWED
AUTOPLAY_ALLOW_ALL,
AUTOPLAY_ALLOW_ON_WIFI -> {
context.components.wifiIntegration.addWifiConnectedListener()
settings.setAutoplayUserSetting(AUTOPLAY_ALLOW_ON_WIFI)
return
}
AUTOPLAY_BLOCK_AUDIBLE -> BLOCKED to ALLOWED
AUTOPLAY_BLOCK_ALL -> BLOCKED to BLOCKED
else -> return
}
context.components.wifiIntegration.removeWifiConnectedListener()
settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_AUDIBLE, audible)
settings.setSitePermissionsPhoneFeatureAction(AUTOPLAY_INAUDIBLE, inaudible)
}

View File

@ -187,6 +187,8 @@ class Settings private constructor(
(trackingProtectionOnboardingCount < trackingProtectionOnboardingMaximumCount &&
!trackingProtectionOnboardingShownThisSession)
var showSecretDebugMenuThisSession = false
val shouldShowSecurityPinWarningSync: Boolean
get() = loginsSecureWarningSyncCount < showLoginsSecureWarningSyncMaxCount
@ -597,4 +599,14 @@ class Settings private constructor(
appContext.getPreferenceKey(R.string.pref_key_open_links_in_external_app),
default = false
)
var overrideFxAServer by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_override_fxa_server),
default = ""
)
var overrideSyncTokenServer by stringPreference(
appContext.getPreferenceKey(R.string.pref_key_override_sync_tokenserver),
default = ""
)
}

View File

@ -5,6 +5,7 @@
package org.mozilla.fenix.wifi
import mozilla.components.feature.sitepermissions.SitePermissionsRules
import mozilla.components.support.base.feature.LifecycleAwareFeature
import org.mozilla.fenix.settings.PhoneFeature
import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_ALLOW_ON_WIFI
import org.mozilla.fenix.settings.sitepermissions.AUTOPLAY_BLOCK_ALL
@ -14,7 +15,10 @@ import org.mozilla.fenix.utils.Settings
* Handles implementation details of only setting up a WIFI connectivity listener if the current
* user settings require it.
*/
class WifiIntegration(private val settings: Settings, private val wifiConnectionMonitor: WifiConnectionMonitor) {
class SitePermissionsWifiIntegration(
private val settings: Settings,
private val wifiConnectionMonitor: WifiConnectionMonitor
) : LifecycleAwareFeature {
/**
* Adds listener for autplay setting [AUTOPLAY_ALLOW_ON_WIFI]. Sets all autoplay to allowed when
@ -51,7 +55,7 @@ class WifiIntegration(private val settings: Settings, private val wifiConnection
// only works while WIFI is active, so we are not using AUTOPLAY_ALLOW_ON_WIFI (or this class).
// Once that is fixed, [start] and [maybeAddWifiConnectedListener] will need to be called on
// activity startup.
fun start() { wifiConnectionMonitor.start() }
override fun start() { wifiConnectionMonitor.start() }
fun stop() { wifiConnectionMonitor.stop() }
override fun stop() { wifiConnectionMonitor.stop() }
}

View File

@ -1,14 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
<?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
xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_collection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="12dp"
android:background="@drawable/collection_home_list_row_background"
android:clickable="true"
@ -22,25 +20,26 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginTop="12dp"
android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_tab_collection"
android:tint="@null"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_tab_collection" />
<TextView
android:id="@+id/collection_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginStart="24dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:ellipsize="end"
android:gravity="start"
android:maxLines="1"
android:minLines="1"
android:textAppearance="@style/Header16TextStyle"
android:textAppearance="@style/Header14TextStyle"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@id/chevron"
app:layout_constraintHorizontal_bias="0.0"
@ -61,32 +60,18 @@
app:layout_constraintStart_toEndOf="@+id/collection_title"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/collection_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:ellipsize="end"
android:maxLines="2"
android:minLines="2"
android:textAppearance="@style/SubtitleTextStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/collection_share_button"
app:layout_constraintStart_toStartOf="@id/collection_title"
app:layout_constraintTop_toBottomOf="@id/collection_title"
tools:text="@tools:sample/lorem/random" />
<ImageButton
android:id="@+id/collection_share_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/share_button_content_description"
app:srcCompat="@drawable/ic_hollow_share"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/collection_icon"
app:layout_constraintEnd_toStartOf="@id/collection_overflow_button"
app:layout_constraintTop_toTopOf="@id/collection_icon" />
app:layout_constraintTop_toTopOf="@id/collection_icon"
app:srcCompat="@drawable/ic_hollow_share"
tools:visibility="visible" />
<ImageButton
android:id="@+id/collection_overflow_button"
@ -94,10 +79,12 @@
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/collection_menu_button_content_description"
app:srcCompat="@drawable/ic_menu"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/collection_icon"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/collection_icon" />
app:layout_constraintTop_toTopOf="@id/collection_icon"
app:srcCompat="@drawable/ic_menu"
tools:visibility="visible" />
<View
android:id="@+id/selected_border"

View File

@ -8,6 +8,17 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:indeterminate="true"
android:layout_width="match_parent"
android:layout_height="8dp"
android:translationY="-3dp"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/saved_passwords_empty_view"
android:layout_width="match_parent"

View File

@ -109,7 +109,6 @@
android:id="@+id/divider_line"
android:layout_width="match_parent"
android:layout_height="1.5dp"
android:layout_marginStart="8dp"
android:background="?neutralFaded"
app:layout_constraintEnd_toEndOf="@id/fill_link_from_clipboard"
app:layout_constraintStart_toStartOf="@id/fill_link_from_clipboard"

View File

@ -5,9 +5,9 @@
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/tab_in_collection_item"
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="56dp"
android:background="?above"
android:clickable="true"
android:clipToPadding="false"
@ -16,49 +16,52 @@
android:foreground="?android:attr/selectableItemBackground">
<ImageView
android:id="@+id/collection_tab_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="16dp"
android:layout_marginTop="23dp"
android:layout_marginBottom="24dp"
android:id="@+id/list_item_favicon"
android:layout_width="40dp"
android:layout_height="40dp"
android:background="@drawable/rounded_grey_corners_transparent_center"
android:padding="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:importantForAccessibility="no"
app:srcCompat="@drawable/ic_tab_collection"
android:tint="@null"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintTop_toBottomOf="parent"/>
<TextView
android:id="@+id/collection_tab_hostname"
android:id="@+id/list_element_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="8dp"
android:layout_marginStart="16dp"
android:layout_marginTop="9dp"
android:layout_marginEnd="74dp"
android:ellipsize="end"
android:maxLines="1"
android:minLines="1"
android:textAppearance="@style/Header12TextStyle"
app:layout_constraintEnd_toStartOf="@id/collection_tab_close_button"
app:layout_constraintStart_toEndOf="@id/collection_tab_icon"
android:singleLine="true"
android:textAppearance="@style/Body14TextStyle"
app:layout_constraintEnd_toStartOf="@id/list_item_action_button"
app:layout_constraintStart_toEndOf="@id/list_item_favicon"
app:layout_constraintBottom_toTopOf="@id/list_item_url"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/collection_tab_title"
android:id="@+id/list_item_url"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:textColor="?secondaryText"
android:textSize="10sp"
android:ellipsize="end"
android:maxLines="2"
android:minLines="2"
android:textAppearance="@style/Body14TextStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/collection_tab_hostname"
app:layout_constraintStart_toStartOf="@id/collection_tab_hostname"
app:layout_constraintTop_toBottomOf="@id/collection_tab_hostname" />
app:layout_constraintEnd_toEndOf="@id/list_element_title"
app:layout_constraintStart_toStartOf="@id/list_element_title"
app:layout_constraintTop_toBottomOf="@id/list_element_title" />
<ImageButton
android:id="@+id/collection_tab_close_button"
android:id="@+id/list_item_action_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:alpha="0.8"
@ -66,14 +69,7 @@
android:contentDescription="@string/close_tab"
app:srcCompat="@drawable/ic_close"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/divider_line"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="?neutralFaded"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1069,6 +1069,9 @@
<string name="etp_panel_off">Der Schutz für diese Website ist deaktiviert</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Verbesserter Schutz vor Aktivitätenverfolgung ist für diese Websites deaktiviert</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Rückwärts navigieren</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Ihre Rechte</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1038,6 +1038,9 @@
<string name="etp_panel_off">Šćit jo znjemóžnjony za toś to sedło</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Pólěpšony slědowański šćit jo znjemóžnjony za toś te sedła</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Slědk nawigěrowaś</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Waše pšawa</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -107,7 +107,7 @@
<!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Reader view</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Open in app</string>
<string name="browser_menu_open_app_link">Open in App</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
<string name="browser_menu_read_appearance">Appearance</string>
@ -1028,6 +1028,9 @@
<string name="etp_panel_off">Protections are OFF for this site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Enhanced Tracking Protection is off for these websites</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Navigate back</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Your rights</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -106,7 +106,7 @@
<!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Reader view</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Open in app</string>
<string name="browser_menu_open_app_link">Open in App</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
<string name="browser_menu_read_appearance">Appearance</string>

View File

@ -1057,6 +1057,9 @@
<string name="etp_panel_off">Las protecciones están OFF para este sitio</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">La protección contra rastreo aumentada está deshabilitada para estos sitios</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Ir hacia atrás</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Tus derechos</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App name for private browsing mode, only the "Private" portion should be localized. -->
<string name="app_name_private_2">Firefox Preview privado</string>
<!-- App name for private browsing mode, only the "Private" portion should be localized. -->
<string name="app_name_private_3">Firefox Preview (privado)</string>
<!-- Home Fragment -->
<!-- Content description (not visible, for screen readers etc.): "Three dot" menu button. -->
<string name="content_description_menu">Más opciones</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_private_browsing_button">Habilitar navegación privada</string>
<!-- Content description (not visible, for screen readers etc.): "Private Browsing" menu button. -->
<string name="content_description_disable_private_browsing_button">Deshabilitar navegación privada</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="search_hint">Buscar o ingresar dirección</string>
<!-- No Open Tabs Message Header -->
<string name="no_open_tabs_header_2">No hay pestañas abiertas</string>
<!-- No Open Tabs Message Description -->
<string name="no_open_tabs_description">Las pestañas abiertas aparecerán aquí.</string>
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">Estás en una sesión privada</string>
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_placeholder_description">%1$s limpia tu historial de búsqueda y navegación cuando cierras la aplicación o todas las pestañas privadas. Aunque no te hace anónimo para los sitios web o proveedores de servicios de Internet,
te ayuda a mantener en privado lo que haces en línea frente a cualquier otra persona que use este dispositivo.</string>
<string name="private_browsing_common_myths">Mitos comunes sobre la navegación privada</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">Eliminar sesión</string>
<!-- Private mode shortcut "contextual feature recommender" (CFR) -->
<!-- Text for the main message -->
<string name="cfr_message">Agregar un acceso directo para abrir pestañas privadas desde su pantalla de inicio.</string>
<!-- Text for the positive button -->
<string name="cfr_pos_button_text">Agregar acceso directo</string>
<!-- Text for the negative button -->
<string name="cfr_neg_button_text">No, gracias</string>
<!-- Home screen icons - Long press shortcuts -->
<!-- Shortcut action to open new tab -->
<string name="home_screen_shortcut_open_new_tab_2">Nueva pestaña</string>
<!-- Shortcut action to open new private tab -->
<string name="home_screen_shortcut_open_new_private_tab_2">Nueva pestaña privada</string>
<!-- Browser Fragment -->
<!-- Content description (not visible, for screen readers etc.): Navigate to open tabs -->
<string name="browser_tabs_button">Abrir pestañas</string>
<!-- Content description (not visible, for screen readers etc.): Navigate backward (browsing history) -->
<string name="browser_menu_back">Atrás</string>
<!-- Content description (not visible, for screen readers etc.): Navigate forward (browsing history) -->
<string name="browser_menu_forward">Avanzar</string>
<!-- Content description (not visible, for screen readers etc.): Refresh current website -->
<string name="browser_menu_refresh">Actualizar</string>
<!-- Content description (not visible, for screen readers etc.): Stop loading current website -->
<string name="browser_menu_stop">Detener</string>
<!-- Content description (not visible, for screen readers etc.): Bookmark the current page -->
<string name="browser_menu_bookmark">Marcador</string>
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">Editar marcador</string>
<!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_add_ons">Complementos</string>
<!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">No hay complementos aquí</string>
<!-- Browser menu button that sends a user to help articles -->
<string name="browser_menu_help">Ayuda</string>
<!-- Browser menu button that sends a to a the what's new article -->
<string name="browser_menu_whats_new">Novedades</string>
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">Ajustes</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">Biblioteca</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Sitio de escritorio</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 installs a Progressive Web App shortcut to the site on the device home screen. -->
<string name="browser_menu_install_on_homescreen">Instalar</string>
<!-- Browser menu button that opens the find in page menu -->
<string name="browser_menu_find_in_page">Encontrar en página</string>
<!-- Browser menu button that creates a private tab -->
<string name="browser_menu_private_tab">Pestaña privada</string>
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">Nueva pestaña</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection_2">Guardar en colección</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">Reportar problema con el sitio</string>
<!-- Browser menu button that open a share menu to share the current site -->
<string name="browser_menu_share">Compartir</string>
<!-- Share menu title, displayed when a user is sharing their current site -->
<string name="menu_share_with">Compartir con…</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>
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by">PATROCINADO POR %1$s</string>
<!-- Browser menu text shown in custom tabs to indicate this is a Fenix tab
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="browser_menu_powered_by2">Patrocinado por %1$s</string>
<!-- Browser menu button to put the the current page in reader mode -->
<string name="browser_menu_read">Vista de lectura</string>
<!-- Browser menu button to open the current page in an external app -->
<string name="browser_menu_open_app_link">Abrir en la aplicación</string>
<!-- Browser menu button to configure reader mode appearance e.g. the used font type and size -->
<string name="browser_menu_read_appearance">Apariencia</string>
<!-- Locale Settings Fragment -->
<!-- Content description for tick mark on selected language -->
<string name="a11y_selected_locale_content_description">Seleccionar idioma</string>
<!-- Content description for search icon -->
<string name="a11y_search_icon_content_description">Buscar</string>
<!-- Text for default locale item -->
<string name="default_locale_text">Usar el idioma del dispositivo</string>
<!-- Placeholder text shown in the search bar before a user enters text -->
<string name="locale_search_hint">Buscar idioma</string>
<!-- Search Fragment -->
<!-- Button in the search view that lets a user search by scanning a QR code -->
<string name="search_scan_button">Escanear</string>
<!-- Button in the search view that lets a user search by using a shortcut -->
<string name="search_shortcuts_button">Atajos</string>
<!-- Button in the search view when shortcuts are displayed that takes a user to the search engine settings -->
<string name="search_shortcuts_engine_settings">Configuración del buscador</string>
<!-- DEPRECATED: Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with">Buscar con</string>
<!-- Header displayed when selecting a shortcut search engine -->
<string name="search_shortcuts_search_with_2">Esta vez, buscar con:</string>
<!-- Button in the search view that lets a user navigate to the site in their clipboard -->
<string name="awesomebar_clipboard_title">Pegar enlace del portapapeles</string>
<!-- Button in the search suggestions onboarding that allows search suggestions in private sessions -->
<string name="search_suggestions_onboarding_allow_button">Permitir</string>
<!-- Button in the search suggestions onboarding that does not allow search suggestions in private sessions -->
<string name="search_suggestions_onboarding_do_not_allow_button">No compartir</string>
<!-- Search suggestion onboarding hint title text -->
<string name="search_suggestions_onboarding_title">¿Permitir sugerencias de búsqueda en sesiones privadas?</string>
<!-- Search suggestion onboarding hint description text, first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="search_suggestions_onboarding_text">%s compartirá todo lo que escribas en la barra de direcciones con tu buscador predeterminado.</string>
</resources>

View File

@ -1052,6 +1052,9 @@
<string name="etp_panel_off">Suojaukset ovat POIS PÄÄLTÄ tällä sivustolla</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Tehostettu seurannan suojaus ei ole käytössä näillä sivustoilla</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Siirry taaksepäin</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Oikeutesi</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1071,6 +1071,9 @@
<string name="etp_panel_off">Les protections sont désactivées pour ce site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">La protection renforcée contre le pistage est désactivée pour ces sites web</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Précédent</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Vos droits</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1057,6 +1057,9 @@
<string name="etp_panel_off">Umi ñemoã ojepeáma ko tendápe g̃uarã</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Ñemoã tapykuehogua oñemboguéma koã tendápe g̃uarã</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Eikundaha tapykuévo</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Nde derécho</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -71,7 +71,7 @@
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_library">Biblioteka</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">Web-stanica za desktop</string>
<string name="browser_menu_desktop_site">Klasični prikaz</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 installs a Progressive Web App shortcut to the site on the device home screen. -->
@ -337,7 +337,7 @@
<!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">Uključi sinkronizaciju</string>
<!-- Preference for pairing -->
<string name="preferences_sync_pair">Skeniraj kod za uparivanje u desktop Firefoxu</string>
<string name="preferences_sync_pair">Skeniraj kôd za uparivanje u Firefoxu za računalo</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">Prijavi se</string>
<!-- Preference for reconnecting to FxA sync -->
@ -381,7 +381,7 @@
<!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">Zabilješke</string>
<!-- Option in library to open Desktop Bookmarks root page -->
<string name="library_desktop_bookmarks_root">Desktop zabilješke</string>
<string name="library_desktop_bookmarks_root">Zabilješke računala</string>
<!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">Izbornik za zabilješke</string>
<!-- Option in library to open Desktop Bookmarks "toolbar" page -->

View File

@ -1039,6 +1039,9 @@
<string name="etp_panel_off">Škit je znjemóžnjeny za tute sydło</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Polěpšeny slědowanski škit je znjemóžnjeny za tute sydła</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Wróćo nawigować</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Waše prawa</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -948,6 +948,9 @@
<string name="etp_panel_off">ההגנות כבויות עבור אתר זה</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">הגנת מעקב מתקדמת כבויה עבור האתרים האלו</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">ניווט אחורה</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">הזכויות שלך</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1082,6 +1082,9 @@
<string name="etp_panel_off">이 사이트에서 보호 꺼짐</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">이 웹 사이트에 대해 향상된 추적 방지 기능이 꺼져 있습니다</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">뒤로</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">사용자 권리</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -21,6 +21,10 @@
<!-- Private Browsing -->
<!-- Title for private session option -->
<string name="private_browsing_title">आपण खाजगी सत्रात आहात</string>
<!-- Explanation for private browsing displayed to users on home view when they first enable private mode
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="private_browsing_placeholder_description">आपण अप किंवा सर्व खाजगी टॅब बंद केल्यावर आपला शोध किंवा ब्राऊझिंग इतिहास %1$s मिटवते. यामुळे आपण वापरणाऱ्या साईट किंवा इंटरनेट सेवा देणार्यांपासून आपण होत नाही,
पण आपण ऑनलाईन काय करता हे आपले डिव्हाईस वापरणाऱ्या इतरांपासून खाजगी ठेवण्यास सोपे होते.</string>
<string name="private_browsing_common_myths">खाजगी ब्राउझिंग बद्दल सामान्य समजुती</string>
<!-- Delete session button to erase your history in a private session -->
<string name="private_browsing_delete_session">सत्र हटवा</string>
@ -56,7 +60,7 @@
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">वाचनखूण संपादीत करा</string>
<!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_addon_manager">अ‍ॅड-ऑन व्यवस्थापक</string>
<string name="browser_menu_add_ons">ॲड-ऑन</string>
<!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">येथे अ‍ॅड-ऑन नाहीत</string>
<!-- Browser menu button that sends a user to help articles -->
@ -66,7 +70,7 @@
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">सेटिंग</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_your_library">आपे ग्रंथ</string>
<string name="browser_menu_library">लायब्ररी</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">डेस्कटॉप साइट</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
@ -80,7 +84,7 @@
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">नवीन टॅब</string>
<!-- Browser menu button that saves the current tab to a collection -->
<string name="browser_menu_save_to_collection">संग्रहात जतन करा</string>
<string name="browser_menu_save_to_collection_2">संग्रहात जतन करा</string>
<!-- Browser menu button that opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">साईटची त्रुटी कळवा</string>
<!-- Browser menu button that open a share menu to share the current site -->
@ -134,6 +138,8 @@
<string name="search_suggestions_onboarding_do_not_allow_button">परवानगी देऊ नका</string>
<!-- Search suggestion onboarding hint title text -->
<string name="search_suggestions_onboarding_title">खाजगी सत्रांमध्ये शोध प्रस्तावांना परवानगी द्यायची का?</string>
<!-- Search suggestion onboarding hint description text, first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="search_suggestions_onboarding_text">पत्ता पट्टी मध्ये आपण जे काही टाईप कराल ते सर्व %s आपल्या पूर्वनिर्धारित शोध इंजिन सह शेअर करेल.</string>
<!-- Search suggestion onboarding hint Learn more link text -->
<string name="search_suggestions_onboarding_learn_more_link">अधिक जाणून घ्या</string>
@ -187,6 +193,8 @@
<string name="preferences_private_browsing_options">गोपनीय ब्राउझिंग</string>
<!-- Preference for opening links in a private tab-->
<string name="preferences_open_links_in_a_private_tab">दुवा खाजगी टॅबमध्ये उघडा</string>
<!-- Preference for adding private browsing shortcut -->
<string name="preferences_add_private_browsing_shortcut">खाजगी ब्राउझिंग शॉर्टकट जोडा</string>
<!-- Preference for accessibility -->
<string name="preferences_accessibility">सुलभता</string>
<!-- Preference category for account information -->
@ -199,6 +207,8 @@
<string name="preferences_theme">रंगयोजना</string>
<!-- Preference for settings related to visual options -->
<string name="preferences_customize">स्वेच्छेनुरूप करा</string>
<!-- Preference description for banner about signing in -->
<string name="preferences_sign_in_description">आपल्या Firefox खात्यासह बुकमार्क, इतिहास आणि बरेच काही सिंक करा</string>
<!-- Preference shown instead of account display name while account profile information isn't available yet. -->
<string name="preferences_account_default_name">Firefox खाते</string>
<!-- Preference text for account title when there was an error syncing FxA -->
@ -214,6 +224,16 @@
<!-- Preference category for developer tools -->
<string name="developer_tools_category">विकासकांची साधने</string>
<!-- Preference for developers -->
<string name="preferences_remote_debugging">USB द्वारे दूरस्थ डीबगिंग</string>
<!-- Preference title for switch preference to show search shortcuts -->
<string name="preferences_show_search_shortcuts">शोध शॉर्टकट दर्शवा</string>
<!-- Preference title for switch preference to show search suggestions -->
<string name="preferences_show_search_suggestions">शोध सूचना दाखवा</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">खाजगी सत्रांमध्ये दर्शवा</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">क्लिपबोर्ड सूचना दर्शवा</string>
<!-- Preference title for switch preference to suggest browsing history when searching -->
<string name="preferences_search_browsing_history">ब्राउझिंग इतिहास शोधा</string>
<!-- Preference title for switch preference to suggest bookmarks when searching -->
@ -228,6 +248,8 @@
<!-- Account Preferences -->
<!-- Preference for triggering sync -->
<string name="preferences_sync_now">आत्ता सिंक करा</string>
<!-- Preference category for sync -->
<string name="preferences_sync_category">काय सिंक करायचे ते निवडा</string>
<!-- Preference for syncing history -->
<string name="preferences_sync_history">इतिहास</string>
<!-- Preference for syncing bookmarks -->
@ -239,45 +261,87 @@
<!-- Preference displays and allows changing current FxA device name -->
<string name="preferences_sync_device_name">डिव्हाईसचे नाव</string>
<!-- Text shown when user enters empty device name -->
<string name="empty_device_name_error">डिव्हाइसचे नाव रिक्त असू शकत नाही.</string>
<!-- Label indicating that sync is in progress -->
<string name="sync_syncing_in_progress">सिंक करत आहे…</string>
<!-- Label summary indicating that sync failed. The first parameter is the date stamp showing last time it succeeded -->
<string name="sync_failed_summary">सिंक अयशस्वी. शेवटचे यश: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_failed_never_synced_summary">सिंक अयशस्वी. शेवटचे सिंक: कधीच नाही</string>
<!-- Label summary the date we last synced. The first parameter is date stamp showing last time synced -->
<string name="sync_last_synced_summary">शेवटचे सिंक: %s</string>
<!-- Label summary showing never synced -->
<string name="sync_never_synced_summary">शेवटचे सिंक: कधीच नाही</string>
<!-- Text for displaying the default device name.
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">%s %s %s वर</string>
<!-- Send Tab -->
<!-- Name of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_name">प्राप्त टॅब</string>
<!-- Description of the "receive tabs" notification channel. Displayed in the "App notifications" system settings for the app -->
<string name="fxa_received_tab_channel_description">इतर Firefox डिव्हाइसमधून प्राप्त केलेल्या टॅबच्या सूचना.</string>
<!-- The body for these is the URL of the tab received -->
<string name="fxa_tab_received_notification_name">टॅब प्राप्त झाला</string>
<!-- When multiple tabs have been received -->
<string name="fxa_tabs_received_notification_name">टॅब प्राप्त झाले</string>
<!-- %s is the device name -->
<string name="fxa_tab_received_from_notification_name">%s कडून टॅब</string>
<!-- Advanced Preferences -->
<!-- Preference for tracking protection settings -->
<string name="preferences_tracking_protection_settings">ट्रॅकिंग संरक्षण</string>
<!-- Preference switch for tracking protection -->
<string name="preferences_tracking_protection">ट्रॅकिंग संरक्षण</string>
<!-- Preference switch description for tracking protection -->
<string name="preferences_tracking_protection_description">ऑनलाइन ट्रॅक करणारी मजकूर आणि स्क्रिप्ट अवरोधित करा</string>
<!-- Preference for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions">अपवाद</string>
<!-- Preference description for tracking protection exceptions -->
<string name="preferences_tracking_protection_exceptions_description">या साइटसाठी ट्रॅकिंग संरक्षण बंद आहे</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">सर्व साईट साठी चालू करा</string>
<!-- Text displayed when there are no exceptions -->
<string name="exceptions_empty_message_description">अपवाद आपल्याला निवडलेल्या साइटसाठी ट्रॅकिंग संरक्षण अक्षम करू देतात.</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">अधिक जाणा</string>
<!-- Description in Quick Settings that tells user tracking protection is off globally for all sites, and links to Settings to turn it on -->
<string name="preferences_tracking_protection_turned_off_globally">सर्व स्तरावर बंद, चालू करण्यासाठी सेटिंगवर जा.</string>
<!-- Preference switch for Telemetry -->
<string name="preferences_telemetry">दूरमापन</string>
<!-- Preference switch for usage and technical data collection -->
<string name="preference_usage_data">वापर आणि तांत्रिक माहिती</string>
<!-- Preference description for usage and technical data collection -->
<string name="preferences_usage_data_description">आम्ही %1$s उत्तमोत्तम बनवण्यासाठी ब्राऊझरची कार्यक्षमता, वापर, हार्डवेअर आणि सानुकूलन माहिती Mozilla सोबत शेअर करते</string>
<!-- Preference switch for marketing data collection -->
<string name="preferences_marketing_data">विपणनाची माहिती</string>
<!-- Preference description for marketing data collection, parameter is the app name (e.g. Firefox) -->
<string name="preferences_marketing_data_description">आपण %1$s मधील कोणती वैशिष्ठ्ये वापरता याची माहिती आमचे मोबाईल मार्केटर Leanplum यांच्यासोबत शेअर करते.</string>
<!-- Title for experiments preferences -->
<string name="preference_experiments">प्रयोग</string>
<!-- Summary for experiments preferences -->
<string name="preference_experiments_summary">Mozilla ला प्रायोगिक वैशिष्ट्ये स्थापित करण्यासाठी आणि माहिती गोळा करण्यासाठी अनुमती देते</string>
<!-- Preference switch for crash reporter -->
<string name="preferences_crash_reporter">क्रॅश अहवाल देणारा</string>
<!-- Preference switch for Mozilla location service -->
<string name="preferences_mozilla_location_service">Mozilla ची स्थान सेवा</string>
<!-- Preference switch for app health report. The first parameter is the name of the application (For example: Fenix) -->
<string name="preferences_fenix_health_report">%s आरोग्य अहवाल</string>
<!-- Turn On Sync Preferences -->
<!-- Header of the Turn on Sync preference view -->
<string name="preferences_sync">सिंक चालू करा</string>
<!-- Preference for pairing -->
<string name="preferences_sync_pair">डेस्कटॉप Firefox मध्ये जोडणी कोड स्कॅन करा</string>
<!-- Preference for account login -->
<string name="preferences_sync_sign_in">साइन इन करा</string>
<!-- Preference for reconnecting to FxA sync -->
<string name="preferences_sync_sign_in_to_reconnect">पुन्हा जोडण्यासाठी साइन इन करा</string>
<!-- Preference for removing FxA account -->
<string name="preferences_sync_remove_account">खाते काढून टाका</string>
@ -300,6 +364,8 @@
<string name="preference_light_theme">फिकट</string>
<!-- Preference for using dark theme -->
<string name="preference_dark_theme">गडद</string>
<!-- Preference for using using dark or light theme automatically set by battery -->
<string name="preference_auto_battery_theme">बॅटरी सेव्हरद्वारे सेट केलेले</string>
<!-- Preference for using following device theme -->
<string name="preference_follow_device_theme">डिव्हाइस थीमचे अनुसरण करा</string>
@ -308,10 +374,18 @@
<string name="library_sessions">सत्रे</string>
<!-- Option in Library to open Screenshots page -->
<string name="library_screenshots">स्क्रीनशॉट</string>
<!-- Option in Library to open Downloads page -->
<string name="library_downloads">डाउनलोड</string>
<!-- Option in library to open Bookmarks page -->
<string name="library_bookmarks">वाचनखुणा</string>
<!-- Option in library to open Desktop Bookmarks root page -->
<string name="library_desktop_bookmarks_root">डेस्कटॉप वाचनखूणा</string>
<!-- Option in library to open Desktop Bookmarks "menu" page -->
<string name="library_desktop_bookmarks_menu">वाचनखुणा मेनू</string>
<!-- Option in library to open Desktop Bookmarks "toolbar" page -->
<string name="library_desktop_bookmarks_toolbar">वाचनखूणा साधनपट्टी</string>
<!-- Option in library to open Desktop Bookmarks "unfiled" page -->
<string name="library_desktop_bookmarks_unfiled">इतर वाचनखूणा</string>
<!-- Option in Library to open History page -->
<string name="library_history">इतिहास</string>
<!-- Option in Library to open Reading List -->
@ -320,6 +394,10 @@
<string name="library_search">शोधा</string>
<!-- Library Page Title -->
<string name="library_title">लायब्ररी</string>
<!-- Settings Page Title -->
<string name="settings_title">सेटिंग</string>
<!-- Content description (not visible, for screen readers etc.): "Menu icon for items on a history item" -->
<string name="content_description_history_menu">इतिहास आयटम मेनू</string>
<!-- Content description (not visible, for screen readers etc.): "Close button for library settings" -->
<string name="content_description_close_button">बंद करा</string>
@ -341,12 +419,20 @@
<string name="open_tabs_menu">टॅबचा मेनू उघडा</string>
<!-- Open tabs menu item to close all tabs -->
<string name="tabs_menu_close_all_tabs">सर्व टॅब बंद करा</string>
<!-- Open tabs menu item to share all tabs -->
<string name="tabs_menu_share_tabs">टॅब शेअर करा</string>
<!-- Open tabs menu item to save tabs to collection -->
<string name="tabs_menu_save_to_collection">संग्रहात जतन करा</string>
<!-- Content description (not visible, for screen readers etc.): Opens the tab menu when pressed -->
<string name="tab_menu">टॅब मेनू</string>
<!-- Tab menu item to share the tab -->
<string name="tab_share">टॅब शेअर करा</string>
<!-- Button in the current session menu. Deletes the session when pressed -->
<string name="current_session_delete">नष्ट करा</string>
<!-- Button in the current session menu. Saves the session when pressed -->
<string name="current_session_save">जतन करा</string>
<!-- Button in the current session menu. Opens the share menu when pressed -->
<string name="current_session_share">शेअर करा</string>
<!-- Content description (not visible, for screen readers etc.): Title icon for current session menu -->
<string name="current_session_image">चालू सत्राचे चित्र</string>
<!-- Button to save the current set of tabs into a collection -->
@ -390,6 +476,8 @@
<!-- 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>
<!-- Description text displayed on the tab crash page -->
<string name="tab_crash_description">आपण खाली हा टॅब पुनर्संचयित किंवा बंद करण्याचा प्रयत्न करू शकता.</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 -->
@ -400,12 +488,20 @@
<!-- Content Description for session item menu button -->
<string name="content_description_session_menu">सत्र पर्याय</string>
<!-- Content Description for session item share button -->
<string name="content_description_session_share">सत्र शेअर करा</string>
<!-- Bookmarks -->
<!-- Content description for bookmarks library menu -->
<string name="bookmark_menu_content_description">वाचनखूणा मेनू</string>
<!-- Screen title for editing bookmarks -->
<string name="bookmark_edit">वाचनखूण संपादीत करा</string>
<!-- Screen title for selecting a bookmarks folder -->
<string name="bookmark_select_folder">फोल्डर निवडा</string>
<!-- Screen title for adding a bookmarks folder -->
<string name="bookmark_add_folder">फोल्डर जोडा</string>
<!-- deprecated: Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_created_snackbar">वाचनखुण बनवली.</string>
<!-- Snackbar title shown after a bookmark has been created. -->
<string name="bookmark_saved_snackbar">वाचनखुण जतन केली!</string>
<!-- Snackbar edit button shown after a bookmark has been created. -->
@ -433,6 +529,8 @@
<string name="edit_bookmark_fragment_title">वाचनखूण संपादीत करा</string>
<!-- Bookmark folder editing screen title -->
<string name="edit_bookmark_folder_fragment_title">फोल्डर संपादित करा</string>
<!-- Bookmark sign in button message -->
<string name="bookmark_sign_in_button">सिंक केलेल्या वाचनखुणा पाहण्यासाठी साइन इन करा</string>
<!-- Bookmark URL editing field label -->
<string name="bookmark_url_label">URL</string>
<!-- Bookmark FOLDER editing field label -->
@ -464,6 +562,10 @@
<string name="permissions_header">परवानग्या</string>
<!-- Button label that take the user to the Android App setting -->
<string name="phone_feature_go_to_settings">सेटिंग मध्ये जा</string>
<!-- Content description (not visible, for screen readers etc.): Quick settings sheet
to give users access to site specific information / settings. For example:
Secure settings status and a button to modify site permissions -->
<string name="quick_settings_sheet">द्रुत सेटिंग पत्रक</string>
<!-- Label that indicates that this option it the recommended one -->
<string name="phone_feature_recommended">शिफारसीय</string>
<!-- button that allows editing site permissions settings -->
@ -499,18 +601,8 @@
<!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">बंद</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked">व्हिडिओ आणि ऑडिओ अवरोधित</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed">व्हिडिओ आणि ऑडिओला परवानगी आहे</string>
<!-- Label that indicates that all video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed2">ऑडिओ आणि व्हिडिओला परवानगी द्या</string>
<!-- Label that indicates that video and audio autoplay is only allowed over WIFI -->
<string name="preference_option_autoplay_allowed_wifi_only">केवळ Wi-Fi वर ऑडिओ आणि व्हिडिओला अनुमती द्या</string>
<!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked -->
<string name="preference_option_autoplay_block_audio">ऑडिओ अवरोधित करा</string>
<!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked2">व्हिडिओ आणि ऑडिओ अवरोधित करा</string>
<!-- Summary of delete browsing data on quit preference if it is set to on -->
<string name="delete_browsing_data_quit_on">सुरू</string>
<!-- Summary of delete browsing data on quit preference if it is set to off -->
@ -606,6 +698,8 @@
<!-- Text shown in snackbar when user closes all private tabs -->
<string name="snackbar_private_tabs_closed">खाजगी टॅब बंद केले</string>
<!-- QR code scanner prompt dialog positive option to deny navigation to scanned link -->
<string name="qr_scanner_dialog_negative">नाकारा</string>
<!-- Tab collection deletion prompt dialog option to delete the collection -->
<string name="tab_collection_dialog_positive">हटवा</string>
<!-- Tab collection deletion prompt dialog option to cancel deleting the collection -->
@ -705,4 +799,162 @@
<!-- text for the theme picker onboarding card header -->
<string name="onboarding_theme_picker_header">आपली थीम निवडा</string>
</resources>
<!-- text for the theme picker onboarding card description -->
<string name="onboarding_theme_picker_description1">गडद रंगसंगती वापरून थोडी बॅटरी आणि तुमची दृष्टी वाचवा.</string>
<!-- Automatic theme setting (will follow device setting) -->
<string name="onboarding_theme_automatic_title">स्वयंचलित</string>
<!-- Theme setting for dark mode -->
<string name="onboarding_theme_dark_title">गडद रंगसंगती</string>
<!-- Text shown in snackbar when multiple tabs have been sent to device -->
<string name="sync_sent_tabs_snackbar">टॅब्स पाठवले!</string>
<!-- Text shown in snackbar when sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar">पाठविण्यात असमर्थ</string>
<!-- Text shown in snackbar for the "retry" action that the user has after sharing tabs failed -->
<string name="sync_sent_tab_error_snackbar_action">पुन्हा प्रयत्न करा</string>
<!-- 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>
<!-- Text shown for settings option for sign with email -->
<string name="sign_in_with_email">त्याऐवजी ईमेल वापरा</string>
<!-- Option to continue signing out of account shown in confirmation dialog to sign out of account -->
<string name="sign_out_disconnect">जोडणी तोडा</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">रद्द करा</string>
<!-- Enhanced Tracking Protection -->
<!-- Link displayed in enhanced tracking protection panel to access tracking protection settings -->
<string name="etp_settings">संरक्षण सेटिंग</string>
<!-- Preference title for enhanced tracking protection settings -->
<string name="preference_enhanced_tracking_protection">वर्धित ट्रॅकिंग संरक्षण</string>
<!-- Title for the description of enhanced tracking protection -->
<string name="preference_enhanced_tracking_protection_explanation_title">पाठलाग करून न घेता ब्राउझ करा</string>
<!-- 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_option">प्रमाणित</string>
<!-- Preference for enhanced tracking protection for the standard protection settings -->
<string name="preference_enhanced_tracking_protection_standard">प्रमाणित (सुचवलेले)</string>
<!-- Preference for enhanced tracking protection for the strict protection settings -->
<string name="preference_enhanced_tracking_protection_strict">काटेकोर</string>
<!-- Header for categories that are being blocked by current Enhanced Tracking Protection settings -->
<!-- Preference for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies">कुकीज</string>
<!-- Option for enhanced tracking protection for the custom protection settings for cookies-->
<string name="preference_enhanced_tracking_protection_custom_cookies_2">भेट न दिलेल्या संकेतस्थळांवरील कुकीज</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_1">सर्व टॅब मध्ये</string>
<!-- Option for enhanced tracking protection for the custom protection settings for tracking content-->
<string name="preference_enhanced_tracking_protection_custom_tracking_content_2">फक्त गोपनीय टॅब मध्ये</string>
<string name="enhanced_tracking_protection_blocked">अवरोधित</string>
<!-- Header for categories that are being not being blocked by current Enhanced Tracking Protection settings -->
<string name="enhanced_tracking_protection_allowed">अनुमती दिलेले</string>
<!-- Enhanced Tracking Protection message that protection is currently on for this site -->
<string name="etp_panel_on">या संकेतस्थळासाठी संरक्षण चालू आहे</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">आपले हक्क</string>
<!-- About page link text to open what's new link -->
<string name="about_whats_new">%s मध्ये नवीन काय आहे</string>
<!-- About page link text to open support link -->
<string name="about_support">मदत</string>
<!-- About page link text to open privacy notice link -->
<string name="about_privacy_notice">गोपनीयता सूचना</string>
<!-- About page link text to open know your rights link -->
<string name="about_know_your_rights">आपले हक्क जाणा</string>
<!-- About page link text to open licensing information link -->
<string name="about_licensing_information">अनुज्ञप्तीची माहिती</string>
<!-- Browser long press popup menu -->
<!-- Copy the current url -->
<string name="browser_toolbar_long_press_popup_copy">प्रत बनवा</string>
<!-- Paste & go the text in the clipboard. '&amp;' is replaced with the ampersand symbol: & -->
<string name="browser_toolbar_long_press_popup_paste_and_go">चिकटवा व जा</string>
<!-- Paste the text in the clipboard -->
<string name="browser_toolbar_long_press_popup_paste">चिकटवा</string>
<!-- Title text for the Add To Homescreen dialog -->
<string name="add_to_homescreen_title">मुख्य पटलावर जोडा</string>
<!-- Cancel button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_cancel">रद्द करा</string>
<!-- Add button text for the Add to Homescreen dialog -->
<string name="add_to_homescreen_add">जोडा</string>
<!-- Preference option for asking to save passwords in Fenix -->
<string name="preferences_passwords_save_logins_ask_to_save">जतन करण्याबद्दल विचारा</string>
<!-- Preference option for never saving passwords in Fenix -->
<string name="preferences_passwords_save_logins_never_save">कधीही जतन करू नका</string>
<!-- Preference for autofilling saved logins in Fenix -->
<string name="preferences_passwords_autofill">स्वयंचलितपणे भरा</string>
<!-- Syncing saved logins in Fenix is on -->
<string name="preferences_passwords_sync_logins_on">सुरू</string>
<!-- Syncing saved logins in Fenix is off -->
<string name="preferences_passwords_sync_logins_off">बंद करा</string>
<!-- Syncing saved logins in Fenix needs reconnect to sync -->
<string name="preferences_passwords_sync_logins_reconnect">पुनर्जोडणी करा</string>
<!-- Preference to access list of login exceptions that we never save logins for -->
<string name="preferences_passwords_exceptions">अपवाद</string>
<!-- Option to sort logins list A-Z, alphabetically -->
<string name="preferences_passwords_saved_logins_alphabetically">वर्णक्रमानुसार</string>
<!-- Option to sort logins list by most recently used -->
<string name="preferences_passwords_saved_logins_recently_used">अलीकडे वापरलेले</string>
<!-- The header for the site that a login is for -->
<string name="preferences_passwords_saved_logins_site">संकेतस्थळ</string>
<!-- The header for the username for a login -->
<string name="preferences_passwords_saved_logins_username">वापरकर्तानाव</string>
<!-- The header for the password for a login -->
<string name="preferences_passwords_saved_logins_password">पासवर्ड</string>
<!-- Message displayed in security prompt to reenter a secret pin to access saved logins -->
<string name="preferences_passwords_saved_logins_enter_pin">पिन पुन्हा प्रविष्ट करा</string>
<!-- Message displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning">ही जोडणी सुरक्षित नाही. येथे प्रविष्ट केलेल्या लॉगिनचा गैरवापर होऊ शकतो.</string>
<!-- Learn more link that will link to a page with more information displayed when a connection is insecure and we detect the user is entering a password -->
<string name="logins_insecure_connection_warning_learn_more">अधिक जाणा</string>
<!-- Positive confirmation that Fenix should save the new or updated login -->
<string name="logins_doorhanger_save_confirmation">जतन करा</string>
<!-- Negative confirmation that Fenix should not save the new or updated login -->
<string name="logins_doorhanger_save_dont_save">जतन करू नका</string>
<!-- Negative button to ignore warning dialog if users have no device authentication set up -->
<string name="logins_warning_dialog_later">नंतर</string>
<!-- Content description (not visible, for screen readers etc.): Title for the button to save a search engine in the action bar -->
<string name="search_engine_add_custom_search_engine_edit_button_content_description">जतन करा</string>
<!-- Text for the menu button to edit a search engine -->
<string name="search_engine_edit">संपादित करा</string>
<!-- Text for the menu button to delete a search engine -->
<string name="search_engine_delete">काढून टाका</string>
<!-- Text for the button to create a custom search engine on the Add search engine screen -->
<string name="search_add_custom_engine_label_other">इतर</string>
<!-- Placeholder text shown in the Search Engine Name TextField before a user enters text -->
<string name="search_add_custom_engine_name_hint">नाव</string>
<!-- Text for the button to learn more about adding a custom search engine -->
<string name="search_add_custom_engine_learn_more_label">अधिक जाणा</string>
<!-- Text on the disabled button while in progress. Placeholder replaced with app name -->
<string name="migration_updating_app_button_text">%s अद्ययावत करत आहोत…</string>
<!-- Text on the enabled button. Placeholder replaced with app name-->
<string name="migration_update_app_button">%s सुरु करा</string>
<!-- Accessibility description text for a completed migration item -->
<string name="migration_icon_description">स्थित्यंतर पूर्ण</string>
<!--Text on list of migrated items (e.g. Settings, History, etc.)-->
<string name="migration_text_passwords">पासवर्ड</string>
<!-- Heading for the instructions to allow a permission -->
<string name="phone_feature_blocked_intro">अनुमती देण्यासाठी:</string>
<!-- Label that indicates a site is using a secure connection -->
<string name="quick_settings_sheet_secure_connection">सुरक्षित जोडणी</string>
<!-- Label that indicates a site is using a insecure connection -->
<string name="quick_settings_sheet_insecure_connection">असुरक्षित जोडणी</string>
<!-- text shown before the issuer name to indicate who its verified by, parameter is the name of
the certificate authority that verified the ticket-->
<string name="certificate_info_verified_by">%1$s : द्वारे सत्यापित</string>
<!-- Login overflow menu delete button -->
<string name="login_menu_delete_button">काढून टाका</string>
<!-- Positive action of a dialog asking to delete -->
<string name="dialog_delete_positive">काढून टाका</string>
</resources>

View File

@ -67,7 +67,7 @@
<!-- Content description (not visible, for screen readers etc.): Un-bookmark the current page -->
<string name="browser_menu_edit_bookmark">ਬੁੱਕਮਾਰਕ ਸੋਧੋ</string>
<!-- Browser menu button that opens the addon manager -->
<string name="browser_menu_addon_manager">ਐਡ-ਆਨ ਮੈਨੇਜਰ</string>
<string name="browser_menu_add_ons">ਐਡ-ਆਨ</string>
<!-- Text displayed when there are no add-ons to be shown -->
<string name="no_add_ons">ਕੋਈ ਐਡ-ਆਨ ਨਹੀਂ ਹੈ</string>
<!-- Browser menu button that sends a user to help articles -->
@ -77,7 +77,7 @@
<!-- Browser menu button that opens the settings menu -->
<string name="browser_menu_settings">ਸੈਟਿੰਗਾਂ</string>
<!-- Browser menu button that opens a user's library -->
<string name="browser_menu_your_library">ਤੁਹਾਡੀ ਲਾਇਬਰੇਰੀ</string>
<string name="browser_menu_library">ਲਾਇਬਰੇਰੀ</string>
<!-- Browser menu toggle that requests a desktop site -->
<string name="browser_menu_desktop_site">ਡੈਸਕਟਾਪ ਸਾਈਟ</string>
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
@ -90,9 +90,9 @@
<string name="browser_menu_private_tab">ਪ੍ਰਾਈਵੇਟ ਟੈਬ</string>
<!-- Browser menu button that creates a new tab -->
<string name="browser_menu_new_tab">ਨਵੀਂ ਟੈਬ</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 opens a dialog to report issues with the current site -->
<string name="browser_menu_report_issue">ਸਾਈਟ ਮਸਲੇ ਬਾਰੇ ਰਿਪੋਰਟ ਕਰੋ</string>
<!-- Browser menu button that open a share menu to share the current site -->
@ -613,19 +613,12 @@
<!-- Summary of tracking protection preference if tracking protection is set to off -->
<string name="tracking_protection_off">ਬੰਦ</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked">ਵਿਡੀਓ ਤੇ ਆਡੀਓ ‘ਤੇ ਪਾਬੰਦੀ ਲਾਈ</string>
<!-- DEPRECATED: Label that indicates video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed">ਵਿਡੀਓ ਅਤੇ ਆਡੀਓ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</string>
<!-- Label that indicates that all video and audio autoplay is allowed -->
<string name="preference_option_autoplay_allowed2">ਆਡੀਓ ਅਤੇ ਵੀਡਿਓ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>
<!-- Label that indicates that video and audio autoplay is only allowed over WIFI -->
<string name="preference_option_autoplay_allowed_wifi_only">ਸਿਰਫ਼ Wi-Fi ਉੱਤੇ ਆਡੀਓ ਤੇ ਵੀਡਿਡ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>
<!-- Label that indicates that video autoplay is allowed, but audio autoplay is blocked -->
<string name="preference_option_autoplay_block_audio">ਆਡੀਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<string name="preference_option_autoplay_block_audio2">ਸਿਰਫ਼ ਆਡੀਓ ਉੱਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<!-- Label that indicates that all video and audio autoplay is blocked -->
<string name="preference_option_autoplay_blocked2">ਵੀਡਿਓ ਅਤੇ ਆਡੀਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<string name="preference_option_autoplay_blocked3">ਆਡੀਓ ਅਤੇ ਵੀਡਿਓ ਤੇ ਪਾਬੰਦੀ ਲਾਓ</string>
<!-- Summary of delete browsing data on quit preference if it is set to on -->
<string name="delete_browsing_data_quit_on">ਚਾਲੂ</string>
<!-- Summary of delete browsing data on quit preference if it is set to off -->
@ -1054,6 +1047,9 @@
<string name="etp_panel_off">ਇਸ ਸਾਈਟ ਲਈ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">ਇਹਨਾਂ ਵੈੱਬਸਾਈਟਾਂ ਲਈ ਵਧੇਰੇ ਟਰੈਕਿੰਗ ਸੁਰੱਖਿਆ ਬੰਦ ਹੈ</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">ਪਿੱਛੇ ਵੱਲ ਜਾਓ</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">ਤੁਹਾਡੇ ਹੱਕ</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1039,6 +1039,9 @@
<string name="etp_panel_off">As proteções estão DESATIVADAS neste site</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">A proteção aprimorada contra rastreamento está desativada nesses sites</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Voltar à página anterior</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Seus direitos</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1054,6 +1054,9 @@
<string name="etp_panel_off">Skydd är AV för den här webbplatsen</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Förbättrat spårningsskydd är avstängt för dessa webbplatser</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Navigera bakåt</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Dina rättigheter</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1032,6 +1032,9 @@
<string name="etp_panel_off">Bu sitede korumalar KAPALI</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Aşağıdaki sitelerde gelişmiş izlenme koruması kapatıldı</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Geri git</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Haklarınız</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1052,6 +1052,9 @@
<string name="etp_panel_off">Захист на цьому сайті вимкнено</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">Розширений захист від стеження вимкнено для цих вебсайтів</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">Перейти назад</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">Ваші права</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1074,6 +1074,9 @@
<string name="etp_panel_off">对此网站已关闭保护</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">对下列网站已关闭增强型跟踪保护</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">浏览上一页</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">您的权利</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -1068,6 +1068,9 @@
<string name="etp_panel_off">已關閉此網站的追蹤保護</string>
<!-- Header for exceptions list for which sites enhanced tracking protection is always off -->
<string name="enhanced_tracking_protection_exceptions">針對下列網站關閉加強型追蹤保護</string>
<!-- Content description (not visible, for screen readers etc.): Navigate
back from ETP details (Ex: Tracking content) -->
<string name="etp_back_button_content_description">瀏覽上一頁</string>
<!-- About page Your rights link text -->
<string name="about_your_rights">您的權利</string>
<!-- About page link text to open open source licenses screen -->

View File

@ -38,6 +38,8 @@
<string name="pref_key_account" translatable="false">pref_key_account</string>
<string name="pref_key_sign_in" translatable="false">pref_key_sign_in</string>
<string name="pref_key_account_auth_error" translatable="false">pref_key_account_auth_error</string>
<string name="pref_key_override_fxa_server" translatable="false">pref_key_override_fxa_server</string>
<string name="pref_key_override_sync_tokenserver" translatable="false">pref_key_override_sync_tokenserver</string>
<string name="pref_key_private_mode" translatable="false">pref_key_private_mode</string>
<string name="pref_key_customize" translatable="false">pref_key_customize</string>
<string name="pref_key_toolbar" translatable="false">pref_key_toolbar</string>

View File

@ -202,6 +202,12 @@
<string name="preferences_add_private_browsing_shortcut">Add private browsing shortcut</string>
<!-- Preference for accessibility -->
<string name="preferences_accessibility">Accessibility</string>
<!-- Preference to override the Firefox Account server -->
<string name="preferences_override_fxa_server">Custom Firefox Account server</string>
<!-- Preference to override the Sync token server -->
<string name="preferences_override_sync_tokenserver">Custom Sync server</string>
<!-- Toast shown after updating the FxA/Sync server override preferences -->
<string name="toast_override_fxa_sync_server_done">Firefox Account/Sync server modified. Quitting the application to apply changes…</string>
<!-- Preference category for account information -->
<string name="preferences_category_account">Account</string>
<!-- Preference shown on banner to sign into account -->
@ -1062,6 +1068,10 @@
<string name="about_licensing_information">Licensing information</string>
<!-- About page link text to open a screen with libraries that are used -->
<string name="about_other_open_source_libraries">Libraries that we use</string>
<!-- Toast shown to the user when they are activating the secret dev menu
The first parameter is number of long clicks left to enable the menu -->
<string name="about_debug_menu_toast_progress">Debug menu: %1$d click(s) left to enable</string>
<string name="about_debug_menu_toast_done">Debug menu enabled</string>
<!-- Content description of the tab counter toolbar button when one tab is open -->
<string name="tab_counter_content_description_one_tab">1 tab</string>

View File

@ -29,6 +29,20 @@
android:key="@string/pref_key_account_auth_error"/>
</androidx.preference.PreferenceCategory>
<androidx.preference.EditTextPreference
android:key="@string/pref_key_override_fxa_server"
android:title="@string/preferences_override_fxa_server"
android:inputType="textUri"
app:iconSpaceReserved="false"
app:isPreferenceVisible="false"/>
<androidx.preference.EditTextPreference
android:key="@string/pref_key_override_sync_tokenserver"
android:title="@string/preferences_override_sync_tokenserver"
android:inputType="textUri"
app:iconSpaceReserved="false"
app:isPreferenceVisible="false"/>
<androidx.preference.PreferenceCategory
android:title="@string/preferences_category_general"
app:iconSpaceReserved="false">
@ -103,13 +117,6 @@
android:key="@string/pref_key_open_links_in_external_app"
android:title="@string/preferences_open_links_in_apps" />
<androidx.preference.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_info"
android:key="@string/pref_key_leakcanary"
android:title="@string/preference_leakcanary"
app:isPreferenceVisible="@bool/IS_DEBUG" />
</androidx.preference.PreferenceCategory>
<PreferenceCategory
@ -120,11 +127,14 @@
android:icon="@drawable/mozac_ic_extensions_black"
android:key="@string/pref_key_addons"
android:title="@string/preferences_addons" />
</PreferenceCategory>
<PreferenceCategory
android:title="@string/developer_tools_category"
app:iconSpaceReserved="false">
<androidx.preference.SwitchPreference
android:defaultValue="false"
android:icon="@drawable/ic_info"
android:key="@string/pref_key_leakcanary"
android:title="@string/preference_leakcanary"
app:isPreferenceVisible="@bool/IS_DEBUG" />
<androidx.preference.SwitchPreference
android:icon="@drawable/ic_energy"
android:key="@string/pref_key_remote_debugging"

View File

@ -38,20 +38,6 @@ class AboutPageAdapterTest {
)
private val listener: AboutPageListener = mockk(relaxed = true)
@Test
fun `updateData should set the new data and call notifyDataSetChanged()`() {
val adapter = spyk(AboutPageAdapter(listener), recordPrivateCalls = true)
every { adapter.notifyDataSetChanged() } just Runs
adapter.updateData(aboutList)
// Wasn't able to test in verify block the 'adapter.aboutList' setter from the updateData method
assertThat(adapter.aboutList).isEqualTo(aboutList)
verify {
adapter.notifyDataSetChanged()
}
}
@Test
fun `getItemCount on a default instantiated Adapter should return 0`() {
val adapter = AboutPageAdapter(listener)
@ -63,7 +49,7 @@ class AboutPageAdapterTest {
fun `getItemCount after updateData() call should return the correct list size`() {
val adapter = AboutPageAdapter(listener)
adapter.updateData(aboutList)
adapter.submitList(aboutList)
assertThat(adapter.itemCount).isEqualTo(2)
}
@ -93,9 +79,9 @@ class AboutPageAdapterTest {
} returns viewHolder
every { viewHolder.bind(any()) } just Runs
adapter.updateData(aboutList)
adapter.submitList(aboutList)
adapter.bindViewHolder(viewHolder, 1)
verify { viewHolder.bind(adapter.aboutList?.get(1) as AboutPageItem.Item) }
verify { viewHolder.bind(aboutList[1] as AboutPageItem.Item) }
}
}

View File

@ -79,7 +79,7 @@ elif [[ "${device_type}" == "x86-start-test" ]]; then
elif [[ "${device_type}" == "arm-start-test" ]]; then
flank_template="${PATH_TEST}/flank-armeabi-v7a-start-test.yml"
else
echo "NOT FOUND"
echo "FAILURE: flank config file not found!"
exitcode=1
fi
@ -95,7 +95,7 @@ function failure_check() {
echo
echo
if [[ $exitcode -ne 0 ]]; then
echo "ERROR: UI test run failed, please check above URL"
echo "FAILURE: UI test run failed, please check above URL"
else
echo "All UI test(s) have passed!"
fi